)]}'
{"heat/engine/resources/software_config/multi_part.py":[{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"9868aacc587e8948c73950e43f4a480eeea9e3ec","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    ),"},{"line_number":63,"context_line":"                    TYPE: properties.Schema("},{"line_number":64,"context_line":"                        properties.Schema.STRING,"},{"line_number":65,"context_line":"                        _(\u0027Whether the part content is text or multitype.\u0027),"},{"line_number":66,"context_line":"                        default\u003dTEXT,"},{"line_number":67,"context_line":"                        constraints\u003d[constraints.AllowedValues(TYPES)]"},{"line_number":68,"context_line":"                    ),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2B2JE%3D","line":65,"updated":"2014-01-21 14:12:21.000000000","message":"Do you mean multipart?","commit_id":"4e05cbd674abf4adf8d40f9ce918fac72ff076dc"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"647e234d9499c0a0a8439dd0999399115e8080e8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    ),"},{"line_number":63,"context_line":"                    TYPE: properties.Schema("},{"line_number":64,"context_line":"                        properties.Schema.STRING,"},{"line_number":65,"context_line":"                        _(\u0027Whether the part content is text or multitype.\u0027),"},{"line_number":66,"context_line":"                        default\u003dTEXT,"},{"line_number":67,"context_line":"                        constraints\u003d[constraints.AllowedValues(TYPES)]"},{"line_number":68,"context_line":"                    ),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bxgc%3D","line":65,"in_reply_to":"AAAAUH%2F%2B2JE%3D","updated":"2014-01-22 09:54:31.000000000","message":"Done","commit_id":"4e05cbd674abf4adf8d40f9ce918fac72ff076dc"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"dc389234e918e1b2ee4edfb1cc5cd350c31942f9","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            part_type \u003d item.get(self.TYPE, self.TEXT)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            sc \u003d self.heat().software_configs.get(config_id)"},{"line_number":96,"context_line":"            part \u003d sc.config"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            if part_type \u003d\u003d self.MULTIPART:"},{"line_number":99,"context_line":"                self._append_multiparts(subparts, part)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Btvo%3D","line":96,"updated":"2014-01-22 21:24:26.000000000","message":"these 2 lines could be replaced with:\n\npart \u003d self.get_software_config(self.heat(), config_id)","commit_id":"76e80d09d1618928c7aa703aafeecfa7941216db"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"75d8933fabb32291a93f12a7ae8cb25066663828","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            part_type \u003d item.get(self.TYPE, self.TEXT)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            sc \u003d self.heat().software_configs.get(config_id)"},{"line_number":96,"context_line":"            part \u003d sc.config"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            if part_type \u003d\u003d self.MULTIPART:"},{"line_number":99,"context_line":"                self._append_multiparts(subparts, part)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Br%2Bc%3D","line":96,"in_reply_to":"AAAAUH%2F%2Btvo%3D","updated":"2014-01-23 07:07:38.000000000","message":"Done","commit_id":"76e80d09d1618928c7aa703aafeecfa7941216db"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"75f8c2fab1a6a50d05d71b2f12fe3c3b1bb05398","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @staticmethod"},{"line_number":131,"context_line":"    def _create_message(part, subtype, filename):"},{"line_number":132,"context_line":"        msg \u003d MIMEText(part, _subtype\u003dsubtype)"},{"line_number":133,"context_line":"        if filename:"},{"line_number":134,"context_line":"            msg.add_header(\u0027Content-Disposition\u0027, \u0027attachment\u0027,"},{"line_number":135,"context_line":"                           filename\u003dfilename)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Bsg8%3D","line":132,"updated":"2014-01-23 03:10:46.000000000","message":"Actually _subtype should only be specified if subtype is supplied, otherwise we end up with text/None and cloud-init doesn\u0027t run any scripts.","commit_id":"76e80d09d1618928c7aa703aafeecfa7941216db"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"75d8933fabb32291a93f12a7ae8cb25066663828","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @staticmethod"},{"line_number":131,"context_line":"    def _create_message(part, subtype, filename):"},{"line_number":132,"context_line":"        msg \u003d MIMEText(part, _subtype\u003dsubtype)"},{"line_number":133,"context_line":"        if filename:"},{"line_number":134,"context_line":"            msg.add_header(\u0027Content-Disposition\u0027, \u0027attachment\u0027,"},{"line_number":135,"context_line":"                           filename\u003dfilename)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Br9U%3D","line":132,"in_reply_to":"AAAAUH%2F%2Bsg8%3D","updated":"2014-01-23 07:07:38.000000000","message":"Done","commit_id":"76e80d09d1618928c7aa703aafeecfa7941216db"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6ca233932893faa40659c3ff656be7d1caf8b415","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    to this message."},{"line_number":32,"context_line":"    \u0027\u0027\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    PROPERTIES \u003d ("},{"line_number":35,"context_line":"        PARTS, CONFIG_ID, FILENAME, TYPE, SUBTYPE"},{"line_number":36,"context_line":"    ) \u003d ("},{"line_number":37,"context_line":"        \u0027parts\u0027, \u0027config_id\u0027, \u0027filename\u0027, \u0027type\u0027, \u0027subtype\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bbcc%3D","line":34,"updated":"2014-01-26 22:19:52.000000000","message":"Rename config_id to config","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"57c1851f358d396700b5b8e20d3cc62666f7b726","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    to this message."},{"line_number":32,"context_line":"    \u0027\u0027\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    PROPERTIES \u003d ("},{"line_number":35,"context_line":"        PARTS, CONFIG_ID, FILENAME, TYPE, SUBTYPE"},{"line_number":36,"context_line":"    ) \u003d ("},{"line_number":37,"context_line":"        \u0027parts\u0027, \u0027config_id\u0027, \u0027filename\u0027, \u0027type\u0027, \u0027subtype\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BKjg%3D","line":34,"in_reply_to":"AAAAUH%2F%2Bbcc%3D","updated":"2014-01-29 15:23:37.000000000","message":"Done","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6ca233932893faa40659c3ff656be7d1caf8b415","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                schema\u003d{"},{"line_number":54,"context_line":"                    CONFIG_ID: properties.Schema("},{"line_number":55,"context_line":"                        properties.Schema.STRING,"},{"line_number":56,"context_line":"                        _(\u0027Content of part to attach.\u0027),"},{"line_number":57,"context_line":"                        required\u003dTrue"},{"line_number":58,"context_line":"                    ),"},{"line_number":59,"context_line":"                    FILENAME: properties.Schema("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BbcE%3D","line":56,"updated":"2014-01-26 22:19:52.000000000","message":"\u0027Content of part to attach, either inline or by referencing the ID of another software config resource\u0027","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"57c1851f358d396700b5b8e20d3cc62666f7b726","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                schema\u003d{"},{"line_number":54,"context_line":"                    CONFIG_ID: properties.Schema("},{"line_number":55,"context_line":"                        properties.Schema.STRING,"},{"line_number":56,"context_line":"                        _(\u0027Content of part to attach.\u0027),"},{"line_number":57,"context_line":"                        required\u003dTrue"},{"line_number":58,"context_line":"                    ),"},{"line_number":59,"context_line":"                    FILENAME: properties.Schema("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BKjc%3D","line":56,"in_reply_to":"AAAAUH%2F%2BbcE%3D","updated":"2014-01-29 15:23:37.000000000","message":"Done","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6ca233932893faa40659c3ff656be7d1caf8b415","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        for item in self.properties.get(self.PARTS):"},{"line_number":92,"context_line":"            config_id \u003d item.get(self.CONFIG_ID)"},{"line_number":93,"context_line":"            part_type \u003d item.get(self.TYPE, self.TEXT)"},{"line_number":94,"context_line":"            part \u003d self.get_software_config(self.heat(), config_id)"},{"line_number":95,"context_line":"            if part_type \u003d\u003d self.MULTIPART:"},{"line_number":96,"context_line":"                self._append_multiparts(subparts, part)"},{"line_number":97,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bbbs%3D","line":94,"updated":"2014-01-26 22:19:52.000000000","message":"This can do the same as https://review.openstack.org/#/c/69238/ and fall back to including the config unmodified if get_software_config raises not found.","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"57c1851f358d396700b5b8e20d3cc62666f7b726","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        for item in self.properties.get(self.PARTS):"},{"line_number":92,"context_line":"            config_id \u003d item.get(self.CONFIG_ID)"},{"line_number":93,"context_line":"            part_type \u003d item.get(self.TYPE, self.TEXT)"},{"line_number":94,"context_line":"            part \u003d self.get_software_config(self.heat(), config_id)"},{"line_number":95,"context_line":"            if part_type \u003d\u003d self.MULTIPART:"},{"line_number":96,"context_line":"                self._append_multiparts(subparts, part)"},{"line_number":97,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BKjY%3D","line":94,"in_reply_to":"AAAAUH%2F%2Bbbs%3D","updated":"2014-01-29 15:23:37.000000000","message":"Done","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"0b367ffdce3bfb914801f65bf5cc9a75b67dd3d0","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        mime_blob \u003d MIMEMultipart(_subparts\u003dsubparts)"},{"line_number":103,"context_line":"        self.message \u003d mime_blob.as_string()"},{"line_number":104,"context_line":"        return self.message"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @staticmethod"},{"line_number":107,"context_line":"    def _append_multiparts(subparts, multi_part):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BqrE%3D","line":104,"updated":"2014-01-23 11:53:31.000000000","message":"So there\u0027s no way to get the message via Ref or a resource attribute, meaning this resource is useless outside the context of software-config?\n\nI think we\u0027re missing an opportunity to make this more generic as it\u0027s not impossible that other non-software-config use-cases may arise.","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"57c1851f358d396700b5b8e20d3cc62666f7b726","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        mime_blob \u003d MIMEMultipart(_subparts\u003dsubparts)"},{"line_number":103,"context_line":"        self.message \u003d mime_blob.as_string()"},{"line_number":104,"context_line":"        return self.message"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @staticmethod"},{"line_number":107,"context_line":"    def _append_multiparts(subparts, multi_part):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BKjQ%3D","line":104,"in_reply_to":"AAAAUH%2F%2BK5k%3D","updated":"2014-01-29 15:23:37.000000000","message":"Done","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"b33cf55176cbbfacedc400a3916b72a5990a6ed0","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        mime_blob \u003d MIMEMultipart(_subparts\u003dsubparts)"},{"line_number":103,"context_line":"        self.message \u003d mime_blob.as_string()"},{"line_number":104,"context_line":"        return self.message"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @staticmethod"},{"line_number":107,"context_line":"    def _append_multiparts(subparts, multi_part):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BK5k%3D","line":104,"in_reply_to":"AAAAUH%2F%2BnMg%3D","updated":"2014-01-29 13:55:00.000000000","message":"So seemly 3 usages:\n1. inline content,\n2. inline uuid - config id\n3. Ref(other config)","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"f2f1098ddfa31d508cf127d4739bb4645a19cbc5","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        mime_blob \u003d MIMEMultipart(_subparts\u003dsubparts)"},{"line_number":103,"context_line":"        self.message \u003d mime_blob.as_string()"},{"line_number":104,"context_line":"        return self.message"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @staticmethod"},{"line_number":107,"context_line":"    def _append_multiparts(subparts, multi_part):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BnMg%3D","line":104,"in_reply_to":"AAAAUH%2F%2BqrE%3D","updated":"2014-01-23 22:05:10.000000000","message":"The same could be done here as what I\u0027m planning for Server user_data. If it looks like a uuid, attempt to load software config with that uuid. If load fails or it is not a uuid then just use that string as the content.","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"}],"heat/tests/test_multi_part.py":[{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"9868aacc587e8948c73950e43f4a480eeea9e3ec","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        args \u003d self.software_configs.create.call_args[1]"},{"line_number":64,"context_line":"        self.assertEqual(self.config.message, args[\u0027config\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test_get_message(self):"},{"line_number":67,"context_line":"        self.config.message \u003d \u0027Not none\u0027"},{"line_number":68,"context_line":"        result \u003d self.config.get_message()"},{"line_number":69,"context_line":"        self.assertEqual(\u0027Not none\u0027, result)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2B2Fs%3D","line":66,"updated":"2014-01-21 14:12:21.000000000","message":"This test should be split in 4.","commit_id":"4e05cbd674abf4adf8d40f9ce918fac72ff076dc"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"647e234d9499c0a0a8439dd0999399115e8080e8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        args \u003d self.software_configs.create.call_args[1]"},{"line_number":64,"context_line":"        self.assertEqual(self.config.message, args[\u0027config\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test_get_message(self):"},{"line_number":67,"context_line":"        self.config.message \u003d \u0027Not none\u0027"},{"line_number":68,"context_line":"        result \u003d self.config.get_message()"},{"line_number":69,"context_line":"        self.assertEqual(\u0027Not none\u0027, result)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BxgQ%3D","line":66,"in_reply_to":"AAAAUH%2F%2B2Fs%3D","updated":"2014-01-22 09:54:31.000000000","message":"Done","commit_id":"4e05cbd674abf4adf8d40f9ce918fac72ff076dc"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"3911053100a095145a4c7118b03ee79c39932623","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                     \u0027MIME-Version: 1.0\\n\u0027"},{"line_number":112,"context_line":"                     \u0027\\n--\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d2579792489038011818\u003d\u003d\u0027"},{"line_number":113,"context_line":"                     \u0027\\nContent-Type: \u0027"},{"line_number":114,"context_line":"                     \u0027text//opt/stack/configure.d/55-heat-config; \u0027"},{"line_number":115,"context_line":"                     \u0027charset\u003d\"us-ascii\"\\n\u0027"},{"line_number":116,"context_line":"                     \u0027MIME-Version: 1.0\\n\u0027"},{"line_number":117,"context_line":"                     \u0027Content-Transfer-Encoding: 7bit\\n\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BmsQ%3D","line":114,"updated":"2014-01-23 23:17:01.000000000","message":"This Content-Type looks a bit weird.","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"57c1851f358d396700b5b8e20d3cc62666f7b726","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                     \u0027MIME-Version: 1.0\\n\u0027"},{"line_number":112,"context_line":"                     \u0027\\n--\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d2579792489038011818\u003d\u003d\u0027"},{"line_number":113,"context_line":"                     \u0027\\nContent-Type: \u0027"},{"line_number":114,"context_line":"                     \u0027text//opt/stack/configure.d/55-heat-config; \u0027"},{"line_number":115,"context_line":"                     \u0027charset\u003d\"us-ascii\"\\n\u0027"},{"line_number":116,"context_line":"                     \u0027MIME-Version: 1.0\\n\u0027"},{"line_number":117,"context_line":"                     \u0027Content-Transfer-Encoding: 7bit\\n\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BKhs%3D","line":114,"in_reply_to":"AAAAUH%2F%2BmsQ%3D","updated":"2014-01-29 15:23:37.000000000","message":"Done","commit_id":"154e91c8f42443876bc18aa0cfc46a47673b9289"}]}
