)]}'
{"watcher/common/nova_helper.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3fb787fac5c605252efb2e2846054fe76d88a68c","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        try:"},{"line_number":328,"context_line":"            flavor_id \u003d self.nova.flavors.get(flavor)"},{"line_number":329,"context_line":"        except nvexceptions.ClientException as e:"},{"line_number":330,"context_line":"            if e.code \u003d\u003d 404:"},{"line_number":331,"context_line":"                flavor_id \u003d [f.id for f in self.nova.flavors.list() if"},{"line_number":332,"context_line":"                             f.name \u003d\u003d flavor][0]"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":335,"context_line":"                          \"instance %s. Exception: %s\" %"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_2d310d06","line":332,"range":{"start_line":330,"start_character":0,"end_line":332,"end_character":49},"updated":"2017-01-16 13:25:35.000000000","message":"Shouldn\u0027t that be in a different except block like:\n\ntry:\n    flavor_id \u003d self.nova.flavors.get(flavor)\nexcept nvexceptions.NotFound as exc:\n    flavor_id \u003d [f.id for f in self.nova.flavors.list()\n                 if f.name \u003d\u003d flavor][0]\nexcept nvexceptions.ClientException as exc:\n    LOG.debug(\"Nova client exception occurred while resizing \"\n              \"instance %s. Exception: %s\", instance_id, e)","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"ec4b98dba2b89752bd2ed18634919810a6afe13d","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        try:"},{"line_number":328,"context_line":"            flavor_id \u003d self.nova.flavors.get(flavor)"},{"line_number":329,"context_line":"        except nvexceptions.ClientException as e:"},{"line_number":330,"context_line":"            if e.code \u003d\u003d 404:"},{"line_number":331,"context_line":"                flavor_id \u003d [f.id for f in self.nova.flavors.list() if"},{"line_number":332,"context_line":"                             f.name \u003d\u003d flavor][0]"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":335,"context_line":"                          \"instance %s. Exception: %s\" %"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_df773a38","line":332,"range":{"start_line":330,"start_character":0,"end_line":332,"end_character":49},"in_reply_to":"7a3c09a3_2d310d06","updated":"2017-01-16 16:37:36.000000000","message":"Done","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3fb787fac5c605252efb2e2846054fe76d88a68c","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        if not instance:"},{"line_number":343,"context_line":"            LOG.debug(\"Instance not found: %s\" % instance_id)"},{"line_number":344,"context_line":"            return False"},{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            instance_status \u003d getattr(instance, \u0027OS-EXT-STS:vm_state\u0027)"},{"line_number":347,"context_line":"            LOG.debug("},{"line_number":348,"context_line":"                \"Instance %s is in \u0027%s\u0027 status.\" % (instance_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_caf94482","line":345,"range":{"start_line":345,"start_character":8,"end_line":345,"end_character":13},"updated":"2017-01-16 13:25:35.000000000","message":"IMHO, since you return in the if clause, there\u0027s no need for the else statement here since it adds an extra level of intendation.","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"ec4b98dba2b89752bd2ed18634919810a6afe13d","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        if not instance:"},{"line_number":343,"context_line":"            LOG.debug(\"Instance not found: %s\" % instance_id)"},{"line_number":344,"context_line":"            return False"},{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            instance_status \u003d getattr(instance, \u0027OS-EXT-STS:vm_state\u0027)"},{"line_number":347,"context_line":"            LOG.debug("},{"line_number":348,"context_line":"                \"Instance %s is in \u0027%s\u0027 status.\" % (instance_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_df565ad1","line":345,"range":{"start_line":345,"start_character":8,"end_line":345,"end_character":13},"in_reply_to":"7a3c09a3_caf94482","updated":"2017-01-16 16:37:36.000000000","message":"Done","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3fb787fac5c605252efb2e2846054fe76d88a68c","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"            instance.confirm_resize()"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"            LOG.debug(\"Resizing succeeded : instance %s is now on flavor \u0027%s\u0027.\""},{"line_number":369,"context_line":"                      % (instance_id, flavor_id))"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"            return True"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_aa1078a9","line":369,"range":{"start_line":368,"start_character":12,"end_line":369,"end_character":49},"updated":"2017-01-16 13:25:35.000000000","message":"nit:\n\nLOG.debug(\"Resizing succeeded : instance %s is now on flavor \"\n          \"\u0027%s\u0027.\", instance_id, flavor_id)","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"ec4b98dba2b89752bd2ed18634919810a6afe13d","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"            instance.confirm_resize()"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"            LOG.debug(\"Resizing succeeded : instance %s is now on flavor \u0027%s\u0027.\""},{"line_number":369,"context_line":"                      % (instance_id, flavor_id))"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"            return True"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_3fd75e24","line":369,"range":{"start_line":368,"start_character":12,"end_line":369,"end_character":49},"in_reply_to":"7a3c09a3_aa1078a9","updated":"2017-01-16 16:37:36.000000000","message":"Done","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"}],"watcher/decision_engine/planner/default.py":[{"author":{"_account_id":22775,"name":"Prudhvi Rao Shedimbi","email":"prudhvi.rao.shedimbi@intel.com","username":"pshedimb"},"change_message_id":"f51be2b718ac79b8d5eaae87ca370c4399bb85e1","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                # to complete all actions (resize and migration type)"},{"line_number":185,"context_line":"                # related to the host."},{"line_number":186,"context_line":"                elif a_type \u003d\u003d \u0027turn_host_to_acpi_s3_state\u0027:"},{"line_number":187,"context_line":"                    #TODO"},{"line_number":188,"context_line":"                    pass"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_31fbdec2","line":187,"updated":"2016-12-05 17:08:53.000000000","message":"Minor change. # to be followed by empty space. Leading to pep8 failure.","commit_id":"cac76489eaa16ea96c26b1d9267c9b041d3f5f36"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"851d60b8b7e9d381b9b4468b55657bd7078d07cb","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                # to complete all actions (resize and migration type)"},{"line_number":185,"context_line":"                # related to the host."},{"line_number":186,"context_line":"                elif a_type \u003d\u003d \u0027turn_host_to_acpi_s3_state\u0027:"},{"line_number":187,"context_line":"                    #TODO"},{"line_number":188,"context_line":"                    pass"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_4a49f9cf","line":187,"in_reply_to":"3a71b18c_31fbdec2","updated":"2016-12-08 09:34:12.000000000","message":"Done","commit_id":"cac76489eaa16ea96c26b1d9267c9b041d3f5f36"},{"author":{"_account_id":22775,"name":"Prudhvi Rao Shedimbi","email":"prudhvi.rao.shedimbi@intel.com","username":"pshedimb"},"change_message_id":"f51be2b718ac79b8d5eaae87ca370c4399bb85e1","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    #TODO"},{"line_number":188,"context_line":"                    pass"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        return action_plan"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _create_action_plan(self, context, audit_id, solution):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_d1a70abb","line":190,"updated":"2016-12-05 17:08:53.000000000","message":"Minor change. Remove 2 blank lines. Again resulting in pep8 failure.","commit_id":"cac76489eaa16ea96c26b1d9267c9b041d3f5f36"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"851d60b8b7e9d381b9b4468b55657bd7078d07cb","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    #TODO"},{"line_number":188,"context_line":"                    pass"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        return action_plan"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _create_action_plan(self, context, audit_id, solution):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_6a46b5c0","line":190,"in_reply_to":"3a71b18c_d1a70abb","updated":"2016-12-08 09:34:12.000000000","message":"Done","commit_id":"cac76489eaa16ea96c26b1d9267c9b041d3f5f36"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"70c14b51c8e1f513acbafbe0797b7362a7034c00","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            scheduled_actions \u003d [x[1] for x in scheduled]"},{"line_number":115,"context_line":"            for action in scheduled_actions:"},{"line_number":116,"context_line":"                a_type \u003d action[\u0027action_type\u0027]"},{"line_number":117,"context_line":"                if a_type in [\u0027nop\u0027, \u0027change_nova_service_state\u0027, \u0027sleep\u0027]:"},{"line_number":118,"context_line":"                    # These action types are independent."},{"line_number":119,"context_line":"                    self._create_action(context, action, [])"},{"line_number":120,"context_line":"                elif a_type \u003d\u003d \u0027migrate\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_404c4d42","line":117,"range":{"start_line":117,"start_character":37,"end_line":117,"end_character":63},"updated":"2016-12-14 08:37:56.000000000","message":"The resource_id of \u0027change_nova_service_state\u0027 should be placed \nin resource_action_map. \nIn the workload balance scene, If the migration destination_node service state is disable,\nwe should enable it first.","commit_id":"978647d952ddd328c44ff0d7ab46b34f333578cf"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"ddff0c904b21d2822b4ca2395a2b23d36e4ce571","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            scheduled_actions \u003d [x[1] for x in scheduled]"},{"line_number":115,"context_line":"            for action in scheduled_actions:"},{"line_number":116,"context_line":"                a_type \u003d action[\u0027action_type\u0027]"},{"line_number":117,"context_line":"                if a_type in [\u0027nop\u0027, \u0027change_nova_service_state\u0027, \u0027sleep\u0027]:"},{"line_number":118,"context_line":"                    # These action types are independent."},{"line_number":119,"context_line":"                    self._create_action(context, action, [])"},{"line_number":120,"context_line":"                elif a_type \u003d\u003d \u0027migrate\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_e96366da","line":117,"range":{"start_line":117,"start_character":37,"end_line":117,"end_character":63},"in_reply_to":"1a6eadb0_404c4d42","updated":"2016-12-14 17:45:19.000000000","message":"Done","commit_id":"978647d952ddd328c44ff0d7ab46b34f333578cf"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"e7c9ad3bb3ec0606c78f3c3941d0e042e5211da5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            scheduled_actions \u003d [x[1] for x in scheduled]"},{"line_number":115,"context_line":"            for action in scheduled_actions:"},{"line_number":116,"context_line":"                a_type \u003d action[\u0027action_type\u0027]"},{"line_number":117,"context_line":"                if a_type in [\u0027nop\u0027, \u0027change_nova_service_state\u0027, \u0027sleep\u0027]:"},{"line_number":118,"context_line":"                    # These action types are independent."},{"line_number":119,"context_line":"                    self._create_action(context, action, [])"},{"line_number":120,"context_line":"                elif a_type \u003d\u003d \u0027migrate\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_62aa2c72","line":117,"range":{"start_line":117,"start_character":37,"end_line":117,"end_character":63},"in_reply_to":"1a6eadb0_404c4d42","updated":"2016-12-14 09:38:55.000000000","message":"Thank you for your note!","commit_id":"978647d952ddd328c44ff0d7ab46b34f333578cf"},{"author":{"_account_id":15949,"name":"Atul Pandey","email":"atul.pandey@nectechnologies.in","username":"atulpandey"},"change_message_id":"f793fa7f12f9ca53728a73bddee3f104fbabcfdd","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027migrate\u0027: 2,"},{"line_number":47,"context_line":"        \u0027sleep\u0027: 3,"},{"line_number":48,"context_line":"        \u0027change_nova_service_state\u0027: 4,"},{"line_number":49,"context_line":"        \u0027nop\u0027: 5,"},{"line_number":50,"context_line":"    }"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_4f39a3a3","line":49,"range":{"start_line":49,"start_character":12,"end_line":49,"end_character":14},"updated":"2016-12-15 11:08:19.000000000","message":"can we have some meaningful name for this variable i.e. no_operation if correct :)","commit_id":"816cd0528000e1e9aa6f3d30c3f69e3dc33d86a8"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2e13bfb06f888ecbe2465ac78ca52a0e70d0d46d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    weights_dict \u003d {"},{"line_number":44,"context_line":"        \u0027turn_host_to_acpi_s3_state\u0027: 0,"},{"line_number":45,"context_line":"        \u0027resize\u0027: 1,"},{"line_number":46,"context_line":"        \u0027migrate\u0027: 2,"},{"line_number":47,"context_line":"        \u0027sleep\u0027: 3,"},{"line_number":48,"context_line":"        \u0027change_nova_service_state\u0027: 4,"},{"line_number":49,"context_line":"        \u0027nop\u0027: 5,"},{"line_number":50,"context_line":"    }"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_24dd57e0","line":49,"range":{"start_line":44,"start_character":0,"end_line":49,"end_character":17},"updated":"2016-12-15 14:34:46.000000000","message":"Why did you change weights ?","commit_id":"917e260931030b21b885e14dc29e44195ebe877a"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2e13bfb06f888ecbe2465ac78ca52a0e70d0d46d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            context, action_plan.id, solution.efficacy_indicators)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # scheduling"},{"line_number":106,"context_line":"        scheduled \u003d sorted(to_schedule, key\u003dlambda x: (x[0]), reverse\u003dTrue)"},{"line_number":107,"context_line":"        nova \u003d nova_helper.NovaHelper()"},{"line_number":108,"context_line":"        if len(scheduled) \u003d\u003d 0:"},{"line_number":109,"context_line":"            LOG.warning(_LW(\"The action plan is empty\"))"},{"line_number":110,"context_line":"            action_plan.state \u003d objects.action_plan.State.SUCCEEDED"},{"line_number":111,"context_line":"            action_plan.save()"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            resource_action_map \u003d {}"},{"line_number":114,"context_line":"            scheduled_actions \u003d [x[1] for x in scheduled]"},{"line_number":115,"context_line":"            for action in scheduled_actions:"},{"line_number":116,"context_line":"                a_type \u003d action[\u0027action_type\u0027]"},{"line_number":117,"context_line":"                if a_type in [\u0027nop\u0027, \u0027sleep\u0027]:"},{"line_number":118,"context_line":"                    # These action types are independent."},{"line_number":119,"context_line":"                    self._create_action(context, action, [])"},{"line_number":120,"context_line":"                elif a_type \u003d\u003d \u0027change_nova_service_state\u0027:"},{"line_number":121,"context_line":"                    new_action \u003d self._create_action(context, action, [])"},{"line_number":122,"context_line":"                    host_name \u003d new_action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":123,"context_line":"                    _mapping(resource_action_map, host_name,"},{"line_number":124,"context_line":"                             new_action.uuid, \u0027change_nova_service_state\u0027)"},{"line_number":125,"context_line":"                elif a_type \u003d\u003d \u0027migrate\u0027:"},{"line_number":126,"context_line":"                    new_action \u003d self._create_action(context, action, [])"},{"line_number":127,"context_line":"                    instance_name \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":128,"context_line":"                    host_name \u003d new_action[\u0027input_parameters\u0027][\u0027source_node\u0027]"},{"line_number":129,"context_line":"                    _mapping(resource_action_map, instance_name,"},{"line_number":130,"context_line":"                             new_action.uuid, \u0027migrate\u0027)"},{"line_number":131,"context_line":"                    _mapping(resource_action_map, host_name, new_action.uuid,"},{"line_number":132,"context_line":"                             \u0027migrate\u0027)"},{"line_number":133,"context_line":"                elif a_type \u003d\u003d \u0027resize\u0027:"},{"line_number":134,"context_line":"                    instance_name \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":135,"context_line":"                    parent_actions \u003d resource_action_map.get(instance_name)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"                    if parent_actions:"},{"line_number":138,"context_line":"                        new_action \u003d self._create_action("},{"line_number":139,"context_line":"                            context, action, [x[0] for x in parent_actions])"},{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        new_action \u003d self._create_action(context, action, [])"},{"line_number":142,"context_line":"                    host_of_instance \u003d nova.get_instance_by_name(instance_name)"},{"line_number":143,"context_line":"                    _mapping(resource_action_map, host_of_instance,"},{"line_number":144,"context_line":"                             new_action.uuid, \u0027resize\u0027)"},{"line_number":145,"context_line":"                # if we have an action that will make host unreachable, we need"},{"line_number":146,"context_line":"                # to complete all actions (resize and migration type)"},{"line_number":147,"context_line":"                # related to the host."},{"line_number":148,"context_line":"                elif a_type \u003d\u003d \u0027turn_host_to_acpi_s3_state\u0027:"},{"line_number":149,"context_line":"                    host_to_acpi_s3 \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":150,"context_line":"                    host_actions \u003d resource_action_map.get(host_to_acpi_s3)"},{"line_number":151,"context_line":"                    action_parents \u003d []"},{"line_number":152,"context_line":"                    if host_actions:"},{"line_number":153,"context_line":"                        resize_actions \u003d [x[0] for x in host_actions"},{"line_number":154,"context_line":"                                          if x[1] \u003d\u003d \u0027resize\u0027]"},{"line_number":155,"context_line":"                        migrate_actions \u003d [x[0] for x in host_actions"},{"line_number":156,"context_line":"                                           if x[1] \u003d\u003d \u0027migrate\u0027]"},{"line_number":157,"context_line":"                        resize_migration_parents \u003d ["},{"line_number":158,"context_line":"                            x.parents for x in"},{"line_number":159,"context_line":"                            [objects.Action.get_by_uuid(context, resize_action)"},{"line_number":160,"context_line":"                             for resize_action in resize_actions]]"},{"line_number":161,"context_line":"                        resize_migration_parents \u003d ["},{"line_number":162,"context_line":"                            parent for sublist in resize_migration_parents"},{"line_number":163,"context_line":"                            for parent in sublist]"},{"line_number":164,"context_line":"                        action_parents.extend([uuid for uuid in"},{"line_number":165,"context_line":"                                               resize_actions])"},{"line_number":166,"context_line":"                        action_parents.extend([uuid for uuid in"},{"line_number":167,"context_line":"                                              migrate_actions if uuid not in"},{"line_number":168,"context_line":"                                              resize_migration_parents])"},{"line_number":169,"context_line":"                    self._create_action(context, action, action_parents)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        return action_plan"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _create_action_plan(self, context, audit_id, solution):"},{"line_number":174,"context_line":"        strategy \u003d objects.Strategy.get_by_name("}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_64c2ef35","line":171,"range":{"start_line":106,"start_character":0,"end_line":171,"end_character":26},"updated":"2016-12-15 14:34:46.000000000","message":"Alex, from my point of view, we can not process // of actions like this. It is too static and not compliant with extended action model. Think about how to be able to // actions  should be part of another spec.\n\nwhy not just set parents field attribute, to get a listed action chain.\n\nbefore this patch we had, as action plan for basic consolidation :\n change_state(w:3) -- next --\u003e migrate(w:2)\n\nnow we should have:\n\nmigrate(w:2) -- parents --\u003e [change_state(w:3)]\n\nand the applier should apply successfully the change_state action and after the migrate one.","commit_id":"917e260931030b21b885e14dc29e44195ebe877a"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"a45b122ea3fec819957b588fc2733c80c70f92ed","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            context, action_plan.id, solution.efficacy_indicators)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # scheduling"},{"line_number":106,"context_line":"        scheduled \u003d sorted(to_schedule, key\u003dlambda x: (x[0]), reverse\u003dTrue)"},{"line_number":107,"context_line":"        nova \u003d nova_helper.NovaHelper()"},{"line_number":108,"context_line":"        if len(scheduled) \u003d\u003d 0:"},{"line_number":109,"context_line":"            LOG.warning(_LW(\"The action plan is empty\"))"},{"line_number":110,"context_line":"            action_plan.state \u003d objects.action_plan.State.SUCCEEDED"},{"line_number":111,"context_line":"            action_plan.save()"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            resource_action_map \u003d {}"},{"line_number":114,"context_line":"            scheduled_actions \u003d [x[1] for x in scheduled]"},{"line_number":115,"context_line":"            for action in scheduled_actions:"},{"line_number":116,"context_line":"                a_type \u003d action[\u0027action_type\u0027]"},{"line_number":117,"context_line":"                if a_type in [\u0027nop\u0027, \u0027sleep\u0027]:"},{"line_number":118,"context_line":"                    # These action types are independent."},{"line_number":119,"context_line":"                    self._create_action(context, action, [])"},{"line_number":120,"context_line":"                elif a_type \u003d\u003d \u0027change_nova_service_state\u0027:"},{"line_number":121,"context_line":"                    new_action \u003d self._create_action(context, action, [])"},{"line_number":122,"context_line":"                    host_name \u003d new_action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":123,"context_line":"                    _mapping(resource_action_map, host_name,"},{"line_number":124,"context_line":"                             new_action.uuid, \u0027change_nova_service_state\u0027)"},{"line_number":125,"context_line":"                elif a_type \u003d\u003d \u0027migrate\u0027:"},{"line_number":126,"context_line":"                    new_action \u003d self._create_action(context, action, [])"},{"line_number":127,"context_line":"                    instance_name \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":128,"context_line":"                    host_name \u003d new_action[\u0027input_parameters\u0027][\u0027source_node\u0027]"},{"line_number":129,"context_line":"                    _mapping(resource_action_map, instance_name,"},{"line_number":130,"context_line":"                             new_action.uuid, \u0027migrate\u0027)"},{"line_number":131,"context_line":"                    _mapping(resource_action_map, host_name, new_action.uuid,"},{"line_number":132,"context_line":"                             \u0027migrate\u0027)"},{"line_number":133,"context_line":"                elif a_type \u003d\u003d \u0027resize\u0027:"},{"line_number":134,"context_line":"                    instance_name \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":135,"context_line":"                    parent_actions \u003d resource_action_map.get(instance_name)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"                    if parent_actions:"},{"line_number":138,"context_line":"                        new_action \u003d self._create_action("},{"line_number":139,"context_line":"                            context, action, [x[0] for x in parent_actions])"},{"line_number":140,"context_line":"                    else:"},{"line_number":141,"context_line":"                        new_action \u003d self._create_action(context, action, [])"},{"line_number":142,"context_line":"                    host_of_instance \u003d nova.get_instance_by_name(instance_name)"},{"line_number":143,"context_line":"                    _mapping(resource_action_map, host_of_instance,"},{"line_number":144,"context_line":"                             new_action.uuid, \u0027resize\u0027)"},{"line_number":145,"context_line":"                # if we have an action that will make host unreachable, we need"},{"line_number":146,"context_line":"                # to complete all actions (resize and migration type)"},{"line_number":147,"context_line":"                # related to the host."},{"line_number":148,"context_line":"                elif a_type \u003d\u003d \u0027turn_host_to_acpi_s3_state\u0027:"},{"line_number":149,"context_line":"                    host_to_acpi_s3 \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":150,"context_line":"                    host_actions \u003d resource_action_map.get(host_to_acpi_s3)"},{"line_number":151,"context_line":"                    action_parents \u003d []"},{"line_number":152,"context_line":"                    if host_actions:"},{"line_number":153,"context_line":"                        resize_actions \u003d [x[0] for x in host_actions"},{"line_number":154,"context_line":"                                          if x[1] \u003d\u003d \u0027resize\u0027]"},{"line_number":155,"context_line":"                        migrate_actions \u003d [x[0] for x in host_actions"},{"line_number":156,"context_line":"                                           if x[1] \u003d\u003d \u0027migrate\u0027]"},{"line_number":157,"context_line":"                        resize_migration_parents \u003d ["},{"line_number":158,"context_line":"                            x.parents for x in"},{"line_number":159,"context_line":"                            [objects.Action.get_by_uuid(context, resize_action)"},{"line_number":160,"context_line":"                             for resize_action in resize_actions]]"},{"line_number":161,"context_line":"                        resize_migration_parents \u003d ["},{"line_number":162,"context_line":"                            parent for sublist in resize_migration_parents"},{"line_number":163,"context_line":"                            for parent in sublist]"},{"line_number":164,"context_line":"                        action_parents.extend([uuid for uuid in"},{"line_number":165,"context_line":"                                               resize_actions])"},{"line_number":166,"context_line":"                        action_parents.extend([uuid for uuid in"},{"line_number":167,"context_line":"                                              migrate_actions if uuid not in"},{"line_number":168,"context_line":"                                              resize_migration_parents])"},{"line_number":169,"context_line":"                    self._create_action(context, action, action_parents)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        return action_plan"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _create_action_plan(self, context, audit_id, solution):"},{"line_number":174,"context_line":"        strategy \u003d objects.Strategy.get_by_name("}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_8ae569a5","line":171,"range":{"start_line":106,"start_character":0,"end_line":171,"end_character":26},"in_reply_to":"1a6eadb0_64c2ef35","updated":"2016-12-21 13:10:12.000000000","message":"David, I am trying to make this algorithm flexible by moving `elif` blocks to action plugins.","commit_id":"917e260931030b21b885e14dc29e44195ebe877a"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"b4ea53b05322b387f532518f6d24c6b0154c4f8e","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"            new_action \u003d objects.Action(context, **_action)"},{"line_number":202,"context_line":"            new_action.create()"},{"line_number":203,"context_line":"            new_action.save()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"            return new_action"},{"line_number":206,"context_line":"        except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_7ce4f70c","line":203,"range":{"start_line":203,"start_character":12,"end_line":203,"end_character":29},"updated":"2016-12-30 07:26:52.000000000","message":"This is not necessary.","commit_id":"930dc5509a29db3be03ef257f51d1f2028cd97b8"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"2775564b784c2e7827b3e754f1aedbb4d43d3925","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"            new_action \u003d objects.Action(context, **_action)"},{"line_number":202,"context_line":"            new_action.create()"},{"line_number":203,"context_line":"            new_action.save()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"            return new_action"},{"line_number":206,"context_line":"        except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_4b268f17","line":203,"range":{"start_line":203,"start_character":12,"end_line":203,"end_character":29},"in_reply_to":"ba5201f7_7ce4f70c","updated":"2017-01-13 09:34:07.000000000","message":"Done","commit_id":"930dc5509a29db3be03ef257f51d1f2028cd97b8"}],"watcher/decision_engine/planner/weight.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3fb787fac5c605252efb2e2846054fe76d88a68c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    leaf_groups.append([action])"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        return action_graph"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def schedule(self, context, audit_id, solution):"},{"line_number":162,"context_line":"        LOG.debug(\u0027Creating an action plan for the audit uuid: %s\u0027, audit_id)"},{"line_number":163,"context_line":"        action_plan \u003d self.create_action_plan(context, audit_id, solution)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a3c09a3_0ae7ccb0","line":160,"updated":"2017-01-16 13:25:35.000000000","message":"Can you please take into account the TODOs I have written in https://review.openstack.org/#/c/415505/2/watcher/decision_engine/planner/weight.py ?","commit_id":"d54f4e01ef6a59ddca89c1417ff28840af22591a"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"5d5397030b8ec32fcec3ae7645985bb4ff04da42","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        # insert them in a Directed Acyclic Graph"},{"line_number":119,"context_line":"        for idx, (weight, actions) in enumerate(sorted_weighted_actions):"},{"line_number":120,"context_line":"            action_chunks \u003d self.chunkify("},{"line_number":121,"context_line":"                actions, self.config.parallelization[reverse_weights[weight]])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            # We split the actions into chunks/layers that will have to be"},{"line_number":124,"context_line":"            # spread across all the available branches of the graph"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a3c09a3_68db757c","line":121,"range":{"start_line":121,"start_character":25,"end_line":121,"end_character":77},"updated":"2017-01-18 14:43:03.000000000","message":"This method call returns a str, but the signature def chunkify(lst, n) defined \u0027n\u0027 as an integer","commit_id":"01a17d1d27541fd7bf232ce2007a8e741f950037"}],"watcher/decision_engine/planner/workload_stabilization.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bc1e893765e83b835721a6b1f03b03b7931233f3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def osc(self):"},{"line_number":53,"context_line":"        return self._osc"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    weights_dict \u003d {"},{"line_number":56,"context_line":"        \u0027turn_host_to_acpi_s3_state\u0027: 0,"},{"line_number":57,"context_line":"        \u0027resize\u0027: 1,"},{"line_number":58,"context_line":"        \u0027migrate\u0027: 2,"},{"line_number":59,"context_line":"        \u0027sleep\u0027: 3,"},{"line_number":60,"context_line":"        \u0027change_nova_service_state\u0027: 4,"},{"line_number":61,"context_line":"        \u0027nop\u0027: 5,"},{"line_number":62,"context_line":"    }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @classmethod"},{"line_number":65,"context_line":"    def get_config_opts(cls):"},{"line_number":66,"context_line":"        return ["},{"line_number":67,"context_line":"            cfg.DictOpt("},{"line_number":68,"context_line":"                \u0027weights\u0027,"},{"line_number":69,"context_line":"                help\u003d\"These weights are used to schedule the actions\","},{"line_number":70,"context_line":"                default\u003dcls.weights_dict),"},{"line_number":71,"context_line":"        ]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def create_action(self,"},{"line_number":74,"context_line":"                      action_plan_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_2528ab99","line":71,"range":{"start_line":55,"start_character":0,"end_line":71,"end_character":9},"updated":"2017-01-18 17:27:50.000000000","message":"can you actually mirror what you did in the weight planner please?","commit_id":"8bfb253ee38b244c7bea5d572d8e323cccd9b09a"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bc1e893765e83b835721a6b1f03b03b7931233f3","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def schedule(self, context, audit_id, solution):"},{"line_number":95,"context_line":"        LOG.debug(\u0027Creating an action plan for the audit uuid: %s\u0027, audit_id)"},{"line_number":96,"context_line":"        priorities \u003d self.config.weights"},{"line_number":97,"context_line":"        action_plan \u003d self._create_action_plan(context, audit_id, solution)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        actions \u003d list(solution.actions)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_681c4a6a","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":18},"updated":"2017-01-18 17:27:50.000000000","message":"2 options: either call it \"weights\" and then you mirror the weight planner (descending order) or you rename the config option to \"priorities\" and keep the ascending ordering","commit_id":"8bfb253ee38b244c7bea5d572d8e323cccd9b09a"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bc1e893765e83b835721a6b1f03b03b7931233f3","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                action_plan_id\u003daction_plan.id,"},{"line_number":104,"context_line":"                action_type\u003daction.get(\u0027action_type\u0027),"},{"line_number":105,"context_line":"                input_parameters\u003daction.get(\u0027input_parameters\u0027))"},{"line_number":106,"context_line":"            to_schedule.append((priorities[action.get(\u0027action_type\u0027)],"},{"line_number":107,"context_line":"                                json_action))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self._create_efficacy_indicators("}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_8817b643","line":106,"range":{"start_line":106,"start_character":32,"end_line":106,"end_character":42},"updated":"2017-01-18 17:27:50.000000000","message":"ditto","commit_id":"8bfb253ee38b244c7bea5d572d8e323cccd9b09a"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bc1e893765e83b835721a6b1f03b03b7931233f3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                # if we have an action that will make host unreachable, we need"},{"line_number":134,"context_line":"                # to complete all actions (resize and migration type)"},{"line_number":135,"context_line":"                # related to the host."},{"line_number":136,"context_line":"                else:"},{"line_number":137,"context_line":"                    host_to_acpi_s3 \u003d action[\u0027input_parameters\u0027][\u0027resource_id\u0027]"},{"line_number":138,"context_line":"                    host_actions \u003d resource_action_map.get(host_to_acpi_s3)"},{"line_number":139,"context_line":"                    action_parents \u003d []"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_43adafe7","line":136,"updated":"2017-01-18 17:27:50.000000000","message":"IMHO, you should raise an exception somewhere if the action_type does not have an associated action validator  like UnsupportedAction.","commit_id":"8bfb253ee38b244c7bea5d572d8e323cccd9b09a"}],"watcher/objects/action.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"85d7beded3405fb2bcefd7438fc0352e2c83ab6c","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    # Version 1.0: Initial version"},{"line_number":39,"context_line":"    # Version 1.1: Added \u0027action_plan\u0027 object field"},{"line_number":40,"context_line":"    # Version 1.2: Removed \u0027next\u0027 object field, Added \u0027parents\u0027 object field"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    dbapi \u003d db_api.get_instance()"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_25b061dd","line":40,"updated":"2017-01-10 15:56:56.000000000","message":"Since you removed a field, this is not an incremental change anymore so I would argue we should bump this object to the 2.0 version instead.","commit_id":"930dc5509a29db3be03ef257f51d1f2028cd97b8"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"2775564b784c2e7827b3e754f1aedbb4d43d3925","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    # Version 1.0: Initial version"},{"line_number":39,"context_line":"    # Version 1.1: Added \u0027action_plan\u0027 object field"},{"line_number":40,"context_line":"    # Version 1.2: Removed \u0027next\u0027 object field, Added \u0027parents\u0027 object field"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    dbapi \u003d db_api.get_instance()"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_6b926b59","line":40,"in_reply_to":"ba5201f7_25b061dd","updated":"2017-01-13 09:34:07.000000000","message":"Done","commit_id":"930dc5509a29db3be03ef257f51d1f2028cd97b8"}],"watcher/objects/action_plan.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"85d7beded3405fb2bcefd7438fc0352e2c83ab6c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    # Version 1.1: Added \u0027audit\u0027 and \u0027strategy\u0027 object field"},{"line_number":96,"context_line":"    # Version 1.2: audit_id is not nullable anymore"},{"line_number":97,"context_line":"    # Version 1.3: Removed \u0027first_action_id\u0027 object field"},{"line_number":98,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    dbapi \u003d db_api.get_instance()"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_05e0bdcb","line":98,"range":{"start_line":98,"start_character":14,"end_line":98,"end_character":19},"updated":"2017-01-10 15:56:56.000000000","message":"ditto: IMHO, removing a field should correspond to a change of its major version","commit_id":"930dc5509a29db3be03ef257f51d1f2028cd97b8"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"2775564b784c2e7827b3e754f1aedbb4d43d3925","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    # Version 1.1: Added \u0027audit\u0027 and \u0027strategy\u0027 object field"},{"line_number":96,"context_line":"    # Version 1.2: audit_id is not nullable anymore"},{"line_number":97,"context_line":"    # Version 1.3: Removed \u0027first_action_id\u0027 object field"},{"line_number":98,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    dbapi \u003d db_api.get_instance()"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_0baba78a","line":98,"range":{"start_line":98,"start_character":14,"end_line":98,"end_character":19},"in_reply_to":"ba5201f7_05e0bdcb","updated":"2017-01-13 09:34:07.000000000","message":"Done","commit_id":"930dc5509a29db3be03ef257f51d1f2028cd97b8"}],"watcher/tests/decision_engine/planner/test_default_planner.py":[{"author":{"_account_id":22775,"name":"Prudhvi Rao Shedimbi","email":"prudhvi.rao.shedimbi@intel.com","username":"pshedimb"},"change_message_id":"db5c9bd37873ee2206a9749dbf9a9a07ebb52165","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        actions \u003d objects.Action.dbapi.get_action_list(self.context, filters)"},{"line_number":180,"context_line":"        self.assertEqual(\"nop\", actions[0].action_type)"},{"line_number":181,"context_line":"        self.assertEqual(\"migrate\", actions[1].action_type)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"class TestDefaultPlanner(base.DbTestCase):"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_9f7b86f4","line":182,"updated":"2016-12-07 09:58:08.000000000","message":"Minor change. One more blank line needed. Resulting in pep8 failure.","commit_id":"22dcf0f5e571dbb7def48ec5bef58e5a242ada44"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"15a4934866f02ac74077548aec088a25d6304d2b","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        actions \u003d objects.Action.dbapi.get_action_list(self.context, filters)"},{"line_number":180,"context_line":"        self.assertEqual(\"nop\", actions[0].action_type)"},{"line_number":181,"context_line":"        self.assertEqual(\"migrate\", actions[1].action_type)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"class TestDefaultPlanner(base.DbTestCase):"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_ca0b497c","line":182,"in_reply_to":"3a71b18c_9f7b86f4","updated":"2016-12-08 09:34:16.000000000","message":"Done","commit_id":"22dcf0f5e571dbb7def48ec5bef58e5a242ada44"}]}
