)]}'
{"karbor/api/v1/plans.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"8f7b21642c8389e452eb129060dc7d5cf9bb821d","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":433,"context_line":"            properties \u003d options_schema[resource_type][\"properties\"]"},{"line_number":434,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":435,"context_line":"            if not set(property_list_schema) \u003e set(parameter_value.keys()):"},{"line_number":436,"context_line":"                msg \u003d _(\"The protect property of plan parameters \""},{"line_number":437,"context_line":"                        \"is invalid.\")"},{"line_number":438,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_80263db7","line":435,"range":{"start_line":435,"start_character":23,"end_line":435,"end_character":43},"updated":"2017-05-15 12:31:44.000000000","message":"s/property_list_schema/properties.keys()","commit_id":"ceda0f59eef9e2f884aa3a0356d9352e99e4ca2c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b0fadb80793f5b6f8d00a158c419d77a1df609ab","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":433,"context_line":"            properties \u003d options_schema[resource_type][\"properties\"]"},{"line_number":434,"context_line":"            property_list_schema \u003d properties.keys()"},{"line_number":435,"context_line":"            if not set(property_list_schema) \u003e set(parameter_value.keys()):"},{"line_number":436,"context_line":"                msg \u003d _(\"The protect property of plan parameters \""},{"line_number":437,"context_line":"                        \"is invalid.\")"},{"line_number":438,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_0d491dcf","line":435,"range":{"start_line":435,"start_character":23,"end_line":435,"end_character":43},"in_reply_to":"1f013ff3_80263db7","updated":"2017-05-16 15:26:32.000000000","message":"Done","commit_id":"ceda0f59eef9e2f884aa3a0356d9352e99e4ca2c"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"a5a194b537ff990b4c0c432f6198d4696828533b","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def validate_plan_parameters(self, context, plan):"},{"line_number":412,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":413,"context_line":"        if not parameters:"},{"line_number":414,"context_line":"            return"},{"line_number":415,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":416,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":417,"context_line":"        options_schema \u003d provider.get("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_1d4cd0c5","line":414,"range":{"start_line":413,"start_character":0,"end_line":414,"end_character":18},"updated":"2017-05-18 11:37:32.000000000","message":"couldn\u0027t parameters be empty? (for example, if provider doesn\u0027t require any)","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cc98c58b0b7c3d9ee346cad5cebec54f636459e6","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def validate_plan_parameters(self, context, plan):"},{"line_number":412,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":413,"context_line":"        if not parameters:"},{"line_number":414,"context_line":"            return"},{"line_number":415,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":416,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":417,"context_line":"        options_schema \u003d provider.get("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_004d8371","line":414,"range":{"start_line":413,"start_character":0,"end_line":414,"end_character":18},"in_reply_to":"ff0f0b1f_1d4cd0c5","updated":"2017-05-18 11:49:48.000000000","message":"yes The parameters could be empty.","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"a5a194b537ff990b4c0c432f6198d4696828533b","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":413,"context_line":"        if not parameters:"},{"line_number":414,"context_line":"            return"},{"line_number":415,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":416,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":417,"context_line":"        options_schema \u003d provider.get("},{"line_number":418,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":419,"context_line":"        if options_schema is None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_ddcbf81b","line":416,"range":{"start_line":415,"start_character":0,"end_line":416,"end_character":41},"updated":"2017-05-18 11:37:32.000000000","message":"what if this fails?","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cc98c58b0b7c3d9ee346cad5cebec54f636459e6","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":413,"context_line":"        if not parameters:"},{"line_number":414,"context_line":"            return"},{"line_number":415,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":416,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":417,"context_line":"        options_schema \u003d provider.get("},{"line_number":418,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":419,"context_line":"        if options_schema is None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_0076a3a5","line":416,"range":{"start_line":415,"start_character":0,"end_line":416,"end_character":41},"in_reply_to":"ff0f0b1f_ddcbf81b","updated":"2017-05-18 11:49:48.000000000","message":"I will add a try - except.","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"a5a194b537ff990b4c0c432f6198d4696828533b","unresolved":false,"context_lines":[{"line_number":418,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":419,"context_line":"        if options_schema is None:"},{"line_number":420,"context_line":"            msg \u003d _(\"The option schema of plugin must be provided.\")"},{"line_number":421,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":422,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":423,"context_line":"            if \"#\" in resource_key:"},{"line_number":424,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_fdefdc84","line":421,"range":{"start_line":421,"start_character":0,"end_line":421,"end_character":52},"updated":"2017-05-18 11:37:32.000000000","message":"who handles that?","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"cc98c58b0b7c3d9ee346cad5cebec54f636459e6","unresolved":false,"context_lines":[{"line_number":418,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":419,"context_line":"        if options_schema is None:"},{"line_number":420,"context_line":"            msg \u003d _(\"The option schema of plugin must be provided.\")"},{"line_number":421,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":422,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":423,"context_line":"            if \"#\" in resource_key:"},{"line_number":424,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_40913b99","line":421,"range":{"start_line":421,"start_character":0,"end_line":421,"end_character":52},"in_reply_to":"ff0f0b1f_fdefdc84","updated":"2017-05-18 11:49:48.000000000","message":"This exception will return to client directly with a http status code 400 BAD_REQUEST.","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"328950806126395fe63ce25594583c23786add74","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                    \"a plan.\")"},{"line_number":409,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def validate_plan_parameters(self, context, plan):"},{"line_number":412,"context_line":"        parameters \u003d plan[\"parameters\"]"},{"line_number":413,"context_line":"        if not parameters:"},{"line_number":414,"context_line":"            return"},{"line_number":415,"context_line":"        provider \u003d self.protection_api.show_provider("},{"line_number":416,"context_line":"            context, plan[\"provider_id\"])"},{"line_number":417,"context_line":"        options_schema \u003d provider.get("},{"line_number":418,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":419,"context_line":"        if options_schema is None:"},{"line_number":420,"context_line":"            msg \u003d _(\"The option schema of plugin must be provided.\")"},{"line_number":421,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":422,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":423,"context_line":"            if \"#\" in resource_key:"},{"line_number":424,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"},{"line_number":425,"context_line":"                if not uuidutils.is_uuid_like(resource_id):"},{"line_number":426,"context_line":"                    msg \u003d _(\"The resource_id must be a uuid.\")"},{"line_number":427,"context_line":"                    raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":428,"context_line":"            else:"},{"line_number":429,"context_line":"                resource_type \u003d resource_key"},{"line_number":430,"context_line":"            if resource_type not in constants.RESOURCE_TYPES:"},{"line_number":431,"context_line":"                msg \u003d _(\"The key of plan parameters is invalid.\")"},{"line_number":432,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":433,"context_line":"            properties \u003d options_schema[resource_type][\"properties\"]"},{"line_number":434,"context_line":"            if not set(properties.keys()) \u003e set(parameter_value.keys()):"},{"line_number":435,"context_line":"                msg \u003d _(\"The protect property of plan parameters \""},{"line_number":436,"context_line":"                        \"is invalid.\")"},{"line_number":437,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def create_resource():"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_4e0d138f","line":437,"range":{"start_line":411,"start_character":0,"end_line":437,"end_character":56},"updated":"2017-05-17 13:16:23.000000000","message":"Move the validation about provider, schema, and resource types to the protection service.","commit_id":"97a718b3b538b77d4d26b99265cfd4af34c20a9a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"670bd952e0069229a8b544ece191ea8ca96a496f","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":423,"context_line":"        if options_schema is None:"},{"line_number":424,"context_line":"            msg \u003d _(\"The option schema of plugin must be provided.\")"},{"line_number":425,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":426,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":427,"context_line":"            if \"#\" in resource_key:"},{"line_number":428,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_262f3440","line":425,"range":{"start_line":425,"start_character":12,"end_line":425,"end_character":52},"updated":"2017-05-22 02:33:52.000000000","message":"IMO, It is better to use \u0027exc.HTTPBadRequest(explanation\u003dmsg)\u0027 instead. Because exception.InvalidInput is the Karbor\u0027s internal exception, it is better to use standard HTTPException.","commit_id":"3d31b6342ee5866f6cbdc7938bc13f8b71498dac"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"21994558c04474dd41ccdbda34b23cba9525f729","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            \"extended_info_schema\", {}).get(\"options_schema\", None)"},{"line_number":423,"context_line":"        if options_schema is None:"},{"line_number":424,"context_line":"            msg \u003d _(\"The option schema of plugin must be provided.\")"},{"line_number":425,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":426,"context_line":"        for resource_key, parameter_value in parameters.items():"},{"line_number":427,"context_line":"            if \"#\" in resource_key:"},{"line_number":428,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_d305b547","line":425,"range":{"start_line":425,"start_character":12,"end_line":425,"end_character":52},"in_reply_to":"ff0f0b1f_262f3440","updated":"2017-05-23 03:08:34.000000000","message":"Done","commit_id":"3d31b6342ee5866f6cbdc7938bc13f8b71498dac"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"670bd952e0069229a8b544ece191ea8ca96a496f","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"},{"line_number":429,"context_line":"                if not uuidutils.is_uuid_like(resource_id):"},{"line_number":430,"context_line":"                    msg \u003d _(\"The resource_id must be a uuid.\")"},{"line_number":431,"context_line":"                    raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":432,"context_line":"            else:"},{"line_number":433,"context_line":"                resource_type \u003d resource_key"},{"line_number":434,"context_line":"            if resource_type not in constants.RESOURCE_TYPES:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_a6222451","line":431,"range":{"start_line":431,"start_character":26,"end_line":431,"end_character":48},"updated":"2017-05-22 02:33:52.000000000","message":"ditto.","commit_id":"3d31b6342ee5866f6cbdc7938bc13f8b71498dac"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"21994558c04474dd41ccdbda34b23cba9525f729","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                resource_type, resource_id \u003d resource_key.split(\"#\")"},{"line_number":429,"context_line":"                if not uuidutils.is_uuid_like(resource_id):"},{"line_number":430,"context_line":"                    msg \u003d _(\"The resource_id must be a uuid.\")"},{"line_number":431,"context_line":"                    raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":432,"context_line":"            else:"},{"line_number":433,"context_line":"                resource_type \u003d resource_key"},{"line_number":434,"context_line":"            if resource_type not in constants.RESOURCE_TYPES:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_b302413c","line":431,"range":{"start_line":431,"start_character":26,"end_line":431,"end_character":48},"in_reply_to":"ff0f0b1f_a6222451","updated":"2017-05-23 03:08:34.000000000","message":"Done","commit_id":"3d31b6342ee5866f6cbdc7938bc13f8b71498dac"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"670bd952e0069229a8b544ece191ea8ca96a496f","unresolved":false,"context_lines":[{"line_number":438,"context_line":"            if not set(properties.keys()) \u003e set(parameter_value.keys()):"},{"line_number":439,"context_line":"                msg \u003d _(\"The protect property of plan parameters \""},{"line_number":440,"context_line":"                        \"is invalid.\")"},{"line_number":441,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def create_resource():"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_4617c8ee","line":441,"range":{"start_line":441,"start_character":22,"end_line":441,"end_character":44},"updated":"2017-05-22 02:33:52.000000000","message":"ditto","commit_id":"3d31b6342ee5866f6cbdc7938bc13f8b71498dac"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"21994558c04474dd41ccdbda34b23cba9525f729","unresolved":false,"context_lines":[{"line_number":438,"context_line":"            if not set(properties.keys()) \u003e set(parameter_value.keys()):"},{"line_number":439,"context_line":"                msg \u003d _(\"The protect property of plan parameters \""},{"line_number":440,"context_line":"                        \"is invalid.\")"},{"line_number":441,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def create_resource():"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_93fbbd45","line":441,"range":{"start_line":441,"start_character":22,"end_line":441,"end_character":44},"in_reply_to":"ff0f0b1f_4617c8ee","updated":"2017-05-23 03:08:34.000000000","message":"Done","commit_id":"3d31b6342ee5866f6cbdc7938bc13f8b71498dac"}],"karbor/tests/unit/api/fakes.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"8f7b21642c8389e452eb129060dc7d5cf9bb821d","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"FAKE_UUID \u003d \u0027aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\u0027"},{"line_number":29,"context_line":"FAKE_UUIDS \u003d {}"},{"line_number":30,"context_line":"PROVIDER_OS \u003d {"},{"line_number":31,"context_line":"    \"description\": \"This provider uses OpenStack\u0027s own services \""},{"line_number":32,"context_line":"                   \"(swift, cinder) as storage\","},{"line_number":33,"context_line":"    \"extended_info_schema\": {"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_008ead77","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":11},"updated":"2017-05-15 12:31:44.000000000","message":"IMO, it is better to use schema of cinder plugin instead or define simple schema. There is no need to define complete schema for tests.","commit_id":"ceda0f59eef9e2f884aa3a0356d9352e99e4ca2c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b0fadb80793f5b6f8d00a158c419d77a1df609ab","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"FAKE_UUID \u003d \u0027aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\u0027"},{"line_number":29,"context_line":"FAKE_UUIDS \u003d {}"},{"line_number":30,"context_line":"PROVIDER_OS \u003d {"},{"line_number":31,"context_line":"    \"description\": \"This provider uses OpenStack\u0027s own services \""},{"line_number":32,"context_line":"                   \"(swift, cinder) as storage\","},{"line_number":33,"context_line":"    \"extended_info_schema\": {"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_6d11c1ac","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":11},"in_reply_to":"1f013ff3_008ead77","updated":"2017-05-16 15:26:32.000000000","message":"Done","commit_id":"ceda0f59eef9e2f884aa3a0356d9352e99e4ca2c"}]}
