)]}'
{"heat/engine/resources/software_config/software_deployment.py":[{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"b29f4f040fd0f8c9124d8cca3acf9279a62b3c78","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    PROPERTIES \u003d ("},{"line_number":30,"context_line":"        CONFIG_ID, SERVER_ID, INPUT_VALUES"},{"line_number":31,"context_line":"    ) \u003d ("},{"line_number":32,"context_line":"        \u0027config_id\u0027, \u0027server_id\u0027, \u0027input_values\u0027"},{"line_number":33,"context_line":"    )"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    DEPLOY_ACTIONS \u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Fsq8%3D","line":32,"updated":"2014-02-11 12:09:18.000000000","message":"Not a really big issue, but what about calling the first two properties \u0027config\u0027 and \u0027server\u0027 as we had originally defined in the spec wiki? I would find this more intuitive for the user when writing a template:\n\n resources:\n   sw_config:\n     type: OS::Heat::SoftwareConfig\n\n   sw_deployment:\n     type: OS::Heat::SoftwareDeployment\n     properties:\n       config: { get_resource: sw_config }\n       server: { get_resource: my_server }\n\n   my_server:\n     type: OS::Nova::Server\n\nThat is, \u0027config\u0027 and \u0027server\u0027 get set via get_resource -\u003e you get a resource. Under the covers of course, we get the ID, but for a user setting config_id or server_id could be confusing because it sounds like you want a property of config or server. I know, people who have been using Heat for a while will be able to deal with it, but we have to keep new users in mind as well.","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"0a6de08f6fdd7371b3b1871cef4472b3995e418b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    PROPERTIES \u003d ("},{"line_number":30,"context_line":"        CONFIG_ID, SERVER_ID, INPUT_VALUES"},{"line_number":31,"context_line":"    ) \u003d ("},{"line_number":32,"context_line":"        \u0027config_id\u0027, \u0027server_id\u0027, \u0027input_values\u0027"},{"line_number":33,"context_line":"    )"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    DEPLOY_ACTIONS \u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FkO8%3D","line":32,"in_reply_to":"AAAAUX%2F%2FoUs%3D","updated":"2014-02-12 10:04:05.000000000","message":"Interesting use case. So sounds like we would just make \u0027config\u0027 optional. So do we go with property names \u0027config\u0027 and \u0027server\u0027, or should we go with \u0027software_config\u0027 and \u0027server\u0027 as Jun Jie suggested? Both sound fine with me as long as we remove the _id part.","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"643997c8c373e97b0197a7948510c1bb329349d2","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    PROPERTIES \u003d ("},{"line_number":30,"context_line":"        CONFIG_ID, SERVER_ID, INPUT_VALUES"},{"line_number":31,"context_line":"    ) \u003d ("},{"line_number":32,"context_line":"        \u0027config_id\u0027, \u0027server_id\u0027, \u0027input_values\u0027"},{"line_number":33,"context_line":"    )"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    DEPLOY_ACTIONS \u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FoUs%3D","line":32,"in_reply_to":"AAAAUX%2F%2FsEY%3D","updated":"2014-02-11 21:38:35.000000000","message":"If we called it config then maybe we can do what we did in MultipartMime. Check for UUIDness and do a config lookup or treat it as an inline config script.\n\nConfig resources also declare inputs/outputs but I\u0027ve been thinking of creating an implicit String input for any deployment input_value which doesn\u0027t have a corresponding config input declaration. Outputs could be handled by adding an output_attributes property to SoftwareDeployment.\n\nThis would mean for some simple cases a SoftwareConfig resource would not be needed at all","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"fe9ca499f865de15f2814e74ee8b652704e0d194","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    PROPERTIES \u003d ("},{"line_number":30,"context_line":"        CONFIG_ID, SERVER_ID, INPUT_VALUES"},{"line_number":31,"context_line":"    ) \u003d ("},{"line_number":32,"context_line":"        \u0027config_id\u0027, \u0027server_id\u0027, \u0027input_values\u0027"},{"line_number":33,"context_line":"    )"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    DEPLOY_ACTIONS \u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FsEY%3D","line":32,"in_reply_to":"AAAAUX%2F%2Fsq8%3D","updated":"2014-02-11 13:53:52.000000000","message":"config is not good, maybe software_config is better. We already use config as property name of SoftwareConfig. When we use config in SoftwareDeployment, its meaning changed: it\u0027s software config actually.","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"74a909d99f9d225a6820a4d8dee44ebc7d63e474","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    DEPLOY_STATUSES \u003d ("},{"line_number":42,"context_line":"        WAITING, RECEIVED, FAILED"},{"line_number":43,"context_line":"    ) \u003d ("},{"line_number":44,"context_line":"        \u0027WAITING\u0027, \u0027RECEIVED\u0027, \u0027FAILED\u0027"},{"line_number":45,"context_line":"    )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    properties_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Fs6A%3D","line":44,"updated":"2014-02-11 11:23:43.000000000","message":"Do we want the statuses to be different from every other resource?\n\nWould e.g DEPLOY_IN_PROGRESS, DEPLOY_COMPLETE etc not be just as clear, and more consistent?","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"f3d2a491425ecf2320c610c0b9eaca622ed41c69","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    DEPLOY_STATUSES \u003d ("},{"line_number":42,"context_line":"        WAITING, RECEIVED, FAILED"},{"line_number":43,"context_line":"    ) \u003d ("},{"line_number":44,"context_line":"        \u0027WAITING\u0027, \u0027RECEIVED\u0027, \u0027FAILED\u0027"},{"line_number":45,"context_line":"    )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    properties_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Fjq4%3D","line":44,"in_reply_to":"AAAAUX%2F%2FoXk%3D","updated":"2014-02-12 11:21:56.000000000","message":"I think we should stick to the existing resource conventions unless there\u0027s a really strong argument against - in this case I personally think the new statuses are just different and not necessarily any clearer, so consistency with every other resource is probably more important IMHO.\n\nAlso, we don\u0027t expose the underlying status of e.g nova, we always use the same IN_PROGRESS/COMPLETE/FAILED top-level status, so this is just the same, even if you do decide the ReST API should have more granular or different statuses.","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"fe9ca499f865de15f2814e74ee8b652704e0d194","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    DEPLOY_STATUSES \u003d ("},{"line_number":42,"context_line":"        WAITING, RECEIVED, FAILED"},{"line_number":43,"context_line":"    ) \u003d ("},{"line_number":44,"context_line":"        \u0027WAITING\u0027, \u0027RECEIVED\u0027, \u0027FAILED\u0027"},{"line_number":45,"context_line":"    )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    properties_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FsKg%3D","line":44,"in_reply_to":"AAAAUX%2F%2Fs6A%3D","updated":"2014-02-11 13:53:52.000000000","message":"For me WAITING is not better than IN_PROGRESS so I prefer to keep consistent with other resources.","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"643997c8c373e97b0197a7948510c1bb329349d2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    DEPLOY_STATUSES \u003d ("},{"line_number":42,"context_line":"        WAITING, RECEIVED, FAILED"},{"line_number":43,"context_line":"    ) \u003d ("},{"line_number":44,"context_line":"        \u0027WAITING\u0027, \u0027RECEIVED\u0027, \u0027FAILED\u0027"},{"line_number":45,"context_line":"    )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    properties_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FoXk%3D","line":44,"in_reply_to":"AAAAUX%2F%2FsKg%3D","updated":"2014-02-11 21:38:35.000000000","message":"The attempt here was to use semantics which most closely matched what deployments are doing, since they have their own REST API. But I don\u0027t object to moving to IN_PROGRESS...","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"b7775db49cc95d0fae0a0a26e115701c5394dfaa","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        props \u003d dict(self.properties)"},{"line_number":129,"context_line":"        props.update(prop_diff)"},{"line_number":130,"context_line":"        sc \u003d self.heat().software_deployments.get(self.resource_id)"},{"line_number":131,"context_line":"        sc.update(**props)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def FnGetAtt(self, key):"},{"line_number":134,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FlvM%3D","line":131,"updated":"2014-02-12 06:15:28.000000000","message":"Do we need to trigger the metadata updating of the corresponding server here?","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"392bd9813de09f951c74601f3b6a580f868de8a4","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        props \u003d dict(self.properties)"},{"line_number":129,"context_line":"        props.update(prop_diff)"},{"line_number":130,"context_line":"        sc \u003d self.heat().software_deployments.get(self.resource_id)"},{"line_number":131,"context_line":"        sc.update(**props)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def FnGetAtt(self, key):"},{"line_number":134,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FerE%3D","line":131,"in_reply_to":"AAAAUX%2F%2FlvM%3D","updated":"2014-02-12 22:02:18.000000000","message":"No. os-collect-config will poll the server resource metadata for deployments changes. If the metadata changes os-collect-config triggers the os-refresh-config scripts","commit_id":"4862f4503d7adab0fdbd3e213b57506db825f15d"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"691785f20d66e3011c7ef89e430dfc7e577f05f6","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @staticmethod"},{"line_number":96,"context_line":"    def _build_properties(properties, action, signal_id):"},{"line_number":97,"context_line":"        props \u003d {"},{"line_number":98,"context_line":"            \u0027config_id\u0027: properties[SoftwareDeployment.CONFIG],"},{"line_number":99,"context_line":"            \u0027server_id\u0027: properties[SoftwareDeployment.SERVER],"},{"line_number":100,"context_line":"            SoftwareDeployment.INPUT_VALUES: properties["},{"line_number":101,"context_line":"                SoftwareDeployment.INPUT_VALUES],"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2B67I%3D","line":98,"updated":"2014-02-18 07:38:17.000000000","message":"Shouldn\u0027t this be changed to \u0027config\u0027 or SoftwareDeployment.CONFIG to match the properties schema above?\n\nSame for \u0027server_id\u0027.","commit_id":"7ac05abc3952b1d381f3e60ea795039e8b06ae60"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"484c8997e0bbb7f89e6a0b48baf29b89c32a6aa3","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @staticmethod"},{"line_number":96,"context_line":"    def _build_properties(properties, action, signal_id):"},{"line_number":97,"context_line":"        props \u003d {"},{"line_number":98,"context_line":"            \u0027config_id\u0027: properties[SoftwareDeployment.CONFIG],"},{"line_number":99,"context_line":"            \u0027server_id\u0027: properties[SoftwareDeployment.SERVER],"},{"line_number":100,"context_line":"            SoftwareDeployment.INPUT_VALUES: properties["},{"line_number":101,"context_line":"                SoftwareDeployment.INPUT_VALUES],"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2Bwz8%3D","line":98,"in_reply_to":"AAAAUX%2F%2B0y8%3D","updated":"2014-02-19 08:06:33.000000000","message":"Thanks for the clarification. Makes sense.","commit_id":"7ac05abc3952b1d381f3e60ea795039e8b06ae60"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"05c1e40073b0a714a02c26dd5b04728a43480e5d","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    @staticmethod"},{"line_number":96,"context_line":"    def _build_properties(properties, action, signal_id):"},{"line_number":97,"context_line":"        props \u003d {"},{"line_number":98,"context_line":"            \u0027config_id\u0027: properties[SoftwareDeployment.CONFIG],"},{"line_number":99,"context_line":"            \u0027server_id\u0027: properties[SoftwareDeployment.SERVER],"},{"line_number":100,"context_line":"            SoftwareDeployment.INPUT_VALUES: properties["},{"line_number":101,"context_line":"                SoftwareDeployment.INPUT_VALUES],"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2B0y8%3D","line":98,"in_reply_to":"AAAAUX%2F%2B67I%3D","updated":"2014-02-18 19:31:49.000000000","message":"I think the API should remain config_id and server_id. One day this resource may allow an inline config so it will create a config resource here and then use its config_id.\n\nThe emphasis for the resource schema is for a good user experience, so it is allowed to diverge a little from the underlying API","commit_id":"7ac05abc3952b1d381f3e60ea795039e8b06ae60"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"0d31148753f2359db4e2871c20adfcdf5c0dcdbf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from heat.engine import signal_responder"},{"line_number":22,"context_line":"from heat.engine import resource"},{"line_number":23,"context_line":"from heat.engine.resources.software_config import software_config as sc"},{"line_number":24,"context_line":"from heat.openstack.common.gettextutils import _"},{"line_number":25,"context_line":"from heat.openstack.common import log as logging"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import heatclient.exc as heat_exp"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2Fjik%3D","line":24,"updated":"2014-02-26 07:31:12.000000000","message":"Odd that we need _ .. seems like any of the entry points will do that for us.","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"9f4ed6a1ed47d2ce14c7229e0d9850b674e02714","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from heat.engine import signal_responder"},{"line_number":22,"context_line":"from heat.engine import resource"},{"line_number":23,"context_line":"from heat.engine.resources.software_config import software_config as sc"},{"line_number":24,"context_line":"from heat.openstack.common.gettextutils import _"},{"line_number":25,"context_line":"from heat.openstack.common import log as logging"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import heatclient.exc as heat_exp"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZgQ%3D","line":24,"in_reply_to":"AAAAU3%2F%2Fjik%3D","updated":"2014-02-26 21:29:14.000000000","message":"Done","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"0d31148753f2359db4e2871c20adfcdf5c0dcdbf","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def _delete_resource(self):"},{"line_number":255,"context_line":"        self._delete_user()"},{"line_number":256,"context_line":"        self._delete_signed_url()"},{"line_number":257,"context_line":"        derived_config_id \u003d None"},{"line_number":258,"context_line":"        if self.resource_id is not None:"},{"line_number":259,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2Fg%2FM%3D","line":256,"updated":"2014-02-26 07:31:12.000000000","message":"It seems to me that conceptually you would want to delete the signed url first, then the user that it grants access to.","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"9f4ed6a1ed47d2ce14c7229e0d9850b674e02714","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def _delete_resource(self):"},{"line_number":255,"context_line":"        self._delete_user()"},{"line_number":256,"context_line":"        self._delete_signed_url()"},{"line_number":257,"context_line":"        derived_config_id \u003d None"},{"line_number":258,"context_line":"        if self.resource_id is not None:"},{"line_number":259,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZgU%3D","line":256,"in_reply_to":"AAAAU3%2F%2Fg%2FM%3D","updated":"2014-02-26 21:29:14.000000000","message":"Done","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"e8ccbb480406aa939fdd18596422f3156ccbf74c","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def handle_create(self):"},{"line_number":246,"context_line":"        self._create_user()"},{"line_number":247,"context_line":"        self._create_keypair()"},{"line_number":248,"context_line":"        return self._handle_action(self.CREATE)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def check_create_complete(self, sd):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2FyXY%3D","line":247,"updated":"2014-02-28 09:37:43.000000000","message":"Is there any way we can add a property which specifies the signal auth method?\n\nI\u0027m thinking here we could choose between creating a keypair (signal comes via ec2 signed AlarmUrl) or setting self.password before _create_user, then the signal could come via heat resource-signal.\n\nThen in the username/password case we could append the credentials to the instance metadata, using the server ID supplied?\n\nThis seems like a relatively simple tweak which would allow this stuff to work with native auth, satisfying those who can\u0027t or won\u0027t enable ec2token auth in their environments, what are your thoughts?","commit_id":"6d80ee80ca53b46b84dd6f22e1f22ec8db973479"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"567219eed3ee0641ae091ba8f0b988156401425c","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def handle_create(self):"},{"line_number":246,"context_line":"        self._create_user()"},{"line_number":247,"context_line":"        self._create_keypair()"},{"line_number":248,"context_line":"        return self._handle_action(self.CREATE)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def check_create_complete(self, sd):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2F%2FqU%3D","line":247,"in_reply_to":"AAAAVX%2F%2FyXY%3D","updated":"2014-03-02 20:18:54.000000000","message":"Just to future-proof this a bit, rather than thinking about auth method we should maybe be thinking about signal method. So a property signal_method could have values EC2_SIGNAL or HEAT_SIGNAL. In the future we could add MARCONI_MESSAGE or somesuch.","commit_id":"6d80ee80ca53b46b84dd6f22e1f22ec8db973479"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"48a4865938f1711a4bdef62ca04891cbe27e03cb","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def handle_create(self):"},{"line_number":246,"context_line":"        self._create_user()"},{"line_number":247,"context_line":"        self._create_keypair()"},{"line_number":248,"context_line":"        return self._handle_action(self.CREATE)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def check_create_complete(self, sd):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2F7S8%3D","line":247,"in_reply_to":"AAAAVn%2F%2F%2FqU%3D","updated":"2014-03-03 11:28:57.000000000","message":"Possibly, although the only difference between EC2_SIGNAL and HEAT_SIGNAL is the auth method - they are both the same signal API which end up in handle_signal, whereas I\u0027m not certain a marconi message would be handled via the same interface?\n\nEither way, my concern is just to get the interfaces in a state where we can add support for not creating any keypair and instead using heat resource-signal, so whatever interface makes most sense to you is fine.","commit_id":"6d80ee80ca53b46b84dd6f22e1f22ec8db973479"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"e8ccbb480406aa939fdd18596422f3156ccbf74c","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            status_reason \u003d _(\u0027Outputs received\u0027)"},{"line_number":344,"context_line":"        sd.update(output_values\u003dov, status\u003dstatus, status_reason\u003dstatus_reason)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def FnGetAtt(self, key):"},{"line_number":347,"context_line":"        \u0027\u0027\u0027"},{"line_number":348,"context_line":"        Resource attributes map to deployment outputs values"},{"line_number":349,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2FyZ8%3D","line":346,"updated":"2014-02-28 09:37:43.000000000","message":"Shouldn\u0027t this be _resolve_attributes now we\u0027re using the new style attributes schema?","commit_id":"6d80ee80ca53b46b84dd6f22e1f22ec8db973479"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"567219eed3ee0641ae091ba8f0b988156401425c","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            status_reason \u003d _(\u0027Outputs received\u0027)"},{"line_number":344,"context_line":"        sd.update(output_values\u003dov, status\u003dstatus, status_reason\u003dstatus_reason)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def FnGetAtt(self, key):"},{"line_number":347,"context_line":"        \u0027\u0027\u0027"},{"line_number":348,"context_line":"        Resource attributes map to deployment outputs values"},{"line_number":349,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2F%2Fps%3D","line":346,"in_reply_to":"AAAAVX%2F%2FyZ8%3D","updated":"2014-03-02 20:18:54.000000000","message":"I think _resolve_attributes requires a static attributes schema, and this is currently dynamic based on the outputs schema of the config. Maybe in the future we could try a @property attributes_schema which builds it from the config outputs but I\u0027d like to avoid that at this late stage.","commit_id":"6d80ee80ca53b46b84dd6f22e1f22ec8db973479"}],"heat/tests/test_software_deployment.py":[{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"691785f20d66e3011c7ef89e430dfc7e577f05f6","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        args \u003d self.deployments.create.call_args[1]"},{"line_number":126,"context_line":"        self.assertEqual("},{"line_number":127,"context_line":"            {\u0027action\u0027: \u0027CREATE\u0027,"},{"line_number":128,"context_line":"             \u0027config_id\u0027: \u002748e8ade1-9196-42d5-89a2-f709fde42632\u0027,"},{"line_number":129,"context_line":"             \u0027input_values\u0027: {},"},{"line_number":130,"context_line":"             \u0027server_id\u0027: \u00279f1f0e00-05d2-4ca5-8602-95021f19c9d0\u0027,"},{"line_number":131,"context_line":"             \u0027signal_id\u0027: \u0027http://192.0.2.2/signed_url\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2B64w%3D","line":128,"updated":"2014-02-18 07:38:17.000000000","message":"Again a mismatch with the properties schema of the SoftwareDeployment resource: shouldn\u0027t this be \u0027config\u0027? Or maybe I am misunderstanding some difference between user-observed properties and internal values? If so, I think it would still be nice to always use the same property name.\n\nSame for \u0027server_id\u0027 below.","commit_id":"7ac05abc3952b1d381f3e60ea795039e8b06ae60"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"0d31148753f2359db4e2871c20adfcdf5c0dcdbf","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_create_user\u0027)"},{"line_number":81,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_create_keypair\u0027)"},{"line_number":82,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_delete_user\u0027)"},{"line_number":83,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_delete_signed_url\u0027)"},{"line_number":84,"context_line":"        get_signed_url \u003d self.patchobject("},{"line_number":85,"context_line":"            sd.SoftwareDeployment, \u0027_get_signed_url\u0027)"},{"line_number":86,"context_line":"        get_signed_url.return_value \u003d \u0027http://192.0.2.2/signed_url\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2Fg2M%3D","line":83,"updated":"2014-02-26 07:31:12.000000000","message":"I\u0027m curious why we are patching the internal calls of the SoftwareDeployment object, and not the external calls to heatclient.","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"9f4ed6a1ed47d2ce14c7229e0d9850b674e02714","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_create_user\u0027)"},{"line_number":81,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_create_keypair\u0027)"},{"line_number":82,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_delete_user\u0027)"},{"line_number":83,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_delete_signed_url\u0027)"},{"line_number":84,"context_line":"        get_signed_url \u003d self.patchobject("},{"line_number":85,"context_line":"            sd.SoftwareDeployment, \u0027_get_signed_url\u0027)"},{"line_number":86,"context_line":"        get_signed_url.return_value \u003d \u0027http://192.0.2.2/signed_url\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2FZZY%3D","line":83,"in_reply_to":"AAAAU3%2F%2Fakk%3D","updated":"2014-02-26 21:29:14.000000000","message":"I wanted to patch out the above calls since they are unit tested elsewhere and none of them return anything. heatclient calls are handled with the MagicMock below, and used throughout the tests for asserts.","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"7a2df1e6546902b48495cfa23112b30bcf233529","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_create_user\u0027)"},{"line_number":81,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_create_keypair\u0027)"},{"line_number":82,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_delete_user\u0027)"},{"line_number":83,"context_line":"        self.patchobject(sd.SoftwareDeployment, \u0027_delete_signed_url\u0027)"},{"line_number":84,"context_line":"        get_signed_url \u003d self.patchobject("},{"line_number":85,"context_line":"            sd.SoftwareDeployment, \u0027_get_signed_url\u0027)"},{"line_number":86,"context_line":"        get_signed_url.return_value \u003d \u0027http://192.0.2.2/signed_url\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2Fakk%3D","line":83,"in_reply_to":"AAAAU3%2F%2Fg2M%3D","updated":"2014-02-26 19:12:34.000000000","message":"Just to expand on this, I ran the coverage report and it seems those are covered during tests, though I\u0027m not entirely certain how. Perhaps I don\u0027t understand patchobject.\n\nThere are a few missing bits of coverage, mostly around handling NotFound errors when looking for software_config objects.","commit_id":"dc5955d3c1dd7cd1df3c83da14c7fd58ebb3e402"}]}
