)]}'
{"doc/source/topics/settings.rst":[{"author":{"_account_id":6763,"name":"jingliuqing","email":"jing.liuqing@99cloud.net","username":"jing"},"change_message_id":"28ad1595908e73c6fe10b4e7384c2a197c1f7a67","unresolved":false,"context_lines":[{"line_number":636,"context_line":"The ``config_drive`` setting specifies the default value for the Configuration"},{"line_number":637,"context_line":"Drive property."},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD"},{"line_number":640,"context_line":"The ``enable_scheduler_hints`` setting specifies whether or not Scheduler Hints"},{"line_number":641,"context_line":"can be provided when launching an instance."},{"line_number":642,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":47,"id":"dab17558_fb06281a","line":639,"updated":"2016-05-17 23:23:40.000000000","message":"conflict?","commit_id":"c7de1fef681d113502bbcf34cc0f32b5fa840523"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"35f5c4e113d5826923d285240338c8999c63d889","unresolved":false,"context_lines":[{"line_number":642,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":643,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"The ``disable_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":646,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"The ``disable_volume`` setting disables Volumes/Volume Snapshots as valid boot"}],"source_content_type":"text/x-rst","patch_set":48,"id":"7aa08908_33fe47ae","line":645,"range":{"start_line":645,"start_character":42,"end_line":645,"end_character":51},"updated":"2016-06-08 14:35:49.000000000","message":"I would change it to Instance Snapshots, to reduce confusion with Volume Snapshots which are ruled by the next setting.","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"c833783530cc3adc9dcffb57b803d28bd629140c","unresolved":false,"context_lines":[{"line_number":642,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":643,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"The ``disable_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":646,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"The ``disable_volume`` setting disables Volumes/Volume Snapshots as valid boot"}],"source_content_type":"text/x-rst","patch_set":48,"id":"7aa08908_99091134","line":645,"in_reply_to":"7aa08908_33fe47ae","updated":"2016-06-14 14:03:44.000000000","message":"Done","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"3547959ec00f741d167d6951069c6a8cb042a20f","unresolved":false,"context_lines":[{"line_number":626,"context_line":"        \"config_drive\": False,"},{"line_number":627,"context_line":"        \"enable_scheduler_hints\": True"},{"line_number":628,"context_line":"        \"disable_image\": False,"},{"line_number":629,"context_line":"        \"disable_snapshot\": False,"},{"line_number":630,"context_line":"        \"disable_volume\": False,"},{"line_number":631,"context_line":"    }"},{"line_number":632,"context_line":""}],"source_content_type":"text/x-rst","patch_set":51,"id":"7aa08908_9dc6fd65","line":629,"updated":"2016-06-15 00:20:50.000000000","message":"This setting doesn\u0027t align with the doc below.  Should be disable instance_snapshot.","commit_id":"35f47e1c84f3eea8f98b1032162ca57d38159099"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"45d3190977207b24ff2f5cfbed1fa7af95a64184","unresolved":false,"context_lines":[{"line_number":626,"context_line":"        \"config_drive\": False,"},{"line_number":627,"context_line":"        \"enable_scheduler_hints\": True"},{"line_number":628,"context_line":"        \"disable_image\": False,"},{"line_number":629,"context_line":"        \"disable_snapshot\": False,"},{"line_number":630,"context_line":"        \"disable_volume\": False,"},{"line_number":631,"context_line":"    }"},{"line_number":632,"context_line":""}],"source_content_type":"text/x-rst","patch_set":51,"id":"7aa08908_2b0e8e32","line":629,"in_reply_to":"7aa08908_9dc6fd65","updated":"2016-06-15 10:26:55.000000000","message":"Done","commit_id":"35f47e1c84f3eea8f98b1032162ca57d38159099"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"3547959ec00f741d167d6951069c6a8cb042a20f","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        \"enable_scheduler_hints\": True"},{"line_number":628,"context_line":"        \"disable_image\": False,"},{"line_number":629,"context_line":"        \"disable_snapshot\": False,"},{"line_number":630,"context_line":"        \"disable_volume\": False,"},{"line_number":631,"context_line":"    }"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"A dictionary of settings which can be used to provide the default values for"}],"source_content_type":"text/x-rst","patch_set":51,"id":"7aa08908_5d7e5519","line":630,"updated":"2016-06-15 00:20:50.000000000","message":"I won\u0027t require it in this patch, but I do wonder if disable_volume_snapshot should added.","commit_id":"35f47e1c84f3eea8f98b1032162ca57d38159099"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"45d3190977207b24ff2f5cfbed1fa7af95a64184","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        \"enable_scheduler_hints\": True"},{"line_number":628,"context_line":"        \"disable_image\": False,"},{"line_number":629,"context_line":"        \"disable_snapshot\": False,"},{"line_number":630,"context_line":"        \"disable_volume\": False,"},{"line_number":631,"context_line":"    }"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"A dictionary of settings which can be used to provide the default values for"}],"source_content_type":"text/x-rst","patch_set":51,"id":"7aa08908_ab76fea0","line":630,"in_reply_to":"7aa08908_5d7e5519","updated":"2016-06-15 10:26:55.000000000","message":"Good point.... this would require more changes on the code, but maybe it should be done directly on this patch as its a new feature, changing it down the line feels a bit wrong instead of trying to get it rigth from the start.","commit_id":"35f47e1c84f3eea8f98b1032162ca57d38159099"},{"author":{"_account_id":12826,"name":"Rob Cresswell","display_name":"robcresswell","email":"robert.cresswell@outlook.com","username":"rob-cresswell"},"change_message_id":"9af79cf720d76f802130cf97d6a8900b6b739912","unresolved":false,"context_lines":[{"line_number":619,"context_line":"----------------------------"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":".. versionadded:: 9.0.0(Mitaka)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"Default::"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":58,"id":"1aa78d24_1f050110","line":622,"updated":"2016-07-07 09:45:02.000000000","message":"We should add some kind of tag to indicate this has been updated/extended for Newton.","commit_id":"22585b0cc191cbf870e5b1628741bc89efdbccc2"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"2fef1e4c01909b7052f30ae99305f9993df99d36","unresolved":false,"context_lines":[{"line_number":619,"context_line":"----------------------------"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":".. versionadded:: 9.0.0(Mitaka)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"Default::"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":58,"id":"bacf61ea_94c2b7e7","line":622,"in_reply_to":"1aa78d24_1f050110","updated":"2016-08-04 20:32:35.000000000","message":"Done","commit_id":"22585b0cc191cbf870e5b1628741bc89efdbccc2"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":651,"context_line":"The ``enable_scheduler_hints`` setting specifies whether or not Scheduler Hints"},{"line_number":652,"context_line":"can be provided when launching an instance."},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_2e5a1d84","line":654,"range":{"start_line":654,"start_character":46,"end_line":654,"end_character":54},"updated":"2016-08-08 15:42:04.000000000","message":"\u0027as a valid\u0027","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":651,"context_line":"The ``enable_scheduler_hints`` setting specifies whether or not Scheduler Hints"},{"line_number":652,"context_line":"can be provided when launching an instance."},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_ec864864","line":654,"range":{"start_line":654,"start_character":46,"end_line":654,"end_character":54},"in_reply_to":"9ad45d7e_2e5a1d84","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":652,"context_line":"can be provided when launching an instance."},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_ae4e0dbf","line":655,"range":{"start_line":655,"start_character":11,"end_line":655,"end_character":31},"updated":"2016-08-08 15:42:04.000000000","message":"\u0027Image sources won\u0027t\u0027","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":652,"context_line":"can be provided when launching an instance."},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_2c81804b","line":655,"range":{"start_line":655,"start_character":11,"end_line":655,"end_character":31},"in_reply_to":"9ad45d7e_ae4e0dbf","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":654,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_eec64515","line":657,"range":{"start_line":657,"start_character":61,"end_line":657,"end_character":69},"updated":"2016-08-08 15:42:04.000000000","message":"\u0027as a valid\u0027","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":654,"context_line":"The ``disable_image`` setting disables Images as valid boot source for launching"},{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_8c96ac92","line":657,"range":{"start_line":657,"start_character":61,"end_line":657,"end_character":69},"in_reply_to":"9ad45d7e_eec64515","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"},{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_2ed17dce","line":658,"range":{"start_line":658,"start_character":38,"end_line":658,"end_character":45},"updated":"2016-08-08 15:42:04.000000000","message":"\u0027won\u0027t\u0027","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":655,"context_line":"instances. Images sources wont show up in the Launch Instance modal."},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"},{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_6c9378a4","line":658,"range":{"start_line":658,"start_character":38,"end_line":658,"end_character":45},"in_reply_to":"9ad45d7e_2ed17dce","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"},{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"},{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_ce64214b","line":660,"range":{"start_line":660,"start_character":48,"end_line":660,"end_character":51},"updated":"2016-08-08 15:42:04.000000000","message":"\u0027as a\u0027","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":657,"context_line":"The ``disable_instance_snapshot`` setting disables Snapshots as valid boot source for"},{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"},{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"},{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_cc90a498","line":660,"range":{"start_line":660,"start_character":48,"end_line":660,"end_character":51},"in_reply_to":"9ad45d7e_ce64214b","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"},{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"},{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"The ``disable_volume_snapshot`` setting disables Volume Snapshots as valid boot"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_2e833dce","line":661,"range":{"start_line":661,"start_character":48,"end_line":661,"end_character":52},"updated":"2016-08-08 15:42:04.000000000","message":"won\u0027t","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":658,"context_line":"launching instances. Snapshots sources wont show up in the Launch Instance modal."},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"The ``disable_volume`` setting disables Volumes as valid boot"},{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"},{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"The ``disable_volume_snapshot`` setting disables Volume Snapshots as valid boot"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_0ce91c1b","line":661,"range":{"start_line":661,"start_character":48,"end_line":661,"end_character":52},"in_reply_to":"9ad45d7e_2e833dce","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"},{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"The ``disable_volume_snapshot`` setting disables Volume Snapshots as valid boot"},{"line_number":665,"context_line":"source for launching instances. Volume Snapshots sources wont show up"},{"line_number":666,"context_line":"in the Launch Instance modal."},{"line_number":667,"context_line":""}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_eeeda58f","line":664,"range":{"start_line":664,"start_character":66,"end_line":664,"end_character":73},"updated":"2016-08-08 15:42:04.000000000","message":"as a valid","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":661,"context_line":"source for launching instances. Volumes sources wont show up"},{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"The ``disable_volume_snapshot`` setting disables Volume Snapshots as valid boot"},{"line_number":665,"context_line":"source for launching instances. Volume Snapshots sources wont show up"},{"line_number":666,"context_line":"in the Launch Instance modal."},{"line_number":667,"context_line":""}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_eceda826","line":664,"range":{"start_line":664,"start_character":66,"end_line":664,"end_character":73},"in_reply_to":"9ad45d7e_eeeda58f","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"The ``disable_volume_snapshot`` setting disables Volume Snapshots as valid boot"},{"line_number":665,"context_line":"source for launching instances. Volume Snapshots sources wont show up"},{"line_number":666,"context_line":"in the Launch Instance modal."},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"``LAUNCH_INSTANCE_NG_ENABLED``"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_ee7805fb","line":665,"range":{"start_line":665,"start_character":57,"end_line":665,"end_character":61},"updated":"2016-08-08 15:42:04.000000000","message":"won\u0027t","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":662,"context_line":"in the Launch Instance modal."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"The ``disable_volume_snapshot`` setting disables Volume Snapshots as valid boot"},{"line_number":665,"context_line":"source for launching instances. Volume Snapshots sources wont show up"},{"line_number":666,"context_line":"in the Launch Instance modal."},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"``LAUNCH_INSTANCE_NG_ENABLED``"}],"source_content_type":"text/x-rst","patch_set":61,"id":"9ad45d7e_4cf3140b","line":665,"range":{"start_line":665,"start_character":57,"end_line":665,"end_character":61},"in_reply_to":"9ad45d7e_ee7805fb","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"}],"openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js":[{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"76336984f94964f1f585ed786964e13c155bb723","unresolved":false,"context_lines":[{"line_number":381,"context_line":"      return glanceAPI.getImages({status:\u0027active\u0027}).then(onGetImages);"},{"line_number":382,"context_line":"    }"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    function getSnapshots() {"},{"line_number":385,"context_line":"      return glanceAPI.getImages({status:\u0027active\u0027}).then(onGetSnapshots);"},{"line_number":386,"context_line":"    }"},{"line_number":387,"context_line":""}],"source_content_type":"text/javascript","patch_set":7,"id":"3a57f1b5_5eea92ad","line":384,"updated":"2016-02-11 19:31:22.000000000","message":"This actually now means glance is called twice and everything is retrieved with client side filtering applied. Two things to explore:\n\n1) See if you can pass a filter through to the call so that only snapshots are pulled here and only images are pulled above.\n\n2) Change getImages code to just use setings.getSettings and operated on the data directly.\n\n  settingsService.getSettings().then(onGetSettings)\n\n  onGetSettings(settings) {\n    if (settings.blahBlahBlah) {\n       ???\n   }\n  }\n\nOr perhaps getSetting.  Maybe put both the settings into an object with $q.all:\n\nhttps://github.com/openstack/horizon/blob/master/openstack_dashboard/static/app/core/openstack-service-api/settings.service.js#L115-L121\n\n      $q.all(\n        {\n          images: userSession.getSetting(\u003cimageSetting\u003e)\n          snapshots: userSession.get(\u003csnapshotSetting\u003e)\n        }\n        ).then(function (enabled) { if(enabled.images || enabled.snapshots) {\n               glanceAPI.getImages({status:\u0027active\u0027})\n               .then( function(enabled) { somethingMagicalWithClosures?? } )\n          }\n\nE.g. like how this uses it\nhttps://github.com/openstack/horizon/blob/master/openstack_dashboard/static/app/core/images/table/images.controller.js#L78","commit_id":"eb30fc8af4a40f8f46ee17812516e96b8927e4ce"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"0024fa16676594993a77c70ca8059ee3d2c6e920","unresolved":false,"context_lines":[{"line_number":381,"context_line":"      return glanceAPI.getImages({status:\u0027active\u0027}).then(onGetImages);"},{"line_number":382,"context_line":"    }"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    function getSnapshots() {"},{"line_number":385,"context_line":"      return glanceAPI.getImages({status:\u0027active\u0027}).then(onGetSnapshots);"},{"line_number":386,"context_line":"    }"},{"line_number":387,"context_line":""}],"source_content_type":"text/javascript","patch_set":7,"id":"3a57f1b5_deb2e9e4","line":384,"in_reply_to":"3a57f1b5_5eea92ad","updated":"2016-02-12 09:08:00.000000000","message":"Indeed you are right. Let me have a look at how $q.all works because I have no idea about it.","commit_id":"eb30fc8af4a40f8f46ee17812516e96b8927e4ce"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"952bb8835e2f0fb48f4d12fbd2369e0f467c3a49","unresolved":false,"context_lines":[{"line_number":381,"context_line":"      return glanceAPI.getImages({status:\u0027active\u0027}).then(onGetImages);"},{"line_number":382,"context_line":"    }"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    function getSnapshots() {"},{"line_number":385,"context_line":"      return glanceAPI.getImages({status:\u0027active\u0027}).then(onGetSnapshots);"},{"line_number":386,"context_line":"    }"},{"line_number":387,"context_line":""}],"source_content_type":"text/javascript","patch_set":7,"id":"3a57f1b5_80715546","line":384,"in_reply_to":"3a57f1b5_deb2e9e4","updated":"2016-02-12 16:47:54.000000000","message":"Done","commit_id":"eb30fc8af4a40f8f46ee17812516e96b8927e4ce"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"73b155ad06fd1ce1291d1f79078951d410c57fc4","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        promise \u003d $q.all(["},{"line_number":202,"context_line":"          // enable or disable boot sources"},{"line_number":203,"context_line":"          settings.getSetting(\u0027OPENSTACK_SOURCE_BOOT\u0027).then( function(setting) {"},{"line_number":204,"context_line":"            if (setting.enable_image || setting.enable_snapshot) {"},{"line_number":205,"context_line":"              glanceAPI.getImages({status:\u0027active\u0027}).then(function (data) {"},{"line_number":206,"context_line":"                if (setting.enable_image) {"}],"source_content_type":"text/javascript","patch_set":10,"id":"3a57f1b5_02e2462f","line":203,"updated":"2016-02-12 18:14:59.000000000","message":"Please put this down in helper function like getImages was previously to keep the $q.all readable. And consider using named sub top level functions within rather than so many anonymous functions. This makes it very daunting to look at and very hard to decipher.\n\nI\u0027m still not sure about the setting name... but I can see why it may not belong in LAUNCH_INSTANCE_DEFAULT\n\nIf we leave at top level (and not in LAUNCH_INSTANCE_DEFAULT,  then OPENSTACK_BOOT_SOURCE reads a little better than OPENSTACK_SOURCE_BOOT","commit_id":"70f9d71946222de19b1f63e83be48b8b83009fde"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"a95611b4cd21238a8d3364fd7e2dbd596268a921","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        promise \u003d $q.all(["},{"line_number":202,"context_line":"          // enable or disable boot sources"},{"line_number":203,"context_line":"          settings.getSetting(\u0027OPENSTACK_SOURCE_BOOT\u0027).then( function(setting) {"},{"line_number":204,"context_line":"            if (setting.enable_image || setting.enable_snapshot) {"},{"line_number":205,"context_line":"              glanceAPI.getImages({status:\u0027active\u0027}).then(function (data) {"},{"line_number":206,"context_line":"                if (setting.enable_image) {"}],"source_content_type":"text/javascript","patch_set":10,"id":"3a57f1b5_f6ac888d","line":203,"in_reply_to":"3a57f1b5_0253263a","updated":"2016-02-12 19:54:46.000000000","message":"Well, there are a few ways that could be done. Nested functions, some binding magic... here is one possible way (note - I just created an example using the current defaults setting):\n\nhttp://paste.openstack.org/show/486874/\n\nThere might be a more elegant way as well that somebody else might know.","commit_id":"70f9d71946222de19b1f63e83be48b8b83009fde"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"9d06e5286f285755f320d7b4f10278a32b7fefd3","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        promise \u003d $q.all(["},{"line_number":202,"context_line":"          // enable or disable boot sources"},{"line_number":203,"context_line":"          settings.getSetting(\u0027OPENSTACK_SOURCE_BOOT\u0027).then( function(setting) {"},{"line_number":204,"context_line":"            if (setting.enable_image || setting.enable_snapshot) {"},{"line_number":205,"context_line":"              glanceAPI.getImages({status:\u0027active\u0027}).then(function (data) {"},{"line_number":206,"context_line":"                if (setting.enable_image) {"}],"source_content_type":"text/javascript","patch_set":10,"id":"3a57f1b5_0253263a","line":203,"in_reply_to":"3a57f1b5_02e2462f","updated":"2016-02-12 18:26:20.000000000","message":"Im actually having some issues with this because I need to pass the enable into the scope that checks for getImages but without doing with no anonymous functions I have no idea how. This promise chaining thing is a bit confusing :(\n\nIm still working on it, hopefully I\u0027ll get to it soon-ish :D","commit_id":"70f9d71946222de19b1f63e83be48b8b83009fde"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"e0c260a31f7a84568dfc79c4310625c22f8f62b1","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        model.allowedBootSources.length \u003d 0;"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        promise \u003d $q.all(["},{"line_number":202,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then( enableBootSources, noop),"},{"line_number":203,"context_line":"          novaAPI.getAvailabilityZones().then(onGetAvailabilityZones, noop),"},{"line_number":204,"context_line":"          novaAPI.getFlavors(true, true).then(onGetFlavors, noop),"},{"line_number":205,"context_line":"          novaAPI.getKeypairs().then(onGetKeypairs, noop),"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_e0615713","line":202,"updated":"2016-02-19 05:31:16.000000000","message":"extra whitespace in parens","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"eafc25d5332b3b577593ed347b8ba086e535383d","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        model.allowedBootSources.length \u003d 0;"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        promise \u003d $q.all(["},{"line_number":202,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then( enableBootSources, noop),"},{"line_number":203,"context_line":"          novaAPI.getAvailabilityZones().then(onGetAvailabilityZones, noop),"},{"line_number":204,"context_line":"          novaAPI.getFlavors(true, true).then(onGetFlavors, noop),"},{"line_number":205,"context_line":"          novaAPI.getKeypairs().then(onGetKeypairs, noop),"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_0fa0e3a4","line":202,"in_reply_to":"dae33548_e0615713","updated":"2016-02-19 08:31:34.000000000","message":"Done","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"e0c260a31f7a84568dfc79c4310625c22f8f62b1","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    // Boot Source"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    function enableBootSources(config) {"},{"line_number":385,"context_line":"      // in case settings are deleted or not present"},{"line_number":386,"context_line":"      // Note(Itxaka): angular.isUndefined does not work here"},{"line_number":387,"context_line":"      /*eslint-disable angular/definedundefined */"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_6071c777","line":384,"updated":"2016-02-19 05:31:16.000000000","message":"This function is elegant in code, but there is a subtle difference in the programming here and effect that this has. And it is a little confusing and I think I think we could potentially re-write some of this, but I\u0027m not sure because there is cross dependencies in the data and validation.  Honestly, maybe we should test it out somehow and prove that this wouldn\u0027t be a problem. On a devstack (or RDO?), its pretty hard to actually observe the effects.\n\nAnyway, here\u0027s the difference, this change now causes onInitSuccess to run before all the data is retrieved. On master, ALL of the data is retrieved before onInitSuccess is called. This is because the current code on master returns a promise to the $q.all. Same for getNetworks.  Note the difference in the naming. \"on\"GetImages vs getImages (returns promise).\n\nWhy is this important? Because this is a factory:\n\nhttps://github.com/openstack/horizon/blob/fbaa7a53f9c5153d3382e07b62947679c10d6d9e/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js#L17\n\nin angular both factories and services are singletons, which means all the data here is shared across asynchronous calls. If you were to click launch instance, then cancel and click launch instance again very quickly, you\u0027d basically get a non-deterministic result of what data is loaded and don\u0027t know when it is loaded.  If one call takes 5 seconds and the rest take 1 second, the calls would be made multiple times and the asynchronous callbacks may happen multiple times.  This in itself is not something I\u0027m actually sure would be a problem on its own. There are a few pros and cons:\n\nthe whole launch instance wizard may load faster and the data would populate as it comes in. However, what may be a problem is that each of the steps receiving the data may intake their data and display results differently. Most of the steps bind their data directly to the model.  However the flavor step does something differently and I\u0027m not sure what might happen.\n\nBut basically, the following if block ensures that everything in $q.all completes before all of the steps load. \n\nhttps://github.com/openstack/horizon/blob/fbaa7a53f9c5153d3382e07b62947679c10d6d9e/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js#L184-L196\n\nIf the previous time the launch instance was launched isn\u0027t yet done initializing, it will just return the previous promise (and not go get images again).\n\nhttps://github.com/openstack/horizon/blob/2cf815c217ec2e9c68faa4ca79d0a00f8e2c248b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-wizard.controller.js#L34","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"eafc25d5332b3b577593ed347b8ba086e535383d","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    // Boot Source"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    function enableBootSources(config) {"},{"line_number":385,"context_line":"      // in case settings are deleted or not present"},{"line_number":386,"context_line":"      // Note(Itxaka): angular.isUndefined does not work here"},{"line_number":387,"context_line":"      /*eslint-disable angular/definedundefined */"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_ef077f7f","line":384,"in_reply_to":"dae33548_6071c777","updated":"2016-02-19 08:31:34.000000000","message":"Thanks for the explanation, not sure I understand everything correctly but I assume that with the return added below, now everything is a promise so it will wait for everything to be resolved to call the onInitSuccess?","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"e0c260a31f7a84568dfc79c4310625c22f8f62b1","unresolved":false,"context_lines":[{"line_number":391,"context_line":"      var enabledImage \u003d (allEnabled || !config.disable_image);"},{"line_number":392,"context_line":"      var enabledSnapshot \u003d (allEnabled || !config.disable_snapshot);"},{"line_number":393,"context_line":"      var enabledVolume \u003d (allEnabled || !config.disable_volume);"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"      if (enabledImage || enabledSnapshot) {"},{"line_number":396,"context_line":"        glanceAPI.getImages({status: \u0027active\u0027}).then(function (data) {"},{"line_number":397,"context_line":"          if (enabledImage) {"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_6312715a","line":394,"updated":"2016-02-19 05:31:16.000000000","message":"Given all of the above I said... I think you can just have this if block return the .then() promise created on line 396 and add an else that returns essentially a no-op promise.  e.g. line 404 is start of else that just has:\n\n return $q.when(\u0027not-enabled\u0027);","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"eafc25d5332b3b577593ed347b8ba086e535383d","unresolved":false,"context_lines":[{"line_number":391,"context_line":"      var enabledImage \u003d (allEnabled || !config.disable_image);"},{"line_number":392,"context_line":"      var enabledSnapshot \u003d (allEnabled || !config.disable_snapshot);"},{"line_number":393,"context_line":"      var enabledVolume \u003d (allEnabled || !config.disable_volume);"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"      if (enabledImage || enabledSnapshot) {"},{"line_number":396,"context_line":"        glanceAPI.getImages({status: \u0027active\u0027}).then(function (data) {"},{"line_number":397,"context_line":"          if (enabledImage) {"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_ef8bff1c","line":394,"in_reply_to":"dae33548_6312715a","updated":"2016-02-19 08:31:34.000000000","message":"I did add this, hopefully this means that now everything is a promise so it will have to be resolved on the q.all?","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"e0c260a31f7a84568dfc79c4310625c22f8f62b1","unresolved":false,"context_lines":[{"line_number":402,"context_line":"          }"},{"line_number":403,"context_line":"        });"},{"line_number":404,"context_line":"      }"},{"line_number":405,"context_line":"      if (enabledVolume) {"},{"line_number":406,"context_line":"        serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":407,"context_line":"      }"},{"line_number":408,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_433dadba","line":405,"updated":"2016-02-19 05:31:16.000000000","message":"settings and service catalog both use caching. so although it feels more natural, there is very little performance benefit to nesting this here. although i like the thought here, this now groups multiple promises together complicating the whole asynchronous stuff I mentioned above. if you leave this how it was, then you don\u0027t have to worry about that. If you don\u0027t, then what happens when more defaults are added and soon every single service is nested in here?\n\nhttps://github.com/openstack/horizon/blob/2cf815c217ec2e9c68faa4ca79d0a00f8e2c248b/openstack_dashboard/static/app/core/openstack-service-api/service-catalog.service.js#L34\n\nhttps://github.com/openstack/horizon/blob/2cf815c217ec2e9c68faa4ca79d0a00f8e2c248b/openstack_dashboard/static/app/core/openstack-service-api/settings.service.js#L33","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"eafc25d5332b3b577593ed347b8ba086e535383d","unresolved":false,"context_lines":[{"line_number":402,"context_line":"          }"},{"line_number":403,"context_line":"        });"},{"line_number":404,"context_line":"      }"},{"line_number":405,"context_line":"      if (enabledVolume) {"},{"line_number":406,"context_line":"        serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":407,"context_line":"      }"},{"line_number":408,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":16,"id":"dae33548_cf755b33","line":405,"in_reply_to":"dae33548_433dadba","updated":"2016-02-19 08:31:34.000000000","message":"Didnt knew this was cached, moved it back to its proper place instead as you are rigth.","commit_id":"a067eea39c00a326db1056dd3038e58766263678"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"2beeb2c8728ee9aadc0c428107b2a555eb87743f","unresolved":false,"context_lines":[{"line_number":207,"context_line":"          securityGroup.query().then(onGetSecurityGroups, noop),"},{"line_number":208,"context_line":"          serviceCatalog.ifTypeEnabled(\u0027network\u0027).then(getNetworks, noop),"},{"line_number":209,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then(setDefaultValues, noop),"},{"line_number":210,"context_line":"          settings.ifEnabled(\u0027LAUNCH_INSTANCE_DEFAULTS.disable_volume\u0027, true).then(noop,"},{"line_number":211,"context_line":"            function() {"},{"line_number":212,"context_line":"              return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":213,"context_line":"            })"}],"source_content_type":"text/javascript","patch_set":17,"id":"bae84128_5f4f0e92","line":210,"updated":"2016-02-20 15:39:00.000000000","message":"I get that the settings are cached but it seems a little weird to me that the LAUNCH_INSTANCE_DEFAULTS setting is being retrieved three different times, just so a different callback can be triggered.  Why not just add your additional code from the setDefaultValues() function?  Not a huge deal it just feels cleaner to me.\n\nsettings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then(setDefaultValues, noop),\n\nfunction setDefaultValues(defaults) {\n  // do the usual stuff and then...\n  enableBootSources(defaults);\n  checkDisableVolume(defaults);\n}","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8580d0ba1cbf4de4b10323bc66c5302e8abf2900","unresolved":false,"context_lines":[{"line_number":207,"context_line":"          securityGroup.query().then(onGetSecurityGroups, noop),"},{"line_number":208,"context_line":"          serviceCatalog.ifTypeEnabled(\u0027network\u0027).then(getNetworks, noop),"},{"line_number":209,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then(setDefaultValues, noop),"},{"line_number":210,"context_line":"          settings.ifEnabled(\u0027LAUNCH_INSTANCE_DEFAULTS.disable_volume\u0027, true).then(noop,"},{"line_number":211,"context_line":"            function() {"},{"line_number":212,"context_line":"              return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":213,"context_line":"            })"}],"source_content_type":"text/javascript","patch_set":17,"id":"bae84128_f7d706bd","line":210,"in_reply_to":"bae84128_0230839d","updated":"2016-02-22 08:42:25.000000000","message":"Done","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"3b49c9148015ad0e018912adffdb987b46c24e29","unresolved":false,"context_lines":[{"line_number":207,"context_line":"          securityGroup.query().then(onGetSecurityGroups, noop),"},{"line_number":208,"context_line":"          serviceCatalog.ifTypeEnabled(\u0027network\u0027).then(getNetworks, noop),"},{"line_number":209,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then(setDefaultValues, noop),"},{"line_number":210,"context_line":"          settings.ifEnabled(\u0027LAUNCH_INSTANCE_DEFAULTS.disable_volume\u0027, true).then(noop,"},{"line_number":211,"context_line":"            function() {"},{"line_number":212,"context_line":"              return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":213,"context_line":"            })"}],"source_content_type":"text/javascript","patch_set":17,"id":"bae84128_0230839d","line":210,"in_reply_to":"bae84128_5f4f0e92","updated":"2016-02-21 04:51:18.000000000","message":"Looking at this more closely I can see why you might need to do it with separate callbacks, since they result in promises that need to get resolved here.  I still can\u0027t help the feeling there must be a cleaner way.  I wonder if something like this would be better:\n\nvar launchInstanceDefaults \u003d settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027);\n\nlaunchInstanceDefaults.then(enableBootSources, noop),\nlaunchInstanceDefaults.then(setDefaultValues, noop),\nlaunchInstanceDefaults.then(checkDisableVolume, noop),","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"1dda9a4236e0e3329df13ecf081a84db250d6c0c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"          serviceCatalog.ifTypeEnabled(\u0027network\u0027).then(getNetworks, noop),"},{"line_number":209,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then(setDefaultValues, noop),"},{"line_number":210,"context_line":"          settings.ifEnabled(\u0027LAUNCH_INSTANCE_DEFAULTS.disable_volume\u0027, true).then(noop,"},{"line_number":211,"context_line":"            function() {"},{"line_number":212,"context_line":"              return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":213,"context_line":"            })"},{"line_number":214,"context_line":"        ]);"}],"source_content_type":"text/javascript","patch_set":17,"id":"bae84128_12590d5b","line":211,"updated":"2016-02-19 23:13:25.000000000","message":"Can you move this a helper function? like the others to keep this clean?","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8580d0ba1cbf4de4b10323bc66c5302e8abf2900","unresolved":false,"context_lines":[{"line_number":208,"context_line":"          serviceCatalog.ifTypeEnabled(\u0027network\u0027).then(getNetworks, noop),"},{"line_number":209,"context_line":"          settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027).then(setDefaultValues, noop),"},{"line_number":210,"context_line":"          settings.ifEnabled(\u0027LAUNCH_INSTANCE_DEFAULTS.disable_volume\u0027, true).then(noop,"},{"line_number":211,"context_line":"            function() {"},{"line_number":212,"context_line":"              return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":213,"context_line":"            })"},{"line_number":214,"context_line":"        ]);"}],"source_content_type":"text/javascript","patch_set":17,"id":"bae84128_57e7d2af","line":211,"in_reply_to":"bae84128_12590d5b","updated":"2016-02-22 08:42:25.000000000","message":"Done","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"9822e2817cc78794feecc3eafca44b7bf9c39901","unresolved":false,"context_lines":[{"line_number":388,"context_line":"      // in case settings are deleted or not present"},{"line_number":389,"context_line":"      // Note(Itxaka): angular.isUndefined does not work here"},{"line_number":390,"context_line":"      /*eslint-disable angular/definedundefined */"},{"line_number":391,"context_line":"      var allEnabled \u003d (config \u003d\u003d\u003d undefined);"},{"line_number":392,"context_line":"      /*eslint-enable angular/definedundefined */"},{"line_number":393,"context_line":"      // if the settings are missing or the specific setting is missing default to true"},{"line_number":394,"context_line":"      var enabledImage \u003d (allEnabled || !config.disable_image);"}],"source_content_type":"text/javascript","patch_set":18,"id":"bae84128_da96574b","line":391,"updated":"2016-02-22 15:49:52.000000000","message":"There\u0027s actually a case where config could be null, if the LAUNCH_INSTANCE_DEFAULTS setting is commented out or removed from the local_settings file but is still being passed into the REST_API_REQUIRED_SETTINGS.  I hit this on accident while playing with this but it would be really easy to handle.  Since config is an object you can get away with just checking that it\u0027s not falsy similar to setDefaults.\n\nvar allEnabled \u003d (!!config)","commit_id":"c7762d21aae19e88f7b8b993c35941fcf883862c"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"9822e2817cc78794feecc3eafca44b7bf9c39901","unresolved":false,"context_lines":[{"line_number":404,"context_line":"          }"},{"line_number":405,"context_line":"        });"},{"line_number":406,"context_line":"      } else {"},{"line_number":407,"context_line":"        return $q.when(\u0027not-enabled\u0027);"},{"line_number":408,"context_line":"      }"},{"line_number":409,"context_line":"    }"},{"line_number":410,"context_line":""}],"source_content_type":"text/javascript","patch_set":18,"id":"bae84128_5a7a47f2","line":407,"updated":"2016-02-22 15:49:52.000000000","message":"I get why you return a promise for getImages since there is additional work to do before $q.all should complete, but I don\u0027t think there is any reason to return anything in the case where image and snapshot are both disabled.","commit_id":"c7762d21aae19e88f7b8b993c35941fcf883862c"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"9822e2817cc78794feecc3eafca44b7bf9c39901","unresolved":false,"context_lines":[{"line_number":415,"context_line":"      if (enabledVolume) {"},{"line_number":416,"context_line":"        return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"},{"line_number":417,"context_line":"      } else {"},{"line_number":418,"context_line":"        return $q.when(\u0027not-enabled\u0027);"},{"line_number":419,"context_line":"      }"},{"line_number":420,"context_line":"    }"},{"line_number":421,"context_line":""}],"source_content_type":"text/javascript","patch_set":18,"id":"bae84128_fa735b13","line":418,"updated":"2016-02-22 15:49:52.000000000","message":"Same as above.  I don\u0027t think you need an \"else\" here at all.","commit_id":"c7762d21aae19e88f7b8b993c35941fcf883862c"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"2356089aa9649fb6002b5fa0ba4dc3dece09a5fc","unresolved":false,"context_lines":[{"line_number":388,"context_line":"      // in case settings are deleted or not present"},{"line_number":389,"context_line":"      // Note(Itxaka): angular.isUndefined does not work here"},{"line_number":390,"context_line":"      /*eslint-disable angular/definedundefined */"},{"line_number":391,"context_line":"      var allEnabled \u003d (config \u003d\u003d\u003d undefined);"},{"line_number":392,"context_line":"      /*eslint-enable angular/definedundefined */"},{"line_number":393,"context_line":"      // if the settings are missing or the specific setting is missing default to true"},{"line_number":394,"context_line":"      var enabledImage \u003d (allEnabled || !config.disable_image);"}],"source_content_type":"text/javascript","patch_set":20,"id":"bae84128_bb74f235","line":391,"updated":"2016-02-23 18:28:19.000000000","message":"See my comment from patch set 18.  I think it\u0027s safer to just check that config is falsy (!config) rather than just undefined.","commit_id":"75889dd28dbdf763e52c08efa82f4cec6157d51c"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"466005927860206b0cf1916f5ae10da022d1e55a","unresolved":false,"context_lines":[{"line_number":388,"context_line":"      // in case settings are deleted or not present"},{"line_number":389,"context_line":"      // Note(Itxaka): angular.isUndefined does not work here"},{"line_number":390,"context_line":"      /*eslint-disable angular/definedundefined */"},{"line_number":391,"context_line":"      var allEnabled \u003d (config \u003d\u003d\u003d undefined);"},{"line_number":392,"context_line":"      /*eslint-enable angular/definedundefined */"},{"line_number":393,"context_line":"      // if the settings are missing or the specific setting is missing default to true"},{"line_number":394,"context_line":"      var enabledImage \u003d (allEnabled || !config.disable_image);"}],"source_content_type":"text/javascript","patch_set":20,"id":"bae84128_cd80f58d","line":391,"in_reply_to":"bae84128_bb74f235","updated":"2016-02-24 11:10:36.000000000","message":"Done","commit_id":"75889dd28dbdf763e52c08efa82f4cec6157d51c"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"647e74575f2639621aa129f012a9f6103826606a","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    // Constants (const in ES6)"},{"line_number":62,"context_line":"    var NON_BOOTABLE_IMAGE_TYPES \u003d [\u0027aki\u0027, \u0027ari\u0027];"},{"line_number":63,"context_line":"    var SOURCE_TYPE_IMAGE \u003d \u0027image\u0027;"},{"line_number":64,"context_line":"    var SOURCE_TYPE_SNAPSHOT \u003d \u0027snapshot\u0027;"},{"line_number":65,"context_line":"    var SOURCE_TYPE_VOLUME \u003d \u0027volume\u0027;"},{"line_number":66,"context_line":"    var SOURCE_TYPE_VOLUME_SNAPSHOT \u003d \u0027volume_snapshot\u0027;"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_ff65941d","line":63,"updated":"2016-02-24 13:31:54.000000000","message":"I realize you didn\u0027t do this but these should be coming from the constant \u0027horizon.dashboard.project.workflow.launch-instance.boot-source-types\u0027.  It would be great if you could clean that up as part of this patch.  Not a big deal though if you don\u0027t.  It could be tracked with a new bug.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5eee37fd8cf0bdf590e4714e2650436be2c6d678","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    // Constants (const in ES6)"},{"line_number":62,"context_line":"    var NON_BOOTABLE_IMAGE_TYPES \u003d [\u0027aki\u0027, \u0027ari\u0027];"},{"line_number":63,"context_line":"    var SOURCE_TYPE_IMAGE \u003d \u0027image\u0027;"},{"line_number":64,"context_line":"    var SOURCE_TYPE_SNAPSHOT \u003d \u0027snapshot\u0027;"},{"line_number":65,"context_line":"    var SOURCE_TYPE_VOLUME \u003d \u0027volume\u0027;"},{"line_number":66,"context_line":"    var SOURCE_TYPE_VOLUME_SNAPSHOT \u003d \u0027volume_snapshot\u0027;"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_b7876c11","line":63,"in_reply_to":"bae84128_ff65941d","updated":"2016-02-25 12:25:29.000000000","message":"Done","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"da4c861071cb1222403eb69aad471cc0cbb97fdf","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    }"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    function addAllowedBootSource(rawTypes, type, label) {"},{"line_number":473,"context_line":"      if (rawTypes) {"},{"line_number":474,"context_line":"        model.allowedBootSources.push({"},{"line_number":475,"context_line":"          type: type,"},{"line_number":476,"context_line":"          label: label"}],"source_content_type":"text/javascript","patch_set":32,"id":"7af24918_9ec43241","line":473,"updated":"2016-03-01 13:34:52.000000000","message":"This changed from patch set 31 to 32.  Was that intentional?","commit_id":"83037c63145aed288863d110c2f94b7df8e4676e"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"89ee807116c234aa27009d71a422f4d9b4d60c4f","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    }"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    function addAllowedBootSource(rawTypes, type, label) {"},{"line_number":473,"context_line":"      if (rawTypes) {"},{"line_number":474,"context_line":"        model.allowedBootSources.push({"},{"line_number":475,"context_line":"          type: type,"},{"line_number":476,"context_line":"          label: label"}],"source_content_type":"text/javascript","patch_set":32,"id":"7af24918_ca6270ad","line":473,"in_reply_to":"7af24918_9ec43241","updated":"2016-03-01 14:24:06.000000000","message":"Yes! this solves the issue of no bootsources message when _there_ is bootsources enabled but there is no items for those sources. Im not sure why the addAllowedBootSource was checking for the source to contain items as that does not seem the purpose of this function.","commit_id":"83037c63145aed288863d110c2f94b7df8e4676e"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"35f5c4e113d5826923d285240338c8999c63d889","unresolved":false,"context_lines":[{"line_number":476,"context_line":"      // This is a blacklist of images that can not be booted."},{"line_number":477,"context_line":"      // If the image container type is in the blacklist"},{"line_number":478,"context_line":"      // The evaluation will result in a 0 or greater index."},{"line_number":479,"context_line":"      return nonBootableImageTypes.indexOf(image.container_format) \u003c 0;"},{"line_number":480,"context_line":"    }"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    function onGetImages(data) {"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_7120c7f7","side":"PARENT","line":479,"range":{"start_line":479,"start_character":13,"end_line":479,"end_character":34},"updated":"2016-06-08 14:35:49.000000000","message":"So it seems that dependency on line 73 is not used anymore (    \u0027horizon.dashboard.project.workflow.launch-instance.non_bootable_image_types\u0027).","commit_id":"1772f2da8af7c9ef7bcd3d87bc6c5d4cc8640d65"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5d24c42553688110667e625bb3d36aca7473d3a4","unresolved":false,"context_lines":[{"line_number":476,"context_line":"      // This is a blacklist of images that can not be booted."},{"line_number":477,"context_line":"      // If the image container type is in the blacklist"},{"line_number":478,"context_line":"      // The evaluation will result in a 0 or greater index."},{"line_number":479,"context_line":"      return nonBootableImageTypes.indexOf(image.container_format) \u003c 0;"},{"line_number":480,"context_line":"    }"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    function onGetImages(data) {"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_79f1c500","side":"PARENT","line":479,"in_reply_to":"7aa08908_7120c7f7","updated":"2016-06-14 13:59:26.000000000","message":"Done","commit_id":"1772f2da8af7c9ef7bcd3d87bc6c5d4cc8640d65"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"35f5c4e113d5826923d285240338c8999c63d889","unresolved":false,"context_lines":[{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    // Boot Source"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    function enableBootSources(config) {"},{"line_number":474,"context_line":"      // in case settings are deleted or not present"},{"line_number":475,"context_line":"      var allEnabled \u003d !config;"},{"line_number":476,"context_line":"      // if the settings are missing or the specific setting is missing default to true"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_1662190a","line":473,"range":{"start_line":473,"start_character":13,"end_line":473,"end_character":30},"updated":"2016-06-08 14:35:49.000000000","message":"Strictly speaking, this is \u0027addImageSourcesIfEnabled\u0027","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5d24c42553688110667e625bb3d36aca7473d3a4","unresolved":false,"context_lines":[{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    // Boot Source"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    function enableBootSources(config) {"},{"line_number":474,"context_line":"      // in case settings are deleted or not present"},{"line_number":475,"context_line":"      var allEnabled \u003d !config;"},{"line_number":476,"context_line":"      // if the settings are missing or the specific setting is missing default to true"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_39073dcb","line":473,"in_reply_to":"7aa08908_1662190a","updated":"2016-06-14 13:59:26.000000000","message":"Done","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"35f5c4e113d5826923d285240338c8999c63d889","unresolved":false,"context_lines":[{"line_number":489,"context_line":"      }"},{"line_number":490,"context_line":"    }"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    function enableVolumes(config) {"},{"line_number":493,"context_line":"      var enabledVolume \u003d (!config || !config.disable_volume);"},{"line_number":494,"context_line":"      if (enabledVolume) {"},{"line_number":495,"context_line":"        return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_963449fc","line":492,"range":{"start_line":492,"start_character":13,"end_line":492,"end_character":26},"updated":"2016-06-08 14:35:49.000000000","message":"Strictly speaking, this is \u0027addVolumeSourcesIfEnabled\u0027","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5d24c42553688110667e625bb3d36aca7473d3a4","unresolved":false,"context_lines":[{"line_number":489,"context_line":"      }"},{"line_number":490,"context_line":"    }"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    function enableVolumes(config) {"},{"line_number":493,"context_line":"      var enabledVolume \u003d (!config || !config.disable_volume);"},{"line_number":494,"context_line":"      if (enabledVolume) {"},{"line_number":495,"context_line":"        return serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(getVolumes, noop);"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_190a41d2","line":492,"in_reply_to":"7aa08908_963449fc","updated":"2016-06-14 13:59:26.000000000","message":"Done","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":12826,"name":"Rob Cresswell","display_name":"robcresswell","email":"robert.cresswell@outlook.com","username":"rob-cresswell"},"change_message_id":"9af79cf720d76f802130cf97d6a8900b6b739912","unresolved":false,"context_lines":[{"line_number":612,"context_line":"    }"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"    function setFinalSpecBootImageToVolume(finalSpec) {"},{"line_number":615,"context_line":"      if (finalSpec.vol_create) {"},{"line_number":616,"context_line":"        // Specify null to get Autoselection (not empty string)"},{"line_number":617,"context_line":"        var deviceName \u003d finalSpec.vol_device_name ? finalSpec.vol_device_name : null;"},{"line_number":618,"context_line":"        finalSpec.block_device_mapping_v2 \u003d [];"}],"source_content_type":"text/javascript","patch_set":58,"id":"1aa78d24_ba44bb49","line":615,"updated":"2016-07-07 09:45:02.000000000","message":"It looks to me like the usage of vol_create (in this file and others) could be removed entirely. Since as far as I can tell this function would never be called when vol_create as anything other than true - it defaults to true, and then is set to true in the source controller handling.","commit_id":"22585b0cc191cbf870e5b1628741bc89efdbccc2"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"2fef1e4c01909b7052f30ae99305f9993df99d36","unresolved":false,"context_lines":[{"line_number":612,"context_line":"    }"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"    function setFinalSpecBootImageToVolume(finalSpec) {"},{"line_number":615,"context_line":"      if (finalSpec.vol_create) {"},{"line_number":616,"context_line":"        // Specify null to get Autoselection (not empty string)"},{"line_number":617,"context_line":"        var deviceName \u003d finalSpec.vol_device_name ? finalSpec.vol_device_name : null;"},{"line_number":618,"context_line":"        finalSpec.block_device_mapping_v2 \u003d [];"}],"source_content_type":"text/javascript","patch_set":58,"id":"bacf61ea_34b2eb94","line":615,"in_reply_to":"1aa78d24_ba44bb49","updated":"2016-08-04 20:32:35.000000000","message":"Rob, I tested, and this patch doesn\u0027t resolve https://bugs.launchpad.net/horizon/+bug/1585761. I think the check for vol_create is going to be needed to resolve that one.","commit_id":"22585b0cc191cbf870e5b1628741bc89efdbccc2"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":505,"context_line":"      var enabledSnapshot \u003d (allEnabled || !config.disable_instance_snapshot);"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"      if (enabledImage || enabledSnapshot) {"},{"line_number":508,"context_line":"        return glanceAPI.getImages({status: \u0027active\u0027}).then(function (data) {"},{"line_number":509,"context_line":"          if (enabledImage) {"},{"line_number":510,"context_line":"            onGetImages(data);"},{"line_number":511,"context_line":"          }"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_823e7db6","line":508,"updated":"2016-08-08 15:42:04.000000000","message":"name this function","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":505,"context_line":"      var enabledSnapshot \u003d (allEnabled || !config.disable_instance_snapshot);"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"      if (enabledImage || enabledSnapshot) {"},{"line_number":508,"context_line":"        return glanceAPI.getImages({status: \u0027active\u0027}).then(function (data) {"},{"line_number":509,"context_line":"          if (enabledImage) {"},{"line_number":510,"context_line":"            onGetImages(data);"},{"line_number":511,"context_line":"          }"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_8cdd0c73","line":508,"in_reply_to":"9ad45d7e_823e7db6","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":519,"context_line":"    function addVolumeSourcesIfEnabled(config) {"},{"line_number":520,"context_line":"      var enabledVolume \u003d (!config || !config.disable_volume);"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"      serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(function () {"},{"line_number":523,"context_line":"        // Can only boot image to volume if the Nova extension is enabled."},{"line_number":524,"context_line":"        novaExtensions.ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)"},{"line_number":525,"context_line":"          .then(function () {"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_425c8525","line":522,"updated":"2016-08-08 15:42:04.000000000","message":"name this function","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":519,"context_line":"    function addVolumeSourcesIfEnabled(config) {"},{"line_number":520,"context_line":"      var enabledVolume \u003d (!config || !config.disable_volume);"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"      serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(function () {"},{"line_number":523,"context_line":"        // Can only boot image to volume if the Nova extension is enabled."},{"line_number":524,"context_line":"        novaExtensions.ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)"},{"line_number":525,"context_line":"          .then(function () {"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_cce7043f","line":522,"in_reply_to":"9ad45d7e_425c8525","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    function addVolumeSnapshotSourcesIfEnabled(config) {"},{"line_number":537,"context_line":"      var enabledVolumeSnapshots \u003d (!config || !config.disable_volume_snapshot);"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"      serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(function () {"},{"line_number":540,"context_line":"        // Can only boot image to volume if the Nova extension is enabled."},{"line_number":541,"context_line":"        novaExtensions.ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)"},{"line_number":542,"context_line":"          .then(function () {"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_2274f19a","line":539,"updated":"2016-08-08 15:42:04.000000000","message":"name this function","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    function addVolumeSnapshotSourcesIfEnabled(config) {"},{"line_number":537,"context_line":"      var enabledVolumeSnapshots \u003d (!config || !config.disable_volume_snapshot);"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"      serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(function () {"},{"line_number":540,"context_line":"        // Can only boot image to volume if the Nova extension is enabled."},{"line_number":541,"context_line":"        novaExtensions.ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)"},{"line_number":542,"context_line":"          .then(function () {"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_ace4503b","line":539,"in_reply_to":"9ad45d7e_2274f19a","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"491fcc410f6a0bcb71f946550ddd5e9687924e78","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        var launchInstanceDefaults \u003d settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027);"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        promise \u003d $q.all(["},{"line_number":222,"context_line":"          launchInstanceDefaults.then(addImageSourcesIfEnabled, noop),"},{"line_number":223,"context_line":"          novaAPI.getAvailabilityZones().then(onGetAvailabilityZones, noop),"},{"line_number":224,"context_line":"          novaAPI.getFlavors(true, true).then(onGetFlavors, noop),"},{"line_number":225,"context_line":"          novaAPI.getKeypairs().then(onGetKeypairs, noop),"}],"source_content_type":"text/javascript","patch_set":62,"id":"9ad45d7e_a0cba771","line":222,"updated":"2016-08-08 23:54:20.000000000","message":"nit, move to the others that are dependent on defaults.","commit_id":"e404a1638db580ce4a5a355bf7334bfca5a6ba92"},{"author":{"_account_id":21522,"name":"Yosef Hoffman","email":"yh128t@att.com","username":"yohoffman"},"change_message_id":"f83363fc1c49bf67eefadbc9cd84eeae793890f9","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        var launchInstanceDefaults \u003d settings.getSetting(\u0027LAUNCH_INSTANCE_DEFAULTS\u0027);"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        promise \u003d $q.all(["},{"line_number":222,"context_line":"          launchInstanceDefaults.then(addImageSourcesIfEnabled, noop),"},{"line_number":223,"context_line":"          novaAPI.getAvailabilityZones().then(onGetAvailabilityZones, noop),"},{"line_number":224,"context_line":"          novaAPI.getFlavors(true, true).then(onGetFlavors, noop),"},{"line_number":225,"context_line":"          novaAPI.getKeypairs().then(onGetKeypairs, noop),"}],"source_content_type":"text/javascript","patch_set":62,"id":"3ac371cc_82d29dd0","line":222,"in_reply_to":"9ad45d7e_a0cba771","updated":"2016-08-16 22:01:43.000000000","message":"Done","commit_id":"e404a1638db580ce4a5a355bf7334bfca5a6ba92"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"fdc01ca9b492f7c1de8df9d35692a63fe34f93a7","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            model.allowCreateVolumeFromImage \u003d true;"},{"line_number":527,"context_line":"          });"},{"line_number":528,"context_line":"        model.volumeBootable \u003d true;"},{"line_number":529,"context_line":"        if (enabledVolume) {"},{"line_number":530,"context_line":"          return cinderAPI.getVolumes({status: \u0027available\u0027, bootable: 1})"},{"line_number":531,"context_line":"            .then(onGetVolumes);"},{"line_number":532,"context_line":"        }"}],"source_content_type":"text/javascript","patch_set":62,"id":"9ad45d7e_8d5e5c74","line":529,"updated":"2016-08-10 00:25:16.000000000","message":"Why is this if check so deep?  It seems like this should come before / wrap the call to the service catalog (line 522).  Otherwise, line 522 and line 524 invoke promises that must be resolved when it may not even be enabled.","commit_id":"e404a1638db580ce4a5a355bf7334bfca5a6ba92"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"fdc01ca9b492f7c1de8df9d35692a63fe34f93a7","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    function addVolumeSnapshotSourcesIfEnabled(config) {"},{"line_number":537,"context_line":"      var enabledVolumeSnapshots \u003d (!config || !config.disable_volume_snapshot);"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"      serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(function getEnabledVolumeSnapshots() {"},{"line_number":540,"context_line":"        // Can only boot image to volume if the Nova extension is enabled."},{"line_number":541,"context_line":"        novaExtensions.ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)"},{"line_number":542,"context_line":"          .then(function () {"},{"line_number":543,"context_line":"            model.allowCreateVolumeFromImage \u003d true;"},{"line_number":544,"context_line":"          });"},{"line_number":545,"context_line":"        model.volumeBootable \u003d true;"},{"line_number":546,"context_line":"        if (enabledVolumeSnapshots) {"},{"line_number":547,"context_line":"          return cinderAPI.getVolumeSnapshots({status: \u0027available\u0027, bootable: 1})"},{"line_number":548,"context_line":"            .then(onGetVolumeSnapshots);"}],"source_content_type":"text/javascript","patch_set":62,"id":"9ad45d7e_e83d46bc","line":545,"range":{"start_line":539,"start_character":1,"end_line":545,"end_character":36},"updated":"2016-08-10 00:25:16.000000000","message":"This is the exact same code as lines 522 - 528.  This is some pretty tricky promise chaining, but I think that you could create a common function that first does the simple config if checks on the config, then if (enabledVolume || enabledVolumeSnapshot) call a wrapper of this code that returns a promise and sets .then to a function closure to basically do this.\n\nSo, something like Pardon the gerrit pseudo code)\n\n if (enabledVolume || enabledVolumeSnapshot) {\n    setVolumeBootableCapabability().then(function setVolumeBootSources() {\n      if(model.volumeBootable \u0026\u0026 enabledVolumes) {\n       // line 530\n     }\n     if (model.volumeBootable \u0026\u0026 enabledVolumeSnapshots) {\n       // line 547\n     }\n   }\n }\n\n function setVolumeBootableCapabability() {\n   lines 539 to 545.\n }","commit_id":"e404a1638db580ce4a5a355bf7334bfca5a6ba92"},{"author":{"_account_id":21522,"name":"Yosef Hoffman","email":"yh128t@att.com","username":"yohoffman"},"change_message_id":"f83363fc1c49bf67eefadbc9cd84eeae793890f9","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    function addVolumeSnapshotSourcesIfEnabled(config) {"},{"line_number":537,"context_line":"      var enabledVolumeSnapshots \u003d (!config || !config.disable_volume_snapshot);"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"      serviceCatalog.ifTypeEnabled(\u0027volume\u0027).then(function getEnabledVolumeSnapshots() {"},{"line_number":540,"context_line":"        // Can only boot image to volume if the Nova extension is enabled."},{"line_number":541,"context_line":"        novaExtensions.ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)"},{"line_number":542,"context_line":"          .then(function () {"},{"line_number":543,"context_line":"            model.allowCreateVolumeFromImage \u003d true;"},{"line_number":544,"context_line":"          });"},{"line_number":545,"context_line":"        model.volumeBootable \u003d true;"},{"line_number":546,"context_line":"        if (enabledVolumeSnapshots) {"},{"line_number":547,"context_line":"          return cinderAPI.getVolumeSnapshots({status: \u0027available\u0027, bootable: 1})"},{"line_number":548,"context_line":"            .then(onGetVolumeSnapshots);"}],"source_content_type":"text/javascript","patch_set":62,"id":"3ac371cc_1330bd9d","line":545,"range":{"start_line":539,"start_character":1,"end_line":545,"end_character":36},"in_reply_to":"9ad45d7e_e83d46bc","updated":"2016-08-16 22:01:43.000000000","message":"Done","commit_id":"e404a1638db580ce4a5a355bf7334bfca5a6ba92"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"fdc01ca9b492f7c1de8df9d35692a63fe34f93a7","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            model.allowCreateVolumeFromImage \u003d true;"},{"line_number":544,"context_line":"          });"},{"line_number":545,"context_line":"        model.volumeBootable \u003d true;"},{"line_number":546,"context_line":"        if (enabledVolumeSnapshots) {"},{"line_number":547,"context_line":"          return cinderAPI.getVolumeSnapshots({status: \u0027available\u0027, bootable: 1})"},{"line_number":548,"context_line":"            .then(onGetVolumeSnapshots);"},{"line_number":549,"context_line":"        }"}],"source_content_type":"text/javascript","patch_set":62,"id":"9ad45d7e_2de770b1","line":546,"updated":"2016-08-10 00:25:16.000000000","message":"Same comment here as above in volumes code.","commit_id":"e404a1638db580ce4a5a355bf7334bfca5a6ba92"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"493c7d133b900323457e94028bb9d8e1713d42d1","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    }"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    // Boot Source"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    function addImageSourcesIfEnabled(config) {"},{"line_number":503,"context_line":"      // in case settings are deleted or not present"},{"line_number":504,"context_line":"      var allEnabled \u003d !config;"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_b6599037","line":501,"updated":"2016-08-17 23:26:58.000000000","message":"I think you can replace everything from line 502 to 554 with the below.  It does all the checking and retains the promise chain similar to the original (base) patch.  Note that serviceCatalog.ifTypeEnabled and novaExtensions check are very fast and are cached.  They do not really incur an extra performance hit since they are already checked elsewhere.\n\n    function addVolSourcesAndVolSnapshotSources(config) {\n      var volumeDeferred \u003d $q.defer();\n      var volumeSnapshotDeferred \u003d $q.defer();\n\n      serviceCatalog\n        .ifTypeEnabled(\u0027volume\u0027)\n        .then(onVolumeServiceEnabled, resolvePromises);\n\n      function onVolumeServiceEnabled() {\n        model.volumeBootable \u003d true;\n\n        novaExtensions\n          .ifNameEnabled(\u0027BlockDeviceMappingV2Boot\u0027)\n          .then(onBootToVolumeSupported);\n\n        if (config \u0026\u0026 !config.disable_volume) {\n          getVolumes().then(resolveVolumes, failVolumes);\n        } else {\n          resolveVolumes();\n        }\n\n        if (config \u0026\u0026 !config.disable_volume_snapshot) {\n          getVolumeSnapshots().then(resolveVolumeSnapshots, failVolumeSnapshots);\n        } else {\n          resolveVolumeSnapshots();\n        }\n      }\n\n      function onBootToVolumeSupported() {\n        model.allowCreateVolumeFromImage \u003d true;\n      }\n\n      function getVolumes() {\n        return cinderAPI.getVolumes({status: \u0027available\u0027, bootable: 1})\n          .then(onGetVolumes);\n      }\n\n      function getVolumeSnapshots() {\n        return cinderAPI.getVolumeSnapshots({status: \u0027available\u0027})\n          .then(onGetVolumeSnapshots);\n      }\n\n      function resolvePromises() {\n        volumeDeferred.resolve();\n        volumeSnapshotDeferred.resolve();\n      }\n\n      function resolveVolumes() {\n        volumeDeferred.resolve();\n      }\n\n      function failVolumes() {\n        volumeDeferred.resolve();\n      }\n\n      function resolveVolumeSnapshots() {\n        volumeSnapshotDeferred.resolve();\n      }\n\n      function failVolumeSnapshots() {\n        volumeSnapshotDeferred.resolve();\n      }\n\n      return $q.all(\n        [\n          volumeDeferred.promise,\n          volumeSnapshotDeferred.promise\n        ]);\n    }","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"90d60b30295b9d599352bac7837ecc20d311b788","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    }"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    // Boot Source"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    function addImageSourcesIfEnabled(config) {"},{"line_number":503,"context_line":"      // in case settings are deleted or not present"},{"line_number":504,"context_line":"      var allEnabled \u003d !config;"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_8abd0fda","line":501,"in_reply_to":"3ac371cc_2a717b78","updated":"2016-08-18 17:22:29.000000000","message":"Also the config check should be set back to ||","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"bd4579f6684f4046b9ad3f06d45a412921386bcd","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    }"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    // Boot Source"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    function addImageSourcesIfEnabled(config) {"},{"line_number":503,"context_line":"      // in case settings are deleted or not present"},{"line_number":504,"context_line":"      var allEnabled \u003d !config;"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_2a717b78","line":501,"in_reply_to":"3ac371cc_47084928","updated":"2016-08-18 17:20:55.000000000","message":"Yosef, You are right about the !config.  Good catch.\n\nWhoops, I got a little overzealous with the lines.  Yes, It should replace 521 to 554","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":21522,"name":"Yosef Hoffman","email":"yh128t@att.com","username":"yohoffman"},"change_message_id":"b19d3acd5a1ce098d55fc16da521dc7474848f9e","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    }"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    // Boot Source"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    function addImageSourcesIfEnabled(config) {"},{"line_number":503,"context_line":"      // in case settings are deleted or not present"},{"line_number":504,"context_line":"      var allEnabled \u003d !config;"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_47084928","line":501,"in_reply_to":"3ac371cc_953f0ab3","updated":"2016-08-18 12:08:52.000000000","message":"Also I don\u0027t think it could replace lines 502 to 519, just 521 to 554. Do you think image sources and image snapshot sources should be included in this code as well or kept in it\u0027s separate function as it is currently?","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":21522,"name":"Yosef Hoffman","email":"yh128t@att.com","username":"yohoffman"},"change_message_id":"c8f9dae0afaa44bb77fea50feb12be0843c73165","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    }"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    // Boot Source"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    function addImageSourcesIfEnabled(config) {"},{"line_number":503,"context_line":"      // in case settings are deleted or not present"},{"line_number":504,"context_line":"      var allEnabled \u003d !config;"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_953f0ab3","line":501,"in_reply_to":"3ac371cc_b6599037","updated":"2016-08-18 11:55:09.000000000","message":"Wow, thanks. I like how you separated everything out into their own functions. Makes handling all the promises much simpler and cleaner. Definitely learning from this and making a mental note.\n\nOne question - why did you decide to use `if (config \u0026\u0026 !config.disable_volume)` instead of `if (!config || !config.disable_volume)`? Seems like !config means that all sources are enabled and that all sources should be added.","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"493c7d133b900323457e94028bb9d8e1713d42d1","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    function addVolSourcesAndVolSnapshotSources(config) {"},{"line_number":522,"context_line":"      var enabledVolume \u003d !config || !config.disable_volume;"},{"line_number":523,"context_line":"      var enabledVolumeSnapshots \u003d !config || !config.disable_volume_snapshot;"},{"line_number":524,"context_line":"      if (enabledVolume || enabledVolumeSnapshot) {"},{"line_number":525,"context_line":"        setVolumeBootableCapabability().then(function setVolumeBootSources() {"},{"line_number":526,"context_line":"          if (model.volumeBootable \u0026\u0026 enabledVolume) {"},{"line_number":527,"context_line":"            return cinderAPI.getVolumes({status: \u0027available\u0027, bootable: 1})"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_c2aa8e84","line":524,"range":{"start_line":524,"start_character":27,"end_line":524,"end_character":48},"updated":"2016-08-17 23:26:58.000000000","message":"This variable isn\u0027t the same as above.  It is missing the s from the end.","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"493c7d133b900323457e94028bb9d8e1713d42d1","unresolved":false,"context_lines":[{"line_number":522,"context_line":"      var enabledVolume \u003d !config || !config.disable_volume;"},{"line_number":523,"context_line":"      var enabledVolumeSnapshots \u003d !config || !config.disable_volume_snapshot;"},{"line_number":524,"context_line":"      if (enabledVolume || enabledVolumeSnapshot) {"},{"line_number":525,"context_line":"        setVolumeBootableCapabability().then(function setVolumeBootSources() {"},{"line_number":526,"context_line":"          if (model.volumeBootable \u0026\u0026 enabledVolume) {"},{"line_number":527,"context_line":"            return cinderAPI.getVolumes({status: \u0027available\u0027, bootable: 1})"},{"line_number":528,"context_line":"              .then(onGetVolumes);"}],"source_content_type":"text/javascript","patch_set":65,"id":"3ac371cc_a5eafc71","line":525,"updated":"2016-08-17 23:26:58.000000000","message":"This will return and never reach line 531","commit_id":"718077469e64bebeb812f86b8fddbbb592a8b0a0"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"33bebae865cb5edcef90f7b31157883e218ceaae","unresolved":false,"context_lines":[{"line_number":517,"context_line":"        });"},{"line_number":518,"context_line":"      }"},{"line_number":519,"context_line":"    }"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    function addVolumeSourcesIfEnabled(config) {"},{"line_number":522,"context_line":"      var volumeDeferred \u003d $q.defer();"},{"line_number":523,"context_line":"      var volumeSnapshotDeferred \u003d $q.defer();"}],"source_content_type":"text/javascript","patch_set":67,"id":"1ac06dbe_e16a5db2","line":520,"updated":"2016-08-22 23:43:23.000000000","message":"My only nit is that there could be some whitespace (carriage returns in here) before the inner function definitions, but on the other hand, clumping it together may make it easier for some to see the scoping.","commit_id":"4a9f988813b03952ef93bcdf37dc441b11742d64"}],"openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js":[{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        });"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        $provide.value(\u0027horizon.app.core.openstack-service-api.settings\u0027, {"},{"line_number":190,"context_line":"          // TODO: make this a proper mock of getSetting because its not behaving like it"},{"line_number":191,"context_line":"          getSetting: function(setting) {"},{"line_number":192,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":193,"context_line":""}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_ab4ab652","line":190,"updated":"2016-02-24 13:22:18.000000000","message":"This works for what is needed here.  There will be no reason to mock out the full setting path support unless that\u0027s actually being used in the model.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8d10bbbd473c015987f2f0531320029fd62d10f3","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        });"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        $provide.value(\u0027horizon.app.core.openstack-service-api.settings\u0027, {"},{"line_number":190,"context_line":"          // TODO: make this a proper mock of getSetting because its not behaving like it"},{"line_number":191,"context_line":"          getSetting: function(setting) {"},{"line_number":192,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":193,"context_line":""}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_3f59bc8e","line":190,"in_reply_to":"bae84128_ab4ab652","updated":"2016-02-24 14:35:54.000000000","message":"Done","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            return deferred.promise;"},{"line_number":197,"context_line":"          },"},{"line_number":198,"context_line":"          ifEnabled: function(key) {"},{"line_number":199,"context_line":"            var setting \u003d key.split(\".\");"},{"line_number":200,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":201,"context_line":"            if (settings[setting[0]] \u0026\u0026 settings[setting[0]][setting[1]]) {"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_f9093796","line":198,"updated":"2016-02-24 13:22:18.000000000","message":"This isn\u0027t being used.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8d10bbbd473c015987f2f0531320029fd62d10f3","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            return deferred.promise;"},{"line_number":197,"context_line":"          },"},{"line_number":198,"context_line":"          ifEnabled: function(key) {"},{"line_number":199,"context_line":"            var setting \u003d key.split(\".\");"},{"line_number":200,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":201,"context_line":"            if (settings[setting[0]] \u0026\u0026 settings[setting[0]][setting[1]]) {"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_1f5cb87b","line":198,"in_reply_to":"bae84128_f9093796","updated":"2016-02-24 14:35:54.000000000","message":"Done","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":373,"context_line":"          expect(model.allowedBootSources).toBeDefined();"},{"line_number":374,"context_line":"          expect(model.allowedBootSources.length).toBe(4);"},{"line_number":375,"context_line":"          expect(model.allowedBootSources).toContain("},{"line_number":376,"context_line":"            {type:\u0027image\u0027, label: gettext(\u0027Image\u0027)});"},{"line_number":377,"context_line":"          expect(model.allowedBootSources).toContain("},{"line_number":378,"context_line":"            {type:\u0027snapshot\u0027, label: gettext(\u0027Instance Snapshot\u0027)});"},{"line_number":379,"context_line":"          expect(model.allowedBootSources).toContain("}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_2b57c6ca","line":376,"updated":"2016-02-24 13:22:18.000000000","message":"The unit tests will not be run with translated strings so there really is no reason to use gettext for the labels.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8d10bbbd473c015987f2f0531320029fd62d10f3","unresolved":false,"context_lines":[{"line_number":373,"context_line":"          expect(model.allowedBootSources).toBeDefined();"},{"line_number":374,"context_line":"          expect(model.allowedBootSources.length).toBe(4);"},{"line_number":375,"context_line":"          expect(model.allowedBootSources).toContain("},{"line_number":376,"context_line":"            {type:\u0027image\u0027, label: gettext(\u0027Image\u0027)});"},{"line_number":377,"context_line":"          expect(model.allowedBootSources).toContain("},{"line_number":378,"context_line":"            {type:\u0027snapshot\u0027, label: gettext(\u0027Instance Snapshot\u0027)});"},{"line_number":379,"context_line":"          expect(model.allowedBootSources).toContain("}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_5fae402e","line":376,"in_reply_to":"bae84128_2b57c6ca","updated":"2016-02-24 14:35:54.000000000","message":"Done","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"17cb752f7e3d84261935b34ae617505df26c4b65","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        });"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        $provide.value(\u0027horizon.app.core.openstack-service-api.settings\u0027, {"},{"line_number":190,"context_line":"          // TODO: make this a proper mock of getSetting because its not behaving like it"},{"line_number":191,"context_line":"          getSetting: function(setting) {"},{"line_number":192,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":193,"context_line":""}],"source_content_type":"text/javascript","patch_set":27,"id":"bae84128_fe2b8131","line":190,"updated":"2016-02-25 17:45:51.000000000","message":"This had been removed but now it\u0027s back.","commit_id":"8e253b56361a50b5f987fbdf175cbf8a178c7002"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"01113f856f340e12dea8c13771a02cac8aa02794","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        });"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        $provide.value(\u0027horizon.app.core.openstack-service-api.settings\u0027, {"},{"line_number":190,"context_line":"          // TODO: make this a proper mock of getSetting because its not behaving like it"},{"line_number":191,"context_line":"          getSetting: function(setting) {"},{"line_number":192,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":193,"context_line":""}],"source_content_type":"text/javascript","patch_set":27,"id":"9aed3d3a_ae939ea2","line":190,"in_reply_to":"bae84128_fe2b8131","updated":"2016-02-26 10:02:52.000000000","message":"Done","commit_id":"8e253b56361a50b5f987fbdf175cbf8a178c7002"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"17cb752f7e3d84261935b34ae617505df26c4b65","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            return deferred.promise;"},{"line_number":197,"context_line":"          },"},{"line_number":198,"context_line":"          ifEnabled: function(key) {"},{"line_number":199,"context_line":"            var setting \u003d key.split(\".\");"},{"line_number":200,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":201,"context_line":"            if (settings[setting[0]] \u0026\u0026 settings[setting[0]][setting[1]]) {"}],"source_content_type":"text/javascript","patch_set":27,"id":"bae84128_bef1f9cf","line":198,"updated":"2016-02-25 17:45:51.000000000","message":"This too!","commit_id":"8e253b56361a50b5f987fbdf175cbf8a178c7002"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"01113f856f340e12dea8c13771a02cac8aa02794","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            return deferred.promise;"},{"line_number":197,"context_line":"          },"},{"line_number":198,"context_line":"          ifEnabled: function(key) {"},{"line_number":199,"context_line":"            var setting \u003d key.split(\".\");"},{"line_number":200,"context_line":"            var deferred \u003d $q.defer();"},{"line_number":201,"context_line":"            if (settings[setting[0]] \u0026\u0026 settings[setting[0]][setting[1]]) {"}],"source_content_type":"text/javascript","patch_set":27,"id":"9aed3d3a_0e91ea99","line":198,"in_reply_to":"bae84128_bef1f9cf","updated":"2016-02-26 10:02:52.000000000","message":"Done","commit_id":"8e253b56361a50b5f987fbdf175cbf8a178c7002"}],"openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance.module.js":[{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"17cb752f7e3d84261935b34ae617505df26c4b65","unresolved":false,"context_lines":[{"line_number":36,"context_line":"      VOLUME: \u0027volume\u0027,"},{"line_number":37,"context_line":"      VOLUME_SNAPSHOT: \u0027volume_snapshot\u0027,"},{"line_number":38,"context_line":"      NON_BOOTABLE_IMAGE_TYPES: [\u0027aki\u0027, \u0027ari\u0027],"},{"line_number":39,"context_line":"      SOURCE_TYPE_IMAGE: \u0027image\u0027,"},{"line_number":40,"context_line":"      SOURCE_TYPE_SNAPSHOT: \u0027snapshot\u0027,"},{"line_number":41,"context_line":"      SOURCE_TYPE_VOLUME: \u0027volume\u0027,"},{"line_number":42,"context_line":"      SOURCE_TYPE_VOLUME_SNAPSHOT: \u0027volume_snapshot\u0027"}],"source_content_type":"text/javascript","patch_set":27,"id":"bae84128_3bab3b8b","line":39,"updated":"2016-02-25 17:45:51.000000000","message":"These new SOURCE_TYPE_* constants are duplicates of those above.  You should be able to use the ones that are already there.","commit_id":"8e253b56361a50b5f987fbdf175cbf8a178c7002"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"01113f856f340e12dea8c13771a02cac8aa02794","unresolved":false,"context_lines":[{"line_number":36,"context_line":"      VOLUME: \u0027volume\u0027,"},{"line_number":37,"context_line":"      VOLUME_SNAPSHOT: \u0027volume_snapshot\u0027,"},{"line_number":38,"context_line":"      NON_BOOTABLE_IMAGE_TYPES: [\u0027aki\u0027, \u0027ari\u0027],"},{"line_number":39,"context_line":"      SOURCE_TYPE_IMAGE: \u0027image\u0027,"},{"line_number":40,"context_line":"      SOURCE_TYPE_SNAPSHOT: \u0027snapshot\u0027,"},{"line_number":41,"context_line":"      SOURCE_TYPE_VOLUME: \u0027volume\u0027,"},{"line_number":42,"context_line":"      SOURCE_TYPE_VOLUME_SNAPSHOT: \u0027volume_snapshot\u0027"}],"source_content_type":"text/javascript","patch_set":27,"id":"9aed3d3a_6ef876e6","line":39,"in_reply_to":"bae84128_3bab3b8b","updated":"2016-02-26 10:02:52.000000000","message":"Done","commit_id":"8e253b56361a50b5f987fbdf175cbf8a178c7002"}],"openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/source/source.controller.js":[{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    /*"},{"line_number":69,"context_line":"     * Boot Sources"},{"line_number":70,"context_line":"     */"},{"line_number":71,"context_line":"    ctrl.bootSourcesOptions \u003d ["},{"line_number":72,"context_line":"      { type: bootSourceTypes.IMAGE, label: gettext(\u0027Image\u0027) },"},{"line_number":73,"context_line":"      { type: bootSourceTypes.INSTANCE_SNAPSHOT, label: gettext(\u0027Instance Snapshot\u0027) },"},{"line_number":74,"context_line":"      { type: bootSourceTypes.VOLUME, label: gettext(\u0027Volume\u0027) },"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_a1e65541","line":71,"updated":"2016-02-24 13:22:18.000000000","message":"The boot source options now come from model.allowedBootSources so this should be removed.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        return $scope.model.allowedBootSources;"},{"line_number":337,"context_line":"      },"},{"line_number":338,"context_line":"      function (newValue) {"},{"line_number":339,"context_line":"        if (newValue \u0026\u0026 newValue.length \u003e 0 \u0026\u0026 newValue.length \u003c 2) {"},{"line_number":340,"context_line":"          updateBootSourceSelection(newValue[0].type);"},{"line_number":341,"context_line":"          $scope.model.newInstanceSpec.source_type \u003d newValue[0];"},{"line_number":342,"context_line":"        }"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_ce52a812","line":339,"updated":"2016-02-24 13:22:18.000000000","message":"This watcher should be used to set the initial selected boot source when the first allowed boot source is added, so something like this would be better:\n(newValue \u0026\u0026 !$scope.model.newInstanceSpec.source_type)","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"4e969dd81c82e378dd5a2f7f7f5aa4dddd042038","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        return $scope.model.allowedBootSources;"},{"line_number":337,"context_line":"      },"},{"line_number":338,"context_line":"      function (newValue) {"},{"line_number":339,"context_line":"        if (newValue \u0026\u0026 newValue.length \u003e 0 \u0026\u0026 newValue.length \u003c 2) {"},{"line_number":340,"context_line":"          updateBootSourceSelection(newValue[0].type);"},{"line_number":341,"context_line":"          $scope.model.newInstanceSpec.source_type \u003d newValue[0];"},{"line_number":342,"context_line":"        }"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_4ef2c69b","line":339,"in_reply_to":"bae84128_ce52a812","updated":"2016-02-25 14:43:49.000000000","message":"Done \\o/","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    });"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    // Initialize"},{"line_number":355,"context_line":"    changeBootSource(ctrl.bootSourcesOptions[0].type);"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    if (!$scope.model.newInstanceSpec.source_type) {"},{"line_number":358,"context_line":"      $scope.model.newInstanceSpec.source_type \u003d ctrl.bootSourcesOptions[0];"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_4124a90b","line":355,"updated":"2016-02-24 13:22:18.000000000","message":"Initialize shouldn\u0027t happen until the first allowed boot source is added.  So that should happen in your watcher.  That means the selected boot source would never be initialized in the case where there are no allowed boot sources, which makes sense.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"4e969dd81c82e378dd5a2f7f7f5aa4dddd042038","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    });"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    // Initialize"},{"line_number":355,"context_line":"    changeBootSource(ctrl.bootSourcesOptions[0].type);"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    if (!$scope.model.newInstanceSpec.source_type) {"},{"line_number":358,"context_line":"      $scope.model.newInstanceSpec.source_type \u003d ctrl.bootSourcesOptions[0];"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_ce34164c","line":355,"in_reply_to":"bae84128_4124a90b","updated":"2016-02-25 14:43:49.000000000","message":"Done \\o/","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"d9c99a211ec489db6f91385f3ae9cd08a2cc2517","unresolved":false,"context_lines":[{"line_number":354,"context_line":"    // Initialize"},{"line_number":355,"context_line":"    changeBootSource(ctrl.bootSourcesOptions[0].type);"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    if (!$scope.model.newInstanceSpec.source_type) {"},{"line_number":358,"context_line":"      $scope.model.newInstanceSpec.source_type \u003d ctrl.bootSourcesOptions[0];"},{"line_number":359,"context_line":"      ctrl.currentBootSource \u003d ctrl.bootSourcesOptions[0].type;"},{"line_number":360,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_21e7e5ac","line":357,"updated":"2016-02-24 13:22:18.000000000","message":"This is also part of the initialization that should be in the watcher.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8d10bbbd473c015987f2f0531320029fd62d10f3","unresolved":false,"context_lines":[{"line_number":354,"context_line":"    // Initialize"},{"line_number":355,"context_line":"    changeBootSource(ctrl.bootSourcesOptions[0].type);"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    if (!$scope.model.newInstanceSpec.source_type) {"},{"line_number":358,"context_line":"      $scope.model.newInstanceSpec.source_type \u003d ctrl.bootSourcesOptions[0];"},{"line_number":359,"context_line":"      ctrl.currentBootSource \u003d ctrl.bootSourcesOptions[0].type;"},{"line_number":360,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_b9796595","line":357,"in_reply_to":"bae84128_21e7e5ac","updated":"2016-02-24 14:35:54.000000000","message":"Umm, if I move this into the watcher that means that $scope.model.newInstanceSpec.source_type is empty, which breaks everything.\n\n\nLet me have a deeper look at this because it seems that there is a bit of entanglement in the code with the sources.","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"4e969dd81c82e378dd5a2f7f7f5aa4dddd042038","unresolved":false,"context_lines":[{"line_number":354,"context_line":"    // Initialize"},{"line_number":355,"context_line":"    changeBootSource(ctrl.bootSourcesOptions[0].type);"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    if (!$scope.model.newInstanceSpec.source_type) {"},{"line_number":358,"context_line":"      $scope.model.newInstanceSpec.source_type \u003d ctrl.bootSourcesOptions[0];"},{"line_number":359,"context_line":"      ctrl.currentBootSource \u003d ctrl.bootSourcesOptions[0].type;"},{"line_number":360,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":21,"id":"bae84128_ae39d243","line":357,"in_reply_to":"bae84128_b9796595","updated":"2016-02-25 14:43:49.000000000","message":"Done \\o/","commit_id":"7854c334534c427b73aa01b80707ff5d3a80df6d"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"108242a6f210dfc0b4104971f1b42dde1e52b6e5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"     */"},{"line_number":77,"context_line":"    ctrl.tableHeadCells \u003d [];"},{"line_number":78,"context_line":"    ctrl.tableBodyCells \u003d [];"},{"line_number":79,"context_line":"    ctrl.tableData \u003d {};"},{"line_number":80,"context_line":"    ctrl.helpText \u003d {};"},{"line_number":81,"context_line":"    ctrl.sourceDetails \u003d basePath + \u0027source/source-details.html\u0027;"},{"line_number":82,"context_line":""}],"source_content_type":"text/javascript","patch_set":29,"id":"9aed3d3a_7883ca04","line":79,"updated":"2016-02-28 21:30:54.000000000","message":"If there are no bootable sources this causes an error since the transfer table doesn\u0027t handle the situation where available items is undefined.  So it would be safer to initially set tableData to empty arrays.\n\n    ctrl.tableData \u003d {\n        available: [],\n        allocated: [],\n        displayedAvailable: [],\n        displayedAllocated: []\n    }","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5022ab8066d3644d72cc97db5b9ea572475592da","unresolved":false,"context_lines":[{"line_number":76,"context_line":"     */"},{"line_number":77,"context_line":"    ctrl.tableHeadCells \u003d [];"},{"line_number":78,"context_line":"    ctrl.tableBodyCells \u003d [];"},{"line_number":79,"context_line":"    ctrl.tableData \u003d {};"},{"line_number":80,"context_line":"    ctrl.helpText \u003d {};"},{"line_number":81,"context_line":"    ctrl.sourceDetails \u003d basePath + \u0027source/source-details.html\u0027;"},{"line_number":82,"context_line":""}],"source_content_type":"text/javascript","patch_set":29,"id":"9aed3d3a_7b3e1adb","line":79,"in_reply_to":"9aed3d3a_7883ca04","updated":"2016-02-29 08:21:45.000000000","message":"Yes! Thanks you, I was searching for this as I got several errors while testing and could not find where the issue was coming from. Now that you point at it its clear that tabledata can be empty if the promises havent completed while its drawn, so this is the issue I was seeing!","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"35f5c4e113d5826923d285240338c8999c63d889","unresolved":false,"context_lines":[{"line_number":513,"context_line":"      var pre \u003d findSourceById($scope.model.images, id);"},{"line_number":514,"context_line":"      if (pre) {"},{"line_number":515,"context_line":"        changeBootSource(bootSourceTypes.IMAGE, [pre]);"},{"line_number":516,"context_line":"        $scope.model.newInstanceSpec.source_type \u003d {"},{"line_number":517,"context_line":"          type: bootSourceTypes.IMAGE,"},{"line_number":518,"context_line":"          label: gettext(\u0027Image\u0027)"},{"line_number":519,"context_line":"        };"},{"line_number":520,"context_line":"        ctrl.currentBootSource \u003d bootSourceTypes.IMAGE;"},{"line_number":521,"context_line":"      }"},{"line_number":522,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_2c7b84c2","line":519,"range":{"start_line":516,"start_character":8,"end_line":519,"end_character":10},"updated":"2016-06-08 14:35:49.000000000","message":"Wouldn\u0027t it reduce the amount of boilerplate code if changeBootSource() did this assignment?","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5d24c42553688110667e625bb3d36aca7473d3a4","unresolved":false,"context_lines":[{"line_number":516,"context_line":"        $scope.model.newInstanceSpec.source_type \u003d {"},{"line_number":517,"context_line":"          type: bootSourceTypes.IMAGE,"},{"line_number":518,"context_line":"          label: gettext(\u0027Image\u0027)"},{"line_number":519,"context_line":"        };"},{"line_number":520,"context_line":"        ctrl.currentBootSource \u003d bootSourceTypes.IMAGE;"},{"line_number":521,"context_line":"      }"},{"line_number":522,"context_line":"    }"}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_99ff5133","line":519,"in_reply_to":"7aa08908_2c7b84c2","updated":"2016-06-14 13:59:26.000000000","message":"It seems to me that using changeBootSource would be overkill for this, as it changes the table as well, while this small functions only change the source_type in the instance spec based on an id?\n\nMaybe Im reading it wrong, but seems that bootsource involves the actual source (volume/image/snapshot/etc..) while this ones change based on the item selected in that category.","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"35f5c4e113d5826923d285240338c8999c63d889","unresolved":false,"context_lines":[{"line_number":517,"context_line":"          type: bootSourceTypes.IMAGE,"},{"line_number":518,"context_line":"          label: gettext(\u0027Image\u0027)"},{"line_number":519,"context_line":"        };"},{"line_number":520,"context_line":"        ctrl.currentBootSource \u003d bootSourceTypes.IMAGE;"},{"line_number":521,"context_line":"      }"},{"line_number":522,"context_line":"    }"},{"line_number":523,"context_line":""}],"source_content_type":"text/javascript","patch_set":48,"id":"7aa08908_6c774c02","line":520,"range":{"start_line":520,"start_character":8,"end_line":520,"end_character":54},"updated":"2016-06-08 14:35:49.000000000","message":"Same question here.","commit_id":"a29579f81b0d786889c2de226fea3e294ba6dc5a"},{"author":{"_account_id":14124,"name":"Matt Borland","email":"matt.borland@hpe.com","username":"mborland"},"change_message_id":"8bf93a4c390cf9720bb8f4dca133e6aebd5bb880","unresolved":false,"context_lines":[{"line_number":379,"context_line":"      function () {"},{"line_number":380,"context_line":"        return $scope.model.allowedBootSources;"},{"line_number":381,"context_line":"      },"},{"line_number":382,"context_line":"      function (newValue) {"},{"line_number":383,"context_line":"        if (angular.isArray(newValue) \u0026\u0026 newValue.length \u003e 0 \u0026\u0026"},{"line_number":384,"context_line":"          !$scope.model.newInstanceSpec.source_type) {"},{"line_number":385,"context_line":"          updateBootSourceSelection(newValue[0].type);"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_2e3b3ded","line":382,"updated":"2016-08-08 15:42:04.000000000","message":"Add name for this function for better debugging.","commit_id":"62375b5baead476954008005cdb3430207140859"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"fc1b2d46d4f052c115324af7522f5556e1e98e33","unresolved":false,"context_lines":[{"line_number":379,"context_line":"      function () {"},{"line_number":380,"context_line":"        return $scope.model.allowedBootSources;"},{"line_number":381,"context_line":"      },"},{"line_number":382,"context_line":"      function (newValue) {"},{"line_number":383,"context_line":"        if (angular.isArray(newValue) \u0026\u0026 newValue.length \u003e 0 \u0026\u0026"},{"line_number":384,"context_line":"          !$scope.model.newInstanceSpec.source_type) {"},{"line_number":385,"context_line":"          updateBootSourceSelection(newValue[0].type);"}],"source_content_type":"text/javascript","patch_set":61,"id":"9ad45d7e_0cd0fc52","line":382,"in_reply_to":"9ad45d7e_2e3b3ded","updated":"2016-08-08 17:50:24.000000000","message":"Done","commit_id":"62375b5baead476954008005cdb3430207140859"}],"openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/source/source.html":[{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"2beeb2c8728ee9aadc0c428107b2a555eb87743f","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  \u003ch1 translate\u003eInstance Source\u003c/h1\u003e"},{"line_number":4,"context_line":"  \u003cdiv class\u003d\"content\"\u003e"},{"line_number":5,"context_line":"    \u003cdiv ng-show\u003d\"model.allowedBootSources.length \u003e 0\"\u003e"},{"line_number":6,"context_line":"    \u003cdiv translate class\u003d\"subtitle\"\u003eInstance source is the template used to create an instance. You can use a snapshot of an existing instance, an image, or a volume (if enabled)."},{"line_number":7,"context_line":"      You can also choose to use persistent storage by creating a new volume.\u003c/div\u003e"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    \u003c!--instance-source form--\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"bae84128_dfff9e32","line":6,"updated":"2016-02-20 15:39:00.000000000","message":"Nit:  fix the indentation","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"8580d0ba1cbf4de4b10323bc66c5302e8abf2900","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  \u003ch1 translate\u003eInstance Source\u003c/h1\u003e"},{"line_number":4,"context_line":"  \u003cdiv class\u003d\"content\"\u003e"},{"line_number":5,"context_line":"    \u003cdiv ng-show\u003d\"model.allowedBootSources.length \u003e 0\"\u003e"},{"line_number":6,"context_line":"    \u003cdiv translate class\u003d\"subtitle\"\u003eInstance source is the template used to create an instance. You can use a snapshot of an existing instance, an image, or a volume (if enabled)."},{"line_number":7,"context_line":"      You can also choose to use persistent storage by creating a new volume.\u003c/div\u003e"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    \u003c!--instance-source form--\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"bae84128_57c6b248","line":6,"in_reply_to":"bae84128_dfff9e32","updated":"2016-02-22 08:42:25.000000000","message":"Done","commit_id":"5d9923befe19421d3c6762423e371d0dff3cf9b1"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"108242a6f210dfc0b4104971f1b42dde1e52b6e5","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"          \u003c!-- start image select options --\u003e"},{"line_number":34,"context_line":"          \u003cdiv class\u003d\"col-xs-12 col-sm-9\""},{"line_number":35,"context_line":"               ng-if\u003d\"model.newInstanceSpec.source_type !\u003d\u003d null \u0026\u0026 model.newInstanceSpec.source_type.type \u003d\u003d\u003d \u0027image\u0027 \u0026\u0026"},{"line_number":36,"context_line":"                      model.allowCreateVolumeFromImage\"\u003e"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"            \u003cdiv class\u003d\"col-xs-12 col-sm-3\"\u003e"}],"source_content_type":"text/html","patch_set":29,"id":"9aed3d3a_1830be9d","line":35,"updated":"2016-02-28 21:30:54.000000000","message":"This additional null check should not be necessary.  Angular is smart enough to handle the situation even if source_type doesn\u0027t exist.","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5022ab8066d3644d72cc97db5b9ea572475592da","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"          \u003c!-- start image select options --\u003e"},{"line_number":34,"context_line":"          \u003cdiv class\u003d\"col-xs-12 col-sm-9\""},{"line_number":35,"context_line":"               ng-if\u003d\"model.newInstanceSpec.source_type !\u003d\u003d null \u0026\u0026 model.newInstanceSpec.source_type.type \u003d\u003d\u003d \u0027image\u0027 \u0026\u0026"},{"line_number":36,"context_line":"                      model.allowCreateVolumeFromImage\"\u003e"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"            \u003cdiv class\u003d\"col-xs-12 col-sm-3\"\u003e"}],"source_content_type":"text/html","patch_set":29,"id":"9aed3d3a_6e5ada2b","line":35,"in_reply_to":"9aed3d3a_1830be9d","updated":"2016-02-29 08:21:45.000000000","message":"I think I did this because of the issue with the tableData being empty on init so it should not be needed now.","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"108242a6f210dfc0b4104971f1b42dde1e52b6e5","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"          \u003c!-- start volume select options --\u003e"},{"line_number":98,"context_line":"          \u003cdiv class\u003d\"col-xs-12 col-sm-9\""},{"line_number":99,"context_line":"               ng-if\u003d\"model.newInstanceSpec.source_type !\u003d\u003d null \u0026\u0026 model.newInstanceSpec.source_type.type \u003d\u003d \u0027volume\u0027 || model.newInstanceSpec.source_type.type \u003d\u003d \u0027volume_snapshot\u0027\"\u003e"},{"line_number":100,"context_line":"            \u003cdiv class\u003d\"col-xs-12 col-sm-6\"\u003e"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"              \u003cdiv class\u003d\"form-group delete-volume\"\u003e"}],"source_content_type":"text/html","patch_set":29,"id":"9aed3d3a_582a462d","line":99,"updated":"2016-02-28 21:30:54.000000000","message":"same here","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"108242a6f210dfc0b4104971f1b42dde1e52b6e5","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle\"\u003eLooks like there is no instance boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":29,"id":"9aed3d3a_d8edb6f0","line":333,"updated":"2016-02-28 21:30:54.000000000","message":"Nit on the wording:  there *are* no...\n\nCould it also be the case that the user just doesn\u0027t have any bootable sources?  For example, I am allowed to boot from volumes but I don\u0027t have any bootable volumes in my environment.  If so, that should probably be included here as a possible reason.","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"5022ab8066d3644d72cc97db5b9ea572475592da","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle\"\u003eLooks like there is no instance boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":29,"id":"9aed3d3a_ce3cc6ca","line":333,"in_reply_to":"9aed3d3a_d8edb6f0","updated":"2016-02-29 08:21:45.000000000","message":"In that case, there would be an allowedBootsource called volumes, but it would have no items inside it, so I believe this part wont appear, only the volumes table with no items.\n\nThis should only appear if everything is _disabled_ thus allowedBootSources is empty.","commit_id":"7c2bc8784f3b9a54308861542529ba4e00fd11b2"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"4b16285177d446c430be31b576b4b72ccd6d91f0","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle\"\u003e\u003cb\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/b\u003e\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":31,"id":"9aed3d3a_9fb76f39","line":333,"updated":"2016-02-29 15:59:35.000000000","message":"I just want to verify the accuracy of this message again.  In my environment all boot sources are enabled but I have no bootable sources.  When I open the Launch Instance modal I see this message which tells me \"there are no boot sources allowed.\"  In my mind this means I\u0027m not allowed to create any instances, but in reality all I need to do is upload a bootable image or create a bootable volume first.  Maybe something like \"there are no bootable sources\" would be better?\n\nAlso, I\u0027m not really sure about wrapping this in the \u003cb\u003e tag vs. \u003cstrong\u003e vs. CSS vs. whatever else, but I\u0027ll try to get another opinion on it.  I\u0027m not going to -1 on that.","commit_id":"29227d254afc3d9179124fdf16d630e764dcd685"},{"author":{"_account_id":11778,"name":"Diana Whitten","email":"hurgleburgler@gmail.com","username":"hurgleburgler"},"change_message_id":"a5a63a5e18f30af9f670157aff4902c9c990fa54","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle\"\u003e\u003cb\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/b\u003e\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":31,"id":"9aed3d3a_68462e50","line":333,"in_reply_to":"9aed3d3a_401fc807","updated":"2016-02-29 17:39:06.000000000","message":"I wouldn\u0027t use \u003cb\u003e or \u003cstrong\u003e here, personally.  I usually leave those for pointing out emphasis within a paragraph of text that contains non-emphasized content, as these tags can have strange effects on device readers.\n\nIf you want to make it more eye-catching, you should consider adding Bootstrap contextual text classes or even contextual background classes:\nhttp://getbootstrap.com/css/#helper-classes-colors","commit_id":"29227d254afc3d9179124fdf16d630e764dcd685"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"b2c5a3012630d990d3039de3656687727f9ce32e","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle\"\u003e\u003cb\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/b\u003e\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":31,"id":"7af24918_b3096ae0","line":333,"in_reply_to":"9aed3d3a_68462e50","updated":"2016-03-01 13:04:47.000000000","message":"text-danger looks much more nicer, thanks Diana!\n@ Justin: Fixed!","commit_id":"29227d254afc3d9179124fdf16d630e764dcd685"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"9b840f50f9c380b3e1808d397aa97578a73d30c5","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle\"\u003e\u003cb\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/b\u003e\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":31,"id":"9aed3d3a_401fc807","line":333,"in_reply_to":"9aed3d3a_9fb76f39","updated":"2016-02-29 16:27:38.000000000","message":"Will check it locally, I dont think I ever had no images/volumes/whatever so you may be totally right and the check its wrong!\n\nThe \u003cb\u003e tag, I dont mind the type, I want to stress to the user that this does not seem normal because the subtitle class its very non-eye-catching, so Im open to anything.","commit_id":"29227d254afc3d9179124fdf16d630e764dcd685"},{"author":{"_account_id":9647,"name":"Justin Pomeroy","email":"jpomero@linux.vnet.ibm.com","username":"jpomero"},"change_message_id":"da4c861071cb1222403eb69aad471cc0cbb97fdf","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle text-danger\"\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":32,"id":"7af24918_7ec5e659","line":333,"updated":"2016-03-01 13:34:52.000000000","message":"I still have concern over the wording of this message.  I think it could be very confusing for people who just don\u0027t have any bootable sources.  It makes it sound like they don\u0027t have permission to boot an instance.  Do you disagree?","commit_id":"83037c63145aed288863d110c2f94b7df8e4676e"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"89ee807116c234aa27009d71a422f4d9b4d60c4f","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle text-danger\"\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":32,"id":"7af24918_aac8c475","line":333,"in_reply_to":"7af24918_7ec5e659","updated":"2016-03-01 14:24:06.000000000","message":"Hello Justin, with the last patch this should _only_ appear when all sources are disabled on the config, instead of when there is no items. In that case I think that the message is proper.\n\nAlso the case for this to appear is very niche I think as the usercase where someone has a openstack cloud and disables _all_ sources its practically nil.","commit_id":"83037c63145aed288863d110c2f94b7df8e4676e"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"bdfacc6e790b135fddb54bb70607b6280404ac85","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    \u003c/transfer-table\u003e"},{"line_number":331,"context_line":"    \u003c/div\u003e"},{"line_number":332,"context_line":"    \u003cdiv ng-if\u003d\"model.allowedBootSources.length \u003d\u003d\u003d 0\"\u003e"},{"line_number":333,"context_line":"      \u003cdiv translate class\u003d\"subtitle text-danger\"\u003eLooks like there are no boot sources allowed."},{"line_number":334,"context_line":"          If you think this is wrong please contact your administrator.\u003c/div\u003e"},{"line_number":335,"context_line":"      \u003c/div\u003e"},{"line_number":336,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":32,"id":"7af24918_619a3316","line":333,"in_reply_to":"7af24918_aac8c475","updated":"2016-03-02 04:42:40.000000000","message":"Probably the friendly tone of this throws Justin off. We aren\u0027t supposed to be friendly with OpenStack. Only mean and angry with no helpful information.  ;-)\n\nTo be a little more along the lines of the other business like (no fun) messages, should be \"The are no allowed boot sources.\"\n\nBut I\u0027m not going to -1 over that.","commit_id":"83037c63145aed288863d110c2f94b7df8e4676e"}],"openstack_dashboard/local/local_settings.py.example":[{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"76336984f94964f1f585ed786964e13c155bb723","unresolved":false,"context_lines":[{"line_number":427,"context_line":"#CUSTOM_THEME_PATH \u003d \u0027themes/default\u0027"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"# Enable or disable the different boot sources that will appear"},{"line_number":430,"context_line":"# on the launch instance form"},{"line_number":431,"context_line":"OPENSTACK_SOURCE_BOOT \u003d {"},{"line_number":432,"context_line":"    \u0027enable_image\u0027: True,"},{"line_number":433,"context_line":"    \u0027enable_snapshot\u0027: True,"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"3a57f1b5_7e2d0efd","line":430,"updated":"2016-02-11 19:31:22.000000000","message":"The following patch is starting a new section in the config file.  I think you should rebase on it and take advantage of it, nesting the settings inside of that one.\n\nhttps://review.openstack.org/#/c/271464/9/openstack_dashboard/local/local_settings.py.example","commit_id":"eb30fc8af4a40f8f46ee17812516e96b8927e4ce"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"0024fa16676594993a77c70ca8059ee3d2c6e920","unresolved":false,"context_lines":[{"line_number":427,"context_line":"#CUSTOM_THEME_PATH \u003d \u0027themes/default\u0027"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"# Enable or disable the different boot sources that will appear"},{"line_number":430,"context_line":"# on the launch instance form"},{"line_number":431,"context_line":"OPENSTACK_SOURCE_BOOT \u003d {"},{"line_number":432,"context_line":"    \u0027enable_image\u0027: True,"},{"line_number":433,"context_line":"    \u0027enable_snapshot\u0027: True,"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"3a57f1b5_5ec35957","line":430,"in_reply_to":"3a57f1b5_7e2d0efd","updated":"2016-02-12 09:08:00.000000000","message":"Sounds good! thanks for bringing that up.","commit_id":"eb30fc8af4a40f8f46ee17812516e96b8927e4ce"}],"releasenotes/notes/bp-configurable-boot-sources-4ba89f3b2a927801.yaml":[{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"bdfacc6e790b135fddb54bb70607b6280404ac85","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"   [`blueprint configurable-boot-sources \u003chttps://blueprints.launchpad.net/horizon/+spec/configurable-boot-sources\u003e`_]"},{"line_number":5,"context_line":"   Allows to restrict which sources are available to boot from in the"},{"line_number":6,"context_line":"   Launch Instance modal by adding 3 new settings to"},{"line_number":7,"context_line":"   LAUNCH_INSTANCE_DEFAULTS (disable_image, disable_snapshot, disable_volume)."}],"source_content_type":"text/x-yaml","patch_set":32,"id":"7af24918_81bc9f6d","line":5,"updated":"2016-03-02 04:42:40.000000000","message":"Allows administrators to ...","commit_id":"83037c63145aed288863d110c2f94b7df8e4676e"},{"author":{"_account_id":12826,"name":"Rob Cresswell","display_name":"robcresswell","email":"robert.cresswell@outlook.com","username":"rob-cresswell"},"change_message_id":"9af79cf720d76f802130cf97d6a8900b6b739912","unresolved":false,"context_lines":[{"line_number":4,"context_line":"   [`blueprint configurable-boot-sources \u003chttps://blueprints.launchpad.net/horizon/+spec/configurable-boot-sources\u003e`_]"},{"line_number":5,"context_line":"   Allows administrators to restrict which sources are available to boot from in the"},{"line_number":6,"context_line":"   Launch Instance modal by adding 3 new settings to"},{"line_number":7,"context_line":"   LAUNCH_INSTANCE_DEFAULTS (disable_image, disable_instance_snapshot, disable_volume)."}],"source_content_type":"text/x-yaml","patch_set":58,"id":"1aa78d24_bf7f8d13","line":7,"updated":"2016-07-07 09:45:02.000000000","message":"Are there not 4 new settings?","commit_id":"22585b0cc191cbf870e5b1628741bc89efdbccc2"},{"author":{"_account_id":7179,"name":"Brad Pokorny","email":"brad_pokorny@symantec.com","username":"bpokorny"},"change_message_id":"2fef1e4c01909b7052f30ae99305f9993df99d36","unresolved":false,"context_lines":[{"line_number":4,"context_line":"   [`blueprint configurable-boot-sources \u003chttps://blueprints.launchpad.net/horizon/+spec/configurable-boot-sources\u003e`_]"},{"line_number":5,"context_line":"   Allows administrators to restrict which sources are available to boot from in the"},{"line_number":6,"context_line":"   Launch Instance modal by adding 3 new settings to"},{"line_number":7,"context_line":"   LAUNCH_INSTANCE_DEFAULTS (disable_image, disable_instance_snapshot, disable_volume)."}],"source_content_type":"text/x-yaml","patch_set":58,"id":"bacf61ea_d46f0ffa","line":7,"in_reply_to":"1aa78d24_bf7f8d13","updated":"2016-08-04 20:32:35.000000000","message":"Done","commit_id":"22585b0cc191cbf870e5b1628741bc89efdbccc2"}]}
