)]}'
{"watcher/applier/action_plan/default.py":[{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"73ba8eacbe3f8370f9f503d82be9b557502444e9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        finally:"},{"line_number":52,"context_line":"            self.update_action_plan(self.action_plan_uuid, state)"},{"line_number":53,"context_line":"            # update state"},{"line_number":54,"context_line":"            if state \u003d\u003d objects.action_plan.State.SUCCEEDED:"},{"line_number":55,"context_line":"                filters \u003d {\u0027state__eq\u0027: objects.action_plan.State.RECOMMENDED}"},{"line_number":56,"context_line":"                state_manager \u003d ap_manager.StateManager()"},{"line_number":57,"context_line":"                state_manager.check_actionplan_state("}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_37f827c3","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":60},"updated":"2016-11-28 09:29:02.000000000","message":"Ok, I execute action plan, it completes well and all the rest action plans will be marked as SUPERSEDED, even if they belongs to other audits? It is strange.","commit_id":"9d4877c026882aeb8f16d4317f76619d9bdf71f7"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"5f3fc1f64e85e6ed6510e33487c93d3963986bef","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        finally:"},{"line_number":52,"context_line":"            self.update_action_plan(self.action_plan_uuid, state)"},{"line_number":53,"context_line":"            # update state"},{"line_number":54,"context_line":"            if state \u003d\u003d objects.action_plan.State.SUCCEEDED:"},{"line_number":55,"context_line":"                filters \u003d {\u0027state__eq\u0027: objects.action_plan.State.RECOMMENDED}"},{"line_number":56,"context_line":"                state_manager \u003d ap_manager.StateManager()"},{"line_number":57,"context_line":"                state_manager.check_actionplan_state("}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_6e345849","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":60},"in_reply_to":"5a74a57a_37f827c3","updated":"2016-11-29 02:53:50.000000000","message":"If the action plan was launched successfully, the cluster data model had been changed by the executed actions.\nSo the rest action plans should be marked as SUPERSEDED.\nAudit should be created based the new cluster data model.","commit_id":"9d4877c026882aeb8f16d4317f76619d9bdf71f7"}],"watcher/common/manager.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c547f2c6d73d64d636e0a53ea84b62d23d6ad753","unresolved":false,"context_lines":[{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class StateManager(object):"},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        super(StateManager, self).__init__()"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5da102_86621dac","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":18},"updated":"2016-12-19 14:58:38.000000000","message":"This class is actually specific to the ActionPlan and Action objects. So IMHO, this shouldn\u0027t put into watcher/common/manager.py. Instead, I would better see it duplicated into watcher/objects/action_plan.py and watcher/objects/action.py alongside their associated states. By doing so, I would also rename the check_action_state and check_actionplan_state method to a simple check_state since they would be namespaced.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"2bcb2350e16f45135a1ad82b378129acd4a3fa1a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class StateManager(object):"},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        super(StateManager, self).__init__()"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da4df55a_d2ed9df0","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":18},"in_reply_to":"ba5da102_86621dac","updated":"2016-12-23 07:04:43.000000000","message":"Done","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c547f2c6d73d64d636e0a53ea84b62d23d6ad753","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class StateManager(object):"},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        super(StateManager, self).__init__()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @staticmethod"},{"line_number":32,"context_line":"    def check_action_state(context, action_plan_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5da102_4648055c","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":44},"updated":"2016-12-19 14:58:38.000000000","message":"nit: not needed here","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"2bcb2350e16f45135a1ad82b378129acd4a3fa1a","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class StateManager(object):"},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        super(StateManager, self).__init__()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @staticmethod"},{"line_number":32,"context_line":"    def check_action_state(context, action_plan_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da4df55a_12be45d4","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":44},"in_reply_to":"ba5da102_4648055c","updated":"2016-12-23 07:04:43.000000000","message":"Done","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c547f2c6d73d64d636e0a53ea84b62d23d6ad753","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        super(StateManager, self).__init__()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @staticmethod"},{"line_number":32,"context_line":"    def check_action_state(context, action_plan_id):"},{"line_number":33,"context_line":"        filters \u003d {\u0027state__eq\u0027: obj_action.State.PENDING,"},{"line_number":34,"context_line":"                   \u0027action_plan_id__eq\u0027: 0}"},{"line_number":35,"context_line":"        filters[\u0027action_plan_id__eq\u0027] \u003d action_plan_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5da102_86305da0","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":26},"updated":"2016-12-19 14:58:38.000000000","message":"see suggested naming in comment at line 27","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"2bcb2350e16f45135a1ad82b378129acd4a3fa1a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        super(StateManager, self).__init__()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @staticmethod"},{"line_number":32,"context_line":"    def check_action_state(context, action_plan_id):"},{"line_number":33,"context_line":"        filters \u003d {\u0027state__eq\u0027: obj_action.State.PENDING,"},{"line_number":34,"context_line":"                   \u0027action_plan_id__eq\u0027: 0}"},{"line_number":35,"context_line":"        filters[\u0027action_plan_id__eq\u0027] \u003d action_plan_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"da4df55a_52b8cde5","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":26},"in_reply_to":"ba5da102_86305da0","updated":"2016-12-23 07:04:43.000000000","message":"Done","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c547f2c6d73d64d636e0a53ea84b62d23d6ad753","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @classmethod"},{"line_number":47,"context_line":"    def check_actionplan_state(self, context, filters):"},{"line_number":48,"context_line":"        action_plans \u003d obj_action_plan.ActionPlan.list("},{"line_number":49,"context_line":"            context, filters\u003dfilters)"},{"line_number":50,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5da102_a625615d","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":30},"updated":"2016-12-19 14:58:38.000000000","message":"see suggested naming in comment at line 27","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"2bcb2350e16f45135a1ad82b378129acd4a3fa1a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @classmethod"},{"line_number":47,"context_line":"    def check_actionplan_state(self, context, filters):"},{"line_number":48,"context_line":"        action_plans \u003d obj_action_plan.ActionPlan.list("},{"line_number":49,"context_line":"            context, filters\u003dfilters)"},{"line_number":50,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da4df55a_72cf917f","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":30},"in_reply_to":"ba5da102_a625615d","updated":"2016-12-23 07:04:43.000000000","message":"Done","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"73ba8eacbe3f8370f9f503d82be9b557502444e9","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        for action_plan in action_plans:"},{"line_number":42,"context_line":"            for audit in audits:"},{"line_number":43,"context_line":"                if action_plan.audit_id \u003d\u003d audit.id:"},{"line_number":44,"context_line":"                    action_plan.state \u003d objects.action_plan.State.SUPERSEDED"},{"line_number":45,"context_line":"                    action_plan.save()"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_77461f50","line":43,"range":{"start_line":43,"start_character":16,"end_line":43,"end_character":52},"updated":"2016-11-28 09:29:02.000000000","message":"What if I have different audits, some of them are in SUCCEEDED state and their action plans are in RECOMMENDED state, they will be marked as SUPERSEDED?","commit_id":"9d4877c026882aeb8f16d4317f76619d9bdf71f7"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"5f3fc1f64e85e6ed6510e33487c93d3963986bef","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        for action_plan in action_plans:"},{"line_number":42,"context_line":"            for audit in audits:"},{"line_number":43,"context_line":"                if action_plan.audit_id \u003d\u003d audit.id:"},{"line_number":44,"context_line":"                    action_plan.state \u003d objects.action_plan.State.SUPERSEDED"},{"line_number":45,"context_line":"                    action_plan.save()"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_ceae4c2d","line":43,"range":{"start_line":43,"start_character":16,"end_line":43,"end_character":52},"in_reply_to":"5a74a57a_77461f50","updated":"2016-11-29 02:53:50.000000000","message":"Yes, all the audits with the same scope, their acion plans will be marked as SUPERSEDED.","commit_id":"9d4877c026882aeb8f16d4317f76619d9bdf71f7"},{"author":{"_account_id":15949,"name":"Atul Pandey","email":"atul.pandey@nectechnologies.in","username":"atulpandey"},"change_message_id":"839d3e2ad1de1f69ad894aaec2f5f04402427618","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                action_plan.state \u003d objects.action_plan.State.SUPERSEDED"},{"line_number":85,"context_line":"                action_plan.save()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a77a97e_6b69578b","line":87,"updated":"2016-11-22 04:18:42.000000000","message":"Question: Will this function always returns true? Is there any possibility of check_by_uuid() or check_by_node returning failure. In that case shouldn\u0027t we raise an exception which can be handled in case of failure scenarios?","commit_id":"9d4877c026882aeb8f16d4317f76619d9bdf71f7"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"c90f662f8aaf2bbc65005bbdbbf8a0d1754949d4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                action_plan.state \u003d objects.action_plan.State.SUPERSEDED"},{"line_number":85,"context_line":"                action_plan.save()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_e32c3a9b","line":87,"in_reply_to":"7a77a97e_6b69578b","updated":"2016-11-28 02:25:09.000000000","message":"If action_plans is empty, it will return false, as line74.\nso far check_by_uuid() and check_by_node() always return true,\nbut I\u0027ll consider possible failure scenarios.\nThanks","commit_id":"9d4877c026882aeb8f16d4317f76619d9bdf71f7"}],"watcher/common/service.py":[{"author":{"_account_id":15949,"name":"Atul Pandey","email":"atul.pandey@nectechnologies.in","username":"atulpandey"},"change_message_id":"15ebc43b32a7a7a19d88d1c1d75e494b11280f41","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def add_checkstate_job(self):"},{"line_number":181,"context_line":"        # 30 minutes interval"},{"line_number":182,"context_line":"        interval \u003d 30*60"},{"line_number":183,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"},{"line_number":184,"context_line":"                     next_run_time\u003ddatetime.datetime.now())"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5da102_f9386ff0","line":182,"range":{"start_line":182,"start_character":19,"end_line":182,"end_character":21},"updated":"2016-11-02 10:44:37.000000000","message":"Will it be possible to keep this value in conf file and configurable?","commit_id":"a93714e4120561abaf55196a49921487bf3fcf8c"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"ccc305d48ab3dd70e5e91cdcf42b6b88b7a7b9ee","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def add_checkstate_job(self):"},{"line_number":181,"context_line":"        # 30 minutes interval"},{"line_number":182,"context_line":"        interval \u003d 30*60"},{"line_number":183,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"},{"line_number":184,"context_line":"                     next_run_time\u003ddatetime.datetime.now())"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a629dbe_8c89fc77","line":182,"range":{"start_line":182,"start_character":19,"end_line":182,"end_character":21},"in_reply_to":"ba5da102_f9386ff0","updated":"2016-11-10 07:28:23.000000000","message":"Done","commit_id":"a93714e4120561abaf55196a49921487bf3fcf8c"}],"watcher/conf/decision_engine.py":[{"author":{"_account_id":21361,"name":"Chris Spencer","email":"christopher.m.spencer@intel.com","username":"chrisspencer"},"change_message_id":"4cb0bb083b949d798482dc76aebb51b06aeabb0b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":49,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"},{"line_number":50,"context_line":"    cfg.IntOpt(\u0027check_periodic_interval\u0027,"},{"line_number":51,"context_line":"               default\u003d30*60,"},{"line_number":52,"context_line":"               help\u003d_(\u0027Seconds between running periodic tasks.\u0027))"},{"line_number":53,"context_line":"]"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_c520abfa","line":51,"range":{"start_line":51,"start_character":23,"end_line":51,"end_character":28},"updated":"2017-01-25 21:35:17.000000000","message":"any particular reason for doing the math instead of just setting to 180?","commit_id":"40a4d1c5b3bf2527c02b0adaa386c01ed4c63734"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"5eefa66a18255b658ae79ea8f1554fea39955cd9","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":49,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"},{"line_number":50,"context_line":"    cfg.IntOpt(\u0027check_periodic_interval\u0027,"},{"line_number":51,"context_line":"               default\u003d30*60,"},{"line_number":52,"context_line":"               help\u003d_(\u0027Seconds between running periodic tasks.\u0027))"},{"line_number":53,"context_line":"]"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_8d207a4b","line":51,"range":{"start_line":51,"start_character":23,"end_line":51,"end_character":28},"in_reply_to":"3a461143_c520abfa","updated":"2017-01-26 08:11:01.000000000","message":"30*60s, just for easy to understand","commit_id":"40a4d1c5b3bf2527c02b0adaa386c01ed4c63734"}],"watcher/decision_engine/model/notification/nova.py":[{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"a3ad946f75408b0be5f7e888666a850846ab1c5a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        except Exception:"},{"line_number":204,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def check_state(self):"},{"line_number":207,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":208,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":209,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_75d0da1f","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":19},"updated":"2016-11-10 13:59:43.000000000","message":"IMO we shouldn\u0027t look at at this level of operations in order to invalidate an action plan.\nThe impact in the overall cluster utilization could be very low and the action plan would still be valid (depending on the goal of the strategy).\nPerhaps this should be implemented in different module that checks if the current state of the system maps to actions of an action_plan.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"f13d6b72b56f6e63a1732b6e2d79917eaf45dcc8","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        except Exception:"},{"line_number":204,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def check_state(self):"},{"line_number":207,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":208,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":209,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a77a97e_4faba7d6","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":19},"in_reply_to":"9a629dbe_19ce9eb4","updated":"2016-11-16 09:07:14.000000000","message":"The cluster depends on the section [watcher_clients_auth] in the watcher.conf. If an audit is launched successfully, It generates a new Action Plan. as http://docs.openstack.org/developer/watcher/architecture.html","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":15949,"name":"Atul Pandey","email":"atul.pandey@nectechnologies.in","username":"atulpandey"},"change_message_id":"229530d952dbb4c9f0f052543cdbc071d0b2af14","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        except Exception:"},{"line_number":204,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def check_state(self):"},{"line_number":207,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":208,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":209,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_19ce9eb4","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":19},"in_reply_to":"9a629dbe_1bbfa961","updated":"2016-11-14 09:11:35.000000000","message":"Question: When we talk about Larger deployment then i guess it mean group of clusters. So once the audit is completed for a cluster then it would be okay to change the action_plan or is it like audit is completed for whole workload then the action_plan must come into effect?","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"3e25a28be4f78f6e2cded6c02b86b040a18f06b0","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        except Exception:"},{"line_number":204,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def check_state(self):"},{"line_number":207,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":208,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":209,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_1bbfa961","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":19},"in_reply_to":"9a629dbe_278b7820","updated":"2016-11-11 09:36:23.000000000","message":"I agree but in a larger deployment this could change the status of action plans very quickly.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"0de39e9973a1f8f9006d9e14873b55d8adf94782","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        except Exception:"},{"line_number":204,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def check_state(self):"},{"line_number":207,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":208,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":209,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_278b7820","line":206,"range":{"start_line":206,"start_character":8,"end_line":206,"end_character":19},"in_reply_to":"9a629dbe_75d0da1f","updated":"2016-11-11 08:08:01.000000000","message":"It\u0027s difficult to know the impact. I\u0027ll discuss it at the irc.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            node \u003d None"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.update_instance_mapping(instance, node)"},{"line_number":88,"context_line":"        self.check_state(node\u003dnode)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def update_capacity(self, resource_id, obj, value):"},{"line_number":91,"context_line":"        resource \u003d self.cluster_data_model.get_resource_by_uuid(resource_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_1d20179b","line":88,"range":{"start_line":88,"start_character":0,"end_line":88,"end_character":35},"updated":"2017-01-10 15:18:28.000000000","message":"Why do you want to apply \u0027node\u0027 as a filter for retrieve impacted action plans ? I think we have to consider updating of CDM globally: If the CDM has changed, we have to set action plans computed from it to SUPERSEDED.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            node \u003d None"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.update_instance_mapping(instance, node)"},{"line_number":88,"context_line":"        self.check_state(node\u003dnode)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def update_capacity(self, resource_id, obj, value):"},{"line_number":91,"context_line":"        resource \u003d self.cluster_data_model.get_resource_by_uuid(resource_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_5537afaf","line":88,"range":{"start_line":88,"start_character":0,"end_line":88,"end_character":35},"in_reply_to":"ba5201f7_1d20179b","updated":"2017-01-11 09:30:47.000000000","message":"Node is used to distinguish the affected actionplan, This is added by\nBruno\u0027s comment:IMO we shouldn\u0027t look at at this level of operations in order to invalidate an action plan. The impact in the overall cluster utilization could be very low and the action plan would still be valid (depending on the goal of the strategy). Perhaps this should be implemented in different module that checks if the current state of the system maps to actions of an action_plan.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        except Exception:"},{"line_number":205,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def check_state(self, **kwargs):"},{"line_number":208,"context_line":"        collector_manager \u003d manager.CollectorManager()"},{"line_number":209,"context_line":"        collector \u003d collector_manager.get_cluster_model_collector("},{"line_number":210,"context_line":"            \u0027compute\u0027, osc\u003dclients.OpenStackClients())"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_b7500ad6","line":207,"range":{"start_line":207,"start_character":26,"end_line":207,"end_character":34},"updated":"2017-01-10 15:18:28.000000000","message":"Please simplify. we have only \u0027node\u0027 as parameter for now.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        except Exception:"},{"line_number":205,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def check_state(self, **kwargs):"},{"line_number":208,"context_line":"        collector_manager \u003d manager.CollectorManager()"},{"line_number":209,"context_line":"        collector \u003d collector_manager.get_cluster_model_collector("},{"line_number":210,"context_line":"            \u0027compute\u0027, osc\u003dclients.OpenStackClients())"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_b5445b1b","line":207,"range":{"start_line":207,"start_character":26,"end_line":207,"end_character":34},"in_reply_to":"ba5201f7_b7500ad6","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        except Exception:"},{"line_number":205,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def check_state(self, **kwargs):"},{"line_number":208,"context_line":"        collector_manager \u003d manager.CollectorManager()"},{"line_number":209,"context_line":"        collector \u003d collector_manager.get_cluster_model_collector("},{"line_number":210,"context_line":"            \u0027compute\u0027, osc\u003dclients.OpenStackClients())"},{"line_number":211,"context_line":"        data_model \u003d collector.get_latest_cluster_data_model()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":214,"context_line":"        action_plans \u003d ap_objects.ActionPlan.list("},{"line_number":215,"context_line":"            context.make_context(), filters\u003dfilters)"},{"line_number":216,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"},{"line_number":217,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":218,"context_line":"        for action_plan in action_plans:"},{"line_number":219,"context_line":"            action_plan.check_state("},{"line_number":220,"context_line":"                context.make_context(), model\u003ddata_model, node\u003dnode)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"class VersionnedNotificationEndpoint(NovaNotification):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_e2c65215","line":220,"range":{"start_line":207,"start_character":0,"end_line":220,"end_character":68},"updated":"2017-01-10 15:18:28.000000000","message":"Can we call this method sync_action_plan_state() instead of check_state(). By reading check_state(), I understand ... check the state of nova notification :). And term \u0027sync\u0027 is more appropriate because we check and update the state of an action_plan, if needed.\n\nIf you introduce a new Manager() Class for Action Plan (in objects/action_plan.py), you will have something like this:\n\n  from watcher.objects import action_plan\n\n  ap_manager \u003d action_plan.Manager() \n  ap_manager.sync_state(). \n\nIt will be more readable and understanding.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        except Exception:"},{"line_number":205,"context_line":"            LOG.info(_LI(\"Instance %s already deleted\"), instance.uuid)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def check_state(self, **kwargs):"},{"line_number":208,"context_line":"        collector_manager \u003d manager.CollectorManager()"},{"line_number":209,"context_line":"        collector \u003d collector_manager.get_cluster_model_collector("},{"line_number":210,"context_line":"            \u0027compute\u0027, osc\u003dclients.OpenStackClients())"},{"line_number":211,"context_line":"        data_model \u003d collector.get_latest_cluster_data_model()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED}"},{"line_number":214,"context_line":"        action_plans \u003d ap_objects.ActionPlan.list("},{"line_number":215,"context_line":"            context.make_context(), filters\u003dfilters)"},{"line_number":216,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"},{"line_number":217,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":218,"context_line":"        for action_plan in action_plans:"},{"line_number":219,"context_line":"            action_plan.check_state("},{"line_number":220,"context_line":"                context.make_context(), model\u003ddata_model, node\u003dnode)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"class VersionnedNotificationEndpoint(NovaNotification):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_155607d2","line":220,"range":{"start_line":207,"start_character":0,"end_line":220,"end_character":68},"in_reply_to":"ba5201f7_e2c65215","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"}],"watcher/decision_engine/scheduling.py":[{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"a3ad946f75408b0be5f7e888666a850846ab1c5a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":36,"context_line":"    cfg.IntOpt(\u0027actionplan_validityinterval\u0027,"},{"line_number":37,"context_line":"               default\u003d24,"},{"line_number":38,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":39,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_dd2c779b","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":43},"updated":"2016-11-10 13:59:43.000000000","message":"imo this name could be changed to \u0027actionplan_expiration_time\u0027","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"3e25a28be4f78f6e2cded6c02b86b040a18f06b0","unresolved":false,"context_lines":[{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":36,"context_line":"    cfg.IntOpt(\u0027actionplan_validityinterval\u0027,"},{"line_number":37,"context_line":"               default\u003d24,"},{"line_number":38,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":39,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_5b6da1ca","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":43},"in_reply_to":"9a629dbe_0a5d9914","updated":"2016-11-11 09:36:23.000000000","message":"+1","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"0de39e9973a1f8f9006d9e14873b55d8adf94782","unresolved":false,"context_lines":[{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":36,"context_line":"    cfg.IntOpt(\u0027actionplan_validityinterval\u0027,"},{"line_number":37,"context_line":"               default\u003d24,"},{"line_number":38,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":39,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_0a5d9914","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":43},"in_reply_to":"9a629dbe_dd2c779b","updated":"2016-11-11 08:08:01.000000000","message":"what about \u0027action_plan_validity\u0027?","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"a3ad946f75408b0be5f7e888666a850846ab1c5a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":36,"context_line":"    cfg.IntOpt(\u0027actionplan_validityinterval\u0027,"},{"line_number":37,"context_line":"               default\u003d24,"},{"line_number":38,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":39,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"},{"line_number":40,"context_line":"    cfg.IntOpt(\u0027check_periodic_interval\u0027,"},{"line_number":41,"context_line":"               default\u003d30*60,"},{"line_number":42,"context_line":"               help\u003d_(\u0027Seconds between running periodic tasks.\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_9d491fba","line":39,"range":{"start_line":38,"start_character":23,"end_line":39,"end_character":65},"updated":"2016-11-10 13:59:43.000000000","message":"Time (in hours) for expiring an action plan after it\u0027s created.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"0de39e9973a1f8f9006d9e14873b55d8adf94782","unresolved":false,"context_lines":[{"line_number":35,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":36,"context_line":"    cfg.IntOpt(\u0027actionplan_validityinterval\u0027,"},{"line_number":37,"context_line":"               default\u003d24,"},{"line_number":38,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":39,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"},{"line_number":40,"context_line":"    cfg.IntOpt(\u0027check_periodic_interval\u0027,"},{"line_number":41,"context_line":"               default\u003d30*60,"},{"line_number":42,"context_line":"               help\u003d_(\u0027Seconds between running periodic tasks.\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_aab2ed49","line":39,"range":{"start_line":38,"start_character":23,"end_line":39,"end_character":65},"in_reply_to":"9a629dbe_9d491fba","updated":"2016-11-11 08:08:01.000000000","message":"Done","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"a3ad946f75408b0be5f7e888666a850846ab1c5a","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def check_state(self):"},{"line_number":98,"context_line":"        actionplan_expirydate \u003d ("},{"line_number":99,"context_line":"            CONF.watcher_decision_engine.actionplan_validityinterval)"},{"line_number":100,"context_line":"        LOG.debug(\"actionplan_expirydate %s\", actionplan_expirydate)"},{"line_number":101,"context_line":"        date_created \u003d datetime.datetime.utcnow() - datetime.timedelta("},{"line_number":102,"context_line":"            hours\u003dactionplan_expirydate)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_766705b7","line":99,"range":{"start_line":99,"start_character":42,"end_line":99,"end_character":68},"updated":"2016-11-10 13:59:43.000000000","message":"ditto s/actionplan_validityinterval/actionplan_expiration_time","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"a3ad946f75408b0be5f7e888666a850846ab1c5a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"},{"line_number":111,"context_line":"        interval \u003d CONF.watcher_decision_engine.check_periodic_interval"},{"line_number":112,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_78744f67","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":15},"updated":"2016-11-10 13:59:43.000000000","message":"it would be interesting to add a condition value for the interval (e.g. -1) in case a user doesn\u0027t want its action plans to expire after a certain time.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"2bcb2350e16f45135a1ad82b378129acd4a3fa1a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"},{"line_number":111,"context_line":"        interval \u003d CONF.watcher_decision_engine.check_periodic_interval"},{"line_number":112,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da4df55a_f2d38136","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":15},"in_reply_to":"9a629dbe_2516d555","updated":"2016-12-23 07:04:43.000000000","message":"Done","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c547f2c6d73d64d636e0a53ea84b62d23d6ad753","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"},{"line_number":111,"context_line":"        interval \u003d CONF.watcher_decision_engine.check_periodic_interval"},{"line_number":112,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_2516d555","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":15},"in_reply_to":"9a629dbe_5b59218d","updated":"2016-12-19 14:58:38.000000000","message":"IMHO, this is a good idea although I would rather use a 0 instead of a -1.","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"0de39e9973a1f8f9006d9e14873b55d8adf94782","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"},{"line_number":111,"context_line":"        interval \u003d CONF.watcher_decision_engine.check_periodic_interval"},{"line_number":112,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_ca94818c","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":15},"in_reply_to":"9a629dbe_78744f67","updated":"2016-11-11 08:08:01.000000000","message":"Maybe set a long interval time is ok","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":12087,"name":"Bruno Grazioli","email":"gaea@zhaw.ch","username":"brunograz"},"change_message_id":"3e25a28be4f78f6e2cded6c02b86b040a18f06b0","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"},{"line_number":111,"context_line":"        interval \u003d CONF.watcher_decision_engine.check_periodic_interval"},{"line_number":112,"context_line":"        self.add_job(self.check_state, \u0027interval\u0027, seconds\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_5b59218d","line":109,"range":{"start_line":108,"start_character":0,"end_line":109,"end_character":15},"in_reply_to":"9a629dbe_ca94818c","updated":"2016-11-11 09:36:23.000000000","message":"There was a mistake in my previous comment. I meant adding a condition to action_plan_validity. Something like:\n\nif CONF.watcher_decision_engine.action_plan_validity !\u003d -1:\n    interval \u003d ...","commit_id":"51b2948db7180458187c287b1b7c48264b580616"},{"author":{"_account_id":15949,"name":"Atul Pandey","email":"atul.pandey@nectechnologies.in","username":"atulpandey"},"change_message_id":"001fcd04c75f2b3289b6efac556f93f572397b14","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED,"},{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a6eadb0_49b8c3c8","line":107,"range":{"start_line":107,"start_character":8,"end_line":107,"end_character":21},"updated":"2016-12-15 05:24:02.000000000","message":"Will it be good if we provide some notification in form of logs on the basis of what is the return value from check_actionplan_state()?If not then empty return should suffice.","commit_id":"917e1b94df580038680ba7458ce51f1992499a79"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"a7096180dc591b9da973aff2be9070ec2eb42b73","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        filters \u003d {\u0027state__eq\u0027: ap_objects.State.RECOMMENDED,"},{"line_number":105,"context_line":"                   \u0027created_at__lt\u0027: date_created}"},{"line_number":106,"context_line":"        state_manager \u003d ap_manager.StateManager()"},{"line_number":107,"context_line":"        state_manager.check_actionplan_state(context.make_context(), filters)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def add_checkstate_job(self):"},{"line_number":110,"context_line":"        # 30 minutes interval"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a6eadb0_f79933c5","line":107,"range":{"start_line":107,"start_character":8,"end_line":107,"end_character":21},"in_reply_to":"1a6eadb0_49b8c3c8","updated":"2016-12-16 03:14:57.000000000","message":"log the number of SUPERSEDED action plans","commit_id":"917e1b94df580038680ba7458ce51f1992499a79"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c5102b42fbd62abad359beb65d5498d3180384d8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from watcher import objects"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":"CONF \u003d cfg.CONF"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":35,"context_line":"    cfg.IntOpt(\u0027action_plan_expiry\u0027,"},{"line_number":36,"context_line":"               default\u003d24,"},{"line_number":37,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":38,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"},{"line_number":39,"context_line":"    cfg.IntOpt(\u0027check_periodic_interval\u0027,"},{"line_number":40,"context_line":"               default\u003d30*60,"},{"line_number":41,"context_line":"               help\u003d_(\u0027Seconds between running periodic tasks.\u0027))"},{"line_number":42,"context_line":"]"},{"line_number":43,"context_line":"decision_engine_opt_group \u003d cfg.OptGroup(name\u003d\u0027watcher_decision_engine\u0027,"},{"line_number":44,"context_line":"                                         title\u003d\u0027Defines the parameters of \u0027"},{"line_number":45,"context_line":"                                               \u0027the module decision engine\u0027)"},{"line_number":46,"context_line":"CONF.register_group(decision_engine_opt_group)"},{"line_number":47,"context_line":"CONF.register_opts(WATCHER_DECISION_ENGINE_OPTS, decision_engine_opt_group)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class DecisionEngineSchedulingService(scheduling.BackgroundSchedulerService):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_48a81cdc","line":47,"range":{"start_line":32,"start_character":0,"end_line":47,"end_character":75},"updated":"2017-01-10 16:02:48.000000000","message":"Configuration opts are now declared in watcher/conf (see https://github.com/openstack/watcher/tree/master/watcher/conf). So could you please add them the new way?","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from watcher import objects"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":"CONF \u003d cfg.CONF"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"WATCHER_DECISION_ENGINE_OPTS \u003d ["},{"line_number":35,"context_line":"    cfg.IntOpt(\u0027action_plan_expiry\u0027,"},{"line_number":36,"context_line":"               default\u003d24,"},{"line_number":37,"context_line":"               help\u003d_(\u0027An expiry date(hours). We invalidate the action plan \u0027"},{"line_number":38,"context_line":"                      \u0027if its created older than the expiry date.\u0027)),"},{"line_number":39,"context_line":"    cfg.IntOpt(\u0027check_periodic_interval\u0027,"},{"line_number":40,"context_line":"               default\u003d30*60,"},{"line_number":41,"context_line":"               help\u003d_(\u0027Seconds between running periodic tasks.\u0027))"},{"line_number":42,"context_line":"]"},{"line_number":43,"context_line":"decision_engine_opt_group \u003d cfg.OptGroup(name\u003d\u0027watcher_decision_engine\u0027,"},{"line_number":44,"context_line":"                                         title\u003d\u0027Defines the parameters of \u0027"},{"line_number":45,"context_line":"                                               \u0027the module decision engine\u0027)"},{"line_number":46,"context_line":"CONF.register_group(decision_engine_opt_group)"},{"line_number":47,"context_line":"CONF.register_opts(WATCHER_DECISION_ENGINE_OPTS, decision_engine_opt_group)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class DecisionEngineSchedulingService(scheduling.BackgroundSchedulerService):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_4a547b20","line":47,"range":{"start_line":32,"start_character":0,"end_line":47,"end_character":75},"in_reply_to":"ba5201f7_48a81cdc","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return _sync"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_state(self):"},{"line_number":97,"context_line":"        action_plan_expiry \u003d ("},{"line_number":98,"context_line":"            CONF.watcher_decision_engine.action_plan_expiry)"},{"line_number":99,"context_line":"        LOG.debug(\"action_plan_expiry %s\", action_plan_expiry)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_31b34aeb","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":19},"updated":"2017-01-10 15:18:28.000000000","message":"Why don\u0027t move this method into a new Manager() class in objects/action_plan.py? and rename it check_expired()","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return _sync"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_state(self):"},{"line_number":97,"context_line":"        action_plan_expiry \u003d ("},{"line_number":98,"context_line":"            CONF.watcher_decision_engine.action_plan_expiry)"},{"line_number":99,"context_line":"        LOG.debug(\"action_plan_expiry %s\", action_plan_expiry)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_b55b7bf5","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":19},"in_reply_to":"ba5201f7_31b34aeb","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        action_plans \u003d objects.ActionPlan.list("},{"line_number":106,"context_line":"            context.make_context(), filters\u003dfilters)"},{"line_number":107,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"},{"line_number":108,"context_line":"        action_plans_count \u003d 0"},{"line_number":109,"context_line":"        for action_plan in action_plans:"},{"line_number":110,"context_line":"            action_plans_count +\u003d ("},{"line_number":111,"context_line":"                action_plan.check_state(context.make_context()))"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_9e596c91","line":108,"range":{"start_line":108,"start_character":8,"end_line":108,"end_character":26},"updated":"2017-01-10 15:18:28.000000000","message":"IMHO, you don\u0027t need to manage a counter to get the number of action plan superseded. You can just do a query with the filter state\u003dSUPERSEDED and return the size of the superseded action plan list returned by the query response.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        action_plans \u003d objects.ActionPlan.list("},{"line_number":106,"context_line":"            context.make_context(), filters\u003dfilters)"},{"line_number":107,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"},{"line_number":108,"context_line":"        action_plans_count \u003d 0"},{"line_number":109,"context_line":"        for action_plan in action_plans:"},{"line_number":110,"context_line":"            action_plans_count +\u003d ("},{"line_number":111,"context_line":"                action_plan.check_state(context.make_context()))"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_f56d039a","line":108,"range":{"start_line":108,"start_character":8,"end_line":108,"end_character":26},"in_reply_to":"ba5201f7_9e596c91","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"}],"watcher/objects/action_plan.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":67,"context_line":"-  **CANCELLED** : the :ref:`Action Plan \u003caction_plan_definition\u003e` was in"},{"line_number":68,"context_line":"   **PENDING** or **ONGOING** state and was cancelled by the"},{"line_number":69,"context_line":"   :ref:`Administrator \u003cadministrator_definition\u003e`"},{"line_number":70,"context_line":"\"\"\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"from oslo_log import log"},{"line_number":73,"context_line":"from watcher.common import exception"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_48482e5c","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":3},"updated":"2017-01-10 15:18:28.000000000","message":"please add the SUPERSEDED state in the docstring","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":67,"context_line":"-  **CANCELLED** : the :ref:`Action Plan \u003caction_plan_definition\u003e` was in"},{"line_number":68,"context_line":"   **PENDING** or **ONGOING** state and was cancelled by the"},{"line_number":69,"context_line":"   :ref:`Administrator \u003cadministrator_definition\u003e`"},{"line_number":70,"context_line":"\"\"\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"from oslo_log import log"},{"line_number":73,"context_line":"from watcher.common import exception"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_be444574","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":3},"in_reply_to":"ba5201f7_48482e5c","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":267,"context_line":"            self.__class__(self._context), db_obj, eager\u003dFalse)"},{"line_number":268,"context_line":"        self.obj_refresh(obj)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def check_by_audit(self, context, filters):"},{"line_number":271,"context_line":"        action_plans \u003d objects.ActionPlan.list("},{"line_number":272,"context_line":"            context, filters\u003dfilters)"},{"line_number":273,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_5e3624b5","line":270,"range":{"start_line":270,"start_character":8,"end_line":270,"end_character":22},"updated":"2017-01-10 15:18:28.000000000","message":"The name of this method does not reflect what it does? This method should be in a Manager() class, because it manages action plan state transition.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":267,"context_line":"            self.__class__(self._context), db_obj, eager\u003dFalse)"},{"line_number":268,"context_line":"        self.obj_refresh(obj)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def check_by_audit(self, context, filters):"},{"line_number":271,"context_line":"        action_plans \u003d objects.ActionPlan.list("},{"line_number":272,"context_line":"            context, filters\u003dfilters)"},{"line_number":273,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_75b913cb","line":270,"range":{"start_line":270,"start_character":8,"end_line":270,"end_character":22},"in_reply_to":"ba5201f7_5e3624b5","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            context, filters\u003dfilters)"},{"line_number":273,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        action_plans_count \u003d 0"},{"line_number":276,"context_line":"        audit \u003d objects.Audit.get_by_id(context, self.audit_id)"},{"line_number":277,"context_line":"        filters \u003d {\u0027state__eq\u0027: objects.audit.State.SUCCEEDED,"},{"line_number":278,"context_line":"                   \u0027scope__eq\u0027: audit.scope}"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_5c262517","line":275,"range":{"start_line":275,"start_character":0,"end_line":275,"end_character":30},"updated":"2017-01-10 15:18:28.000000000","message":"we don\u0027t need to compute it here.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            context, filters\u003dfilters)"},{"line_number":273,"context_line":"        LOG.debug(\"action_plans %s\", action_plans)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        action_plans_count \u003d 0"},{"line_number":276,"context_line":"        audit \u003d objects.Audit.get_by_id(context, self.audit_id)"},{"line_number":277,"context_line":"        filters \u003d {\u0027state__eq\u0027: objects.audit.State.SUCCEEDED,"},{"line_number":278,"context_line":"                   \u0027scope__eq\u0027: audit.scope}"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_55b6cfdc","line":275,"range":{"start_line":275,"start_character":0,"end_line":275,"end_character":30},"in_reply_to":"ba5201f7_5c262517","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        return action_plans_count"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def check_by_node(self, context, model, node):"},{"line_number":292,"context_line":"        action_plans_count \u003d 0"},{"line_number":293,"context_line":"        audit \u003d objects.Audit.get_by_id(context, self.audit_id)"},{"line_number":294,"context_line":"        if len(audit.scope) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_1ce81d7c","line":291,"range":{"start_line":291,"start_character":8,"end_line":291,"end_character":21},"updated":"2017-01-10 15:18:28.000000000","message":"ditto","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        return action_plans_count"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def check_by_node(self, context, model, node):"},{"line_number":292,"context_line":"        action_plans_count \u003d 0"},{"line_number":293,"context_line":"        audit \u003d objects.Audit.get_by_id(context, self.audit_id)"},{"line_number":294,"context_line":"        if len(audit.scope) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_15ae0785","line":291,"range":{"start_line":291,"start_character":8,"end_line":291,"end_character":21},"in_reply_to":"ba5201f7_1ce81d7c","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        return action_plans_count"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def check_by_node(self, context, model, node):"},{"line_number":292,"context_line":"        action_plans_count \u003d 0"},{"line_number":293,"context_line":"        audit \u003d objects.Audit.get_by_id(context, self.audit_id)"},{"line_number":294,"context_line":"        if len(audit.scope) \u003e 0:"},{"line_number":295,"context_line":"            audit_scope_handler \u003d default_scope.DefaultScope(audit.scope)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_5c546553","line":292,"range":{"start_line":292,"start_character":0,"end_line":292,"end_character":30},"updated":"2017-01-10 15:18:28.000000000","message":"ditto","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        return action_plans_count"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def check_by_node(self, context, model, node):"},{"line_number":292,"context_line":"        action_plans_count \u003d 0"},{"line_number":293,"context_line":"        audit \u003d objects.Audit.get_by_id(context, self.audit_id)"},{"line_number":294,"context_line":"        if len(audit.scope) \u003e 0:"},{"line_number":295,"context_line":"            audit_scope_handler \u003d default_scope.DefaultScope(audit.scope)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_d5a39f9c","line":292,"range":{"start_line":292,"start_character":0,"end_line":292,"end_character":30},"in_reply_to":"ba5201f7_5c546553","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        return action_plans_count"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def check_state(self, context, **kwargs):"},{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_5c02a53f","line":310,"range":{"start_line":310,"start_character":8,"end_line":310,"end_character":19},"updated":"2017-01-10 15:18:28.000000000","message":"ditto","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        return action_plans_count"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def check_state(self, context, **kwargs):"},{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_95991771","line":310,"range":{"start_line":310,"start_character":8,"end_line":310,"end_character":19},"in_reply_to":"ba5201f7_5c02a53f","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def check_state(self, context, **kwargs):"},{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"},{"line_number":314,"context_line":"        action_plans_count \u003d 0"},{"line_number":315,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_1df3b70b","line":312,"range":{"start_line":312,"start_character":8,"end_line":312,"end_character":13},"updated":"2017-01-10 15:18:28.000000000","message":"Is this filter really used ? I don\u0027t see it in your patch ...","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def check_state(self, context, **kwargs):"},{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"},{"line_number":314,"context_line":"        action_plans_count \u003d 0"},{"line_number":315,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_d57c7f22","line":312,"range":{"start_line":312,"start_character":8,"end_line":312,"end_character":13},"in_reply_to":"ba5201f7_1df3b70b","updated":"2017-01-11 09:30:47.000000000","message":"It\u0027s used in sync_state_by_node()","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    def check_state(self, context, **kwargs):"},{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"},{"line_number":314,"context_line":"        action_plans_count \u003d 0"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if node and model:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_af4b5258","line":313,"range":{"start_line":313,"start_character":8,"end_line":313,"end_character":15},"updated":"2017-01-10 15:18:28.000000000","message":"you use filter from outside and after inside check_by_audit() method. I don\u0027t understand what you want to do exactly. It\u0027s too complex.\n\nAccording to the spec, we want to supersede an action plan in RECOMMENDED state (or another state ?). This function should be simply coded into a single method call Manager.sync_state() in which, you get all RECOMMENDED action plans computed from the updated CDM and set them to SUPERSEDED state. Use scope string as a filter is a bad idea. How can you check the coverage and impact of 2 different scopes by this way. It\u0027s too complicated for now.","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    def check_state(self, context, **kwargs):"},{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"},{"line_number":314,"context_line":"        action_plans_count \u003d 0"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if node and model:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_f5e26300","line":313,"range":{"start_line":313,"start_character":8,"end_line":313,"end_character":15},"in_reply_to":"ba5201f7_af4b5258","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"308b72dfc59adb1a98575385d7fdcb99be19dea4","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"},{"line_number":314,"context_line":"        action_plans_count \u003d 0"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if node and model:"},{"line_number":317,"context_line":"            action_plans_count \u003d self.check_by_node("}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_9c4ecdbf","line":314,"range":{"start_line":314,"start_character":0,"end_line":314,"end_character":30},"updated":"2017-01-10 15:18:28.000000000","message":"ditto","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"938a092df18b534ebe4f9efa7948b90b55b7c2bb","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        node \u003d kwargs.get(\u0027node\u0027, None)"},{"line_number":312,"context_line":"        model \u003d kwargs.get(\u0027model\u0027, None)"},{"line_number":313,"context_line":"        filters \u003d kwargs.get(\u0027filters\u0027, None)"},{"line_number":314,"context_line":"        action_plans_count \u003d 0"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if node and model:"},{"line_number":317,"context_line":"            action_plans_count \u003d self.check_by_node("}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_f51b431a","line":314,"range":{"start_line":314,"start_character":0,"end_line":314,"end_character":30},"in_reply_to":"ba5201f7_9c4ecdbf","updated":"2017-01-11 09:30:47.000000000","message":"Done","commit_id":"974bf2ef9070eab731679e4c5e77782e650ed70e"},{"author":{"_account_id":21361,"name":"Chris Spencer","email":"christopher.m.spencer@intel.com","username":"chrisspencer"},"change_message_id":"4cb0bb083b949d798482dc76aebb51b06aeabb0b","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        audits \u003d objects.Audit.list(context, filters\u003dfilters)"},{"line_number":287,"context_line":"        LOG.debug(\"audits %s\", audits)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        for action_plan in action_plans:"},{"line_number":290,"context_line":"            for audit in audits:"},{"line_number":291,"context_line":"                if (action_plan.audit_id \u003d\u003d audit.id) and ("},{"line_number":292,"context_line":"                        launched_audit.scope \u003d\u003d audit.scope):"},{"line_number":293,"context_line":"                    action_plan.state \u003d State.SUPERSEDED"},{"line_number":294,"context_line":"                    action_plan.save()"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def sync_state_by_node(self, context, **kwargs):"},{"line_number":297,"context_line":"        action_plans \u003d kwargs.get(\u0027action_plans\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_db488a5e","line":294,"range":{"start_line":289,"start_character":8,"end_line":294,"end_character":38},"updated":"2017-01-25 21:35:17.000000000","message":"Are you just trying to see if the launched audit has an action plan?  If so, can we reduce this performance hit of nested for loops? i.e.\n\nfor action_plan in action_plans:\n   if action_plan.audit_id \u003d\u003d launched_audit.id:  \n     ...\nIf we can\u0027t get id from launched_audit we already have it above in audit_id, right?\n\nAnother alternative would be to skip audits we know do not match scope to exit quickly instead of iterating several times first:\n\nfor audit in audits:  \n  if audit.scope\u003d\u003dlaunched_audit.scope:\n     for action_plan in plans:\n        if action_plan.audit_id \u003d\u003d audit.id: \n        ...","commit_id":"40a4d1c5b3bf2527c02b0adaa386c01ed4c63734"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"5eefa66a18255b658ae79ea8f1554fea39955cd9","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        audits \u003d objects.Audit.list(context, filters\u003dfilters)"},{"line_number":287,"context_line":"        LOG.debug(\"audits %s\", audits)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        for action_plan in action_plans:"},{"line_number":290,"context_line":"            for audit in audits:"},{"line_number":291,"context_line":"                if (action_plan.audit_id \u003d\u003d audit.id) and ("},{"line_number":292,"context_line":"                        launched_audit.scope \u003d\u003d audit.scope):"},{"line_number":293,"context_line":"                    action_plan.state \u003d State.SUPERSEDED"},{"line_number":294,"context_line":"                    action_plan.save()"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def sync_state_by_node(self, context, **kwargs):"},{"line_number":297,"context_line":"        action_plans \u003d kwargs.get(\u0027action_plans\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_2d6306b3","line":294,"range":{"start_line":289,"start_character":8,"end_line":294,"end_character":38},"in_reply_to":"3a461143_db488a5e","updated":"2017-01-26 08:11:01.000000000","message":"for finding the actionplan with the same scope. Thanks\nMaybe it\u0027s better to actionplan.list with eager\u003dTrue","commit_id":"40a4d1c5b3bf2527c02b0adaa386c01ed4c63734"}],"watcher/tests/common/test_manager.py":[{"author":{"_account_id":15949,"name":"Atul Pandey","email":"atul.pandey@nectechnologies.in","username":"atulpandey"},"change_message_id":"001fcd04c75f2b3289b6efac556f93f572397b14","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a6eadb0_29ee27b4","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-12-15 05:24:02.000000000","message":"I guess this also need some changes ;-)","commit_id":"917e1b94df580038680ba7458ce51f1992499a79"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"a7096180dc591b9da973aff2be9070ec2eb42b73","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a6eadb0_77ec432a","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"1a6eadb0_29ee27b4","updated":"2016-12-16 03:14:57.000000000","message":"Done","commit_id":"917e1b94df580038680ba7458ce51f1992499a79"}],"watcher/tests/objects/test_action_plan.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"1415b09259ea8babd3253df9d7854a5992dbe635","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        self.state_manager \u003d objects.action_plan.StateManager()"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_sync_state_by_audit(self):"},{"line_number":267,"context_line":"        fake_audit1 \u003d utils.create_test_audit("},{"line_number":268,"context_line":"            uuid\u003dcommon_utils.generate_uuid(),"},{"line_number":269,"context_line":"            state\u003dobjects.audit.State.SUCCEEDED)"},{"line_number":270,"context_line":"        fake_audit2 \u003d utils.create_test_audit("}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_5812bcb5","line":267,"updated":"2017-01-26 15:13:40.000000000","message":"scopes are missing:\n\n        fake_scope_1 \u003d [{\u0027availability_zones\u0027: [{\u0027name\u0027: \u0027AZ1\u0027}, {\u0027name\u0027: \u0027AZ2\u0027}]}]\n        fake_scope_2 \u003d [{\u0027availability_zones\u0027: [{\u0027name\u0027: \u0027AZ2\u0027}, {\u0027name\u0027: \u0027AZ1\u0027}]}]","commit_id":"61f95d491d9bde39ef9cea48c309e635fe9f6d34"}]}
