)]}'
{".gitignore":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"eedb7bb361aa06af54d7f6a722d7823ee9ff6c89","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Files created by releasenotes build"},{"line_number":70,"context_line":"releasenotes/build"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# Mac Desktop Service Store"},{"line_number":73,"context_line":"*.DS_Store"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"1aa78d24_94a8e678","line":73,"range":{"start_line":71,"start_character":0,"end_line":73,"end_character":10},"updated":"2016-07-06 14:40:13.000000000","message":"nit: can you push this into a separate changeset please?","commit_id":"bbf08a6c89cdb29b28364a1eeac877b797815e11"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"83c29b3fd16742ac2280fe3078d57dc6b0a84b01","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Files created by releasenotes build"},{"line_number":70,"context_line":"releasenotes/build"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# Mac Desktop Service Store"},{"line_number":73,"context_line":"*.DS_Store"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"1aa78d24_88560a28","line":73,"range":{"start_line":71,"start_character":0,"end_line":73,"end_character":10},"in_reply_to":"1aa78d24_94a8e678","updated":"2016-07-06 14:56:10.000000000","message":"Done","commit_id":"bbf08a6c89cdb29b28364a1eeac877b797815e11"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Files created by releasenotes build"},{"line_number":70,"context_line":"releasenotes/build"},{"line_number":71,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"1aa78d24_d979c294","line":71,"updated":"2016-07-07 14:55:18.000000000","message":"nit: can you remove this extra space please?","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Files created by releasenotes build"},{"line_number":70,"context_line":"releasenotes/build"},{"line_number":71,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"1aa78d24_3981e6fb","line":71,"in_reply_to":"1aa78d24_d979c294","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"}],"doc/source/image_src/plantuml/watcher_db_schema_diagram.txt":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"8d590c13fad3f34e11db85e792a67632bf5fbb5e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    state : String[20], nullable"},{"line_number":59,"context_line":"    deadline  :DateTime, nullable"},{"line_number":60,"context_line":"    period : Integer, nullable"},{"line_number":61,"context_line":"    "},{"line_number":62,"context_line":"    created_at : DateTime"},{"line_number":63,"context_line":"    updated_at : DateTime"},{"line_number":64,"context_line":"    deleted_at : DateTime"}],"source_content_type":"text/plain","patch_set":6,"id":"3aaa91ec_da2be492","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":4},"updated":"2016-06-23 16:23:04.000000000","message":"nit: extra spaces here","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"37f9560572325fd5b35224fadcc6cfa71055fb27","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    state : String[20], nullable"},{"line_number":59,"context_line":"    deadline  :DateTime, nullable"},{"line_number":60,"context_line":"    period : Integer, nullable"},{"line_number":61,"context_line":"    "},{"line_number":62,"context_line":"    created_at : DateTime"},{"line_number":63,"context_line":"    updated_at : DateTime"},{"line_number":64,"context_line":"    deleted_at : DateTime"}],"source_content_type":"text/plain","patch_set":6,"id":"3aaa91ec_01cf2eb4","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":4},"in_reply_to":"3aaa91ec_da2be492","updated":"2016-06-27 16:08:42.000000000","message":"Done","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    primary_key(id: Integer)"},{"line_number":55,"context_line":"    foreign_key(\"audit_template_id : Integer\")"},{"line_number":56,"context_line":"    uuid : String[36]"},{"line_number":57,"context_line":"    type : String[20]"},{"line_number":58,"context_line":"    state : String[20], nullable"},{"line_number":59,"context_line":"    deadline  :DateTime, nullable"},{"line_number":60,"context_line":"    interval : Integer, nullable"}],"source_content_type":"text/plain","patch_set":12,"id":"1aa78d24_7999aec3","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":8},"updated":"2016-07-07 14:55:18.000000000","message":"can you change it to audit_type please? I was not updated in the patchset that update the audit model...","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    primary_key(id: Integer)"},{"line_number":55,"context_line":"    foreign_key(\"audit_template_id : Integer\")"},{"line_number":56,"context_line":"    uuid : String[36]"},{"line_number":57,"context_line":"    type : String[20]"},{"line_number":58,"context_line":"    state : String[20], nullable"},{"line_number":59,"context_line":"    deadline  :DateTime, nullable"},{"line_number":60,"context_line":"    interval : Integer, nullable"}],"source_content_type":"text/plain","patch_set":12,"id":"1aa78d24_f9df5e0a","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":8},"in_reply_to":"1aa78d24_7999aec3","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"}],"watcher/api/controllers/v1/audit.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        if self.type not in audit_type_values:"},{"line_number":68,"context_line":"            raise exception.AuditTypeNotFound(audit_type\u003dself.type)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        if self.type \u003d\u003d objects.audit.AuditType.CONTINUOUS.value and \\"},{"line_number":71,"context_line":"           self.period \u003d\u003d wtypes.Unset:"},{"line_number":72,"context_line":"            raise exception.AuditPeriodNotSpecified(audit_type\u003dself.type)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_0c1e2fba","line":70,"range":{"start_line":70,"start_character":69,"end_line":70,"end_character":70},"updated":"2016-06-06 09:58:51.000000000","message":"nit: can you wrap using \u0027()\u0027 instead of using \u0027\\\u0027 ?","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        if self.type not in audit_type_values:"},{"line_number":68,"context_line":"            raise exception.AuditTypeNotFound(audit_type\u003dself.type)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        if self.type \u003d\u003d objects.audit.AuditType.CONTINUOUS.value and \\"},{"line_number":71,"context_line":"           self.period \u003d\u003d wtypes.Unset:"},{"line_number":72,"context_line":"            raise exception.AuditPeriodNotSpecified(audit_type\u003dself.type)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_60040115","line":70,"range":{"start_line":70,"start_character":69,"end_line":70,"end_character":70},"in_reply_to":"7aa08908_0c1e2fba","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @staticmethod"},{"line_number":84,"context_line":"    def mandatory_attrs():"},{"line_number":85,"context_line":"        return [\u0027/audit_template_uuid\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class Audit(base.APIBase):"},{"line_number":89,"context_line":"    \"\"\"API representation of a audit."}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_55ad6a30","line":86,"updated":"2016-06-06 09:58:51.000000000","message":"Maybe we should block PATCH requests that would change the type of an audit. What do you think?","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    \"\"\"A list containing a self link and associated audit links\"\"\""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    period \u003d int"},{"line_number":162,"context_line":"    \"\"\"Launch audit in this period\"\"\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def __init__(self, **kwargs):"},{"line_number":165,"context_line":"        self.fields \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_109e5056","line":162,"range":{"start_line":162,"start_character":28,"end_line":162,"end_character":34},"updated":"2016-06-06 09:58:51.000000000","message":"nit: can you specify this is in seconds","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    \"\"\"A list containing a self link and associated audit links\"\"\""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    period \u003d int"},{"line_number":162,"context_line":"    \"\"\"Launch audit in this period\"\"\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def __init__(self, **kwargs):"},{"line_number":165,"context_line":"        self.fields \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_a00ee931","line":162,"range":{"start_line":162,"start_character":28,"end_line":162,"end_character":34},"in_reply_to":"9abb7d3a_109e5056","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"eedb7bb361aa06af54d7f6a722d7823ee9ff6c89","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    links \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"},{"line_number":179,"context_line":"    \"\"\"A list containing a self link and associated audit links\"\"\""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    interval \u003d int"},{"line_number":182,"context_line":"    \"\"\"Launch audit periodically (in seconds)\"\"\""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_b447e2ba","line":181,"range":{"start_line":181,"start_character":15,"end_line":181,"end_character":18},"updated":"2016-07-06 14:40:13.000000000","message":"This one is nullable so it should also be:\n\ninterval \u003d wsme.wsattr(int, mandatory\u003dFalse)","commit_id":"bbf08a6c89cdb29b28364a1eeac877b797815e11"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"83c29b3fd16742ac2280fe3078d57dc6b0a84b01","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    links \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"},{"line_number":179,"context_line":"    \"\"\"A list containing a self link and associated audit links\"\"\""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    interval \u003d int"},{"line_number":182,"context_line":"    \"\"\"Launch audit periodically (in seconds)\"\"\""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_2b39d0d7","line":181,"range":{"start_line":181,"start_character":15,"end_line":181,"end_character":18},"in_reply_to":"1aa78d24_b447e2ba","updated":"2016-07-06 14:56:10.000000000","message":"Done","commit_id":"bbf08a6c89cdb29b28364a1eeac877b797815e11"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        if self.audit_type not in audit_type_values:"},{"line_number":71,"context_line":"            raise exception.AuditTypeNotFound(audit_type\u003dself.audit_type)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        if (self.type \u003d\u003d objects.audit.AuditType.ONESHOT.value and"},{"line_number":74,"context_line":"           self.interval !\u003d wtypes.Unset):"},{"line_number":75,"context_line":"            raise exception.AuditIntervalNotAllowed(audit_type\u003dself.type)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_f6be4d63","line":73,"range":{"start_line":73,"start_character":12,"end_line":73,"end_character":21},"updated":"2016-07-07 14:55:18.000000000","message":"this won\u0027t work anymore: it\u0027s now self.audit_type","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        if self.audit_type not in audit_type_values:"},{"line_number":71,"context_line":"            raise exception.AuditTypeNotFound(audit_type\u003dself.audit_type)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        if (self.type \u003d\u003d objects.audit.AuditType.ONESHOT.value and"},{"line_number":74,"context_line":"           self.interval !\u003d wtypes.Unset):"},{"line_number":75,"context_line":"            raise exception.AuditIntervalNotAllowed(audit_type\u003dself.type)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_59f6728f","line":73,"range":{"start_line":73,"start_character":12,"end_line":73,"end_character":21},"in_reply_to":"1aa78d24_f6be4d63","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":74,"context_line":"           self.interval !\u003d wtypes.Unset):"},{"line_number":75,"context_line":"            raise exception.AuditIntervalNotAllowed(audit_type\u003dself.type)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        if (self.type \u003d\u003d objects.audit.AuditType.CONTINUOUS.value and"},{"line_number":78,"context_line":"           self.interval \u003d\u003d wtypes.Unset):"},{"line_number":79,"context_line":"            raise exception.AuditIntervalNotSpecified(audit_type\u003dself.type)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_36b5757d","line":77,"range":{"start_line":77,"start_character":12,"end_line":77,"end_character":21},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":74,"context_line":"           self.interval !\u003d wtypes.Unset):"},{"line_number":75,"context_line":"            raise exception.AuditIntervalNotAllowed(audit_type\u003dself.type)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        if (self.type \u003d\u003d objects.audit.AuditType.CONTINUOUS.value and"},{"line_number":78,"context_line":"           self.interval \u003d\u003d wtypes.Unset):"},{"line_number":79,"context_line":"            raise exception.AuditIntervalNotSpecified(audit_type\u003dself.type)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_b9f15697","line":77,"range":{"start_line":77,"start_character":12,"end_line":77,"end_character":21},"in_reply_to":"1aa78d24_36b5757d","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        # trigger decision-engine to run the audit"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if new_audit.type \u003d\u003d objects.audit.AuditType.ONESHOT.value:"},{"line_number":441,"context_line":"            dc_client \u003d rpcapi.DecisionEngineAPI()"},{"line_number":442,"context_line":"            dc_client.trigger_audit(context, new_audit.uuid)"},{"line_number":443,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_56ae412e","line":440,"range":{"start_line":440,"start_character":11,"end_line":440,"end_character":25},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        # trigger decision-engine to run the audit"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        if new_audit.type \u003d\u003d objects.audit.AuditType.ONESHOT.value:"},{"line_number":441,"context_line":"            dc_client \u003d rpcapi.DecisionEngineAPI()"},{"line_number":442,"context_line":"            dc_client.trigger_audit(context, new_audit.uuid)"},{"line_number":443,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d930a258","line":440,"range":{"start_line":440,"start_character":11,"end_line":440,"end_character":25},"in_reply_to":"1aa78d24_56ae412e","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"}],"watcher/cmd/decisionengine.py":[{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    periodic_audit \u003d audit_default.PeriodicAuditHandler(de_service)"},{"line_number":50,"context_line":"    launcher \u003d service.launch(CONF, de_service)"},{"line_number":51,"context_line":"    de_service.tg.add_dynamic_timer("},{"line_number":52,"context_line":"        periodic_audit.run_periodic_tasks,"},{"line_number":53,"context_line":"        periodic_interval_max\u003dCONF.periodic_interval,"},{"line_number":54,"context_line":"        context\u003dcontext.RequestContext(is_admin\u003dTrue))"},{"line_number":55,"context_line":"    launcher.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_d5435540","line":52,"updated":"2016-06-14 16:21:39.000000000","message":"Can you move this code to the DecisionEngineManager class.","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    periodic_audit \u003d audit_default.PeriodicAuditHandler(de_service)"},{"line_number":50,"context_line":"    launcher \u003d service.launch(CONF, de_service)"},{"line_number":51,"context_line":"    de_service.tg.add_dynamic_timer("},{"line_number":52,"context_line":"        periodic_audit.run_periodic_tasks,"},{"line_number":53,"context_line":"        periodic_interval_max\u003dCONF.periodic_interval,"},{"line_number":54,"context_line":"        context\u003dcontext.RequestContext(is_admin\u003dTrue))"},{"line_number":55,"context_line":"    launcher.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_1c3e77da","line":52,"in_reply_to":"7aa08908_d5435540","updated":"2016-06-17 10:23:34.000000000","message":"Done","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"}],"watcher/db/sqlalchemy/api.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            query\u003dquery, model\u003dmodels.AuditTemplate, filters\u003dfilters,"},{"line_number":303,"context_line":"            plain_fields\u003dplain_fields, join_fieldmap\u003djoin_fieldmap)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def _add_audits_filters(self, query, filters):"},{"line_number":306,"context_line":"        if filters is None:"},{"line_number":307,"context_line":"            filters \u003d []"},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_30355446","line":305,"range":{"start_line":305,"start_character":8,"end_line":305,"end_character":27},"updated":"2016-06-06 09:58:51.000000000","message":"although it\u0027s not related to your work, can you refactor this function so it looks like _add_audit_templates_filters() just above?","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            query\u003dquery, model\u003dmodels.AuditTemplate, filters\u003dfilters,"},{"line_number":303,"context_line":"            plain_fields\u003dplain_fields, join_fieldmap\u003djoin_fieldmap)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def _add_audits_filters(self, query, filters):"},{"line_number":306,"context_line":"        if filters is None:"},{"line_number":307,"context_line":"            filters \u003d []"},{"line_number":308,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_31ba4d24","line":305,"range":{"start_line":305,"start_character":8,"end_line":305,"end_character":27},"in_reply_to":"9abb7d3a_30355446","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        if \u0027type\u0027 in filters:"},{"line_number":312,"context_line":"            query \u003d query.filter_by(type\u003dfilters[\u0027type\u0027])"},{"line_number":313,"context_line":"        if \u0027state\u0027 in filters:"},{"line_number":314,"context_line":"            if isinstance(filters[\u0027state\u0027], tuple):"},{"line_number":315,"context_line":"                query \u003d query.filter(models.Audit.state.in_(filters[\u0027state\u0027]))"},{"line_number":316,"context_line":"            else:"},{"line_number":317,"context_line":"                query \u003d query.filter_by(state\u003dfilters[\u0027state\u0027])"},{"line_number":318,"context_line":"        if \u0027audit_template_id\u0027 in filters:"},{"line_number":319,"context_line":"            query \u003d query.filter_by("},{"line_number":320,"context_line":"                audit_template_id\u003dfilters[\u0027audit_template_id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_4c795793","line":317,"range":{"start_line":314,"start_character":0,"end_line":317,"end_character":63},"updated":"2016-06-06 09:58:51.000000000","message":"Seeing this change, I actually think we should be able to use comparison operators on all fields instead of having an additional \u0027if\u0027 for this one particular case.\nSo I just submitted https://review.openstack.org/#/c/325794/ which should provide you the \u0027in\u0027 operator using a unified syntax.","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        if \u0027type\u0027 in filters:"},{"line_number":312,"context_line":"            query \u003d query.filter_by(type\u003dfilters[\u0027type\u0027])"},{"line_number":313,"context_line":"        if \u0027state\u0027 in filters:"},{"line_number":314,"context_line":"            if isinstance(filters[\u0027state\u0027], tuple):"},{"line_number":315,"context_line":"                query \u003d query.filter(models.Audit.state.in_(filters[\u0027state\u0027]))"},{"line_number":316,"context_line":"            else:"},{"line_number":317,"context_line":"                query \u003d query.filter_by(state\u003dfilters[\u0027state\u0027])"},{"line_number":318,"context_line":"        if \u0027audit_template_id\u0027 in filters:"},{"line_number":319,"context_line":"            query \u003d query.filter_by("},{"line_number":320,"context_line":"                audit_template_id\u003dfilters[\u0027audit_template_id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_9181814d","line":317,"range":{"start_line":314,"start_character":0,"end_line":317,"end_character":63},"in_reply_to":"7aa08908_4c795793","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"}],"watcher/decision_engine/audit/base.py":[{"author":{"_account_id":17898,"name":"Jinquan Ni","email":"ni.jinquan@zte.com.cn","username":"jinquanni"},"change_message_id":"74d5f8a9d91088b7676eaffade5537f1f2c8d729","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def pre_execute(self, audit, request_context):"},{"line_number":91,"context_line":"        LOG.debug(\"Trigger audit %s\", audit.uuid)"},{"line_number":92,"context_line":"        # change state of the audit to ONGOING"},{"line_number":93,"context_line":"        audit \u003d self.update_audit_state(request_context, audit,"},{"line_number":94,"context_line":"                                        audit_objects.State.ONGOING)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def post_execute(self, audit, solution, request_context):"},{"line_number":97,"context_line":"        self.planner.schedule(request_context, audit.id, solution)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_a9affc92","line":94,"range":{"start_line":93,"start_character":8,"end_line":94,"end_character":68},"updated":"2016-06-28 09:35:57.000000000","message":"The update_audit_state  you defined don\u0027t return any audit.","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"401de45388373a69ed54ee071d5c821b1ab591f3","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def pre_execute(self, audit, request_context):"},{"line_number":91,"context_line":"        LOG.debug(\"Trigger audit %s\", audit.uuid)"},{"line_number":92,"context_line":"        # change state of the audit to ONGOING"},{"line_number":93,"context_line":"        audit \u003d self.update_audit_state(request_context, audit,"},{"line_number":94,"context_line":"                                        audit_objects.State.ONGOING)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def post_execute(self, audit, solution, request_context):"},{"line_number":97,"context_line":"        self.planner.schedule(request_context, audit.id, solution)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_e0543c55","line":94,"range":{"start_line":93,"start_character":8,"end_line":94,"end_character":68},"in_reply_to":"3aaa91ec_a9affc92","updated":"2016-06-29 08:27:07.000000000","message":"Done","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"}],"watcher/decision_engine/audit/continuous.py":[{"author":{"_account_id":17898,"name":"Jinquan Ni","email":"ni.jinquan@zte.com.cn","username":"jinquanni"},"change_message_id":"74d5f8a9d91088b7676eaffade5537f1f2c8d729","unresolved":false,"context_lines":[{"line_number":31,"context_line":"WATCHER_CONTINUOUS_OPTS \u003d ["},{"line_number":32,"context_line":"    cfg.IntOpt(\u0027period_interval\u0027,"},{"line_number":33,"context_line":"               default\u003d10,"},{"line_number":34,"context_line":"               help\u003d\u0027The frequency continuous audits is called with.\u0027)"},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"CONF.register_opts(WATCHER_CONTINUOUS_OPTS, \u0027watcher_decision_engine\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_6bf22f9c","line":34,"range":{"start_line":34,"start_character":25,"end_line":34,"end_character":34},"updated":"2016-06-28 09:35:57.000000000","message":"frequency (in seconds)","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"401de45388373a69ed54ee071d5c821b1ab591f3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"WATCHER_CONTINUOUS_OPTS \u003d ["},{"line_number":32,"context_line":"    cfg.IntOpt(\u0027period_interval\u0027,"},{"line_number":33,"context_line":"               default\u003d10,"},{"line_number":34,"context_line":"               help\u003d\u0027The frequency continuous audits is called with.\u0027)"},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"CONF.register_opts(WATCHER_CONTINUOUS_OPTS, \u0027watcher_decision_engine\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_40639041","line":34,"range":{"start_line":34,"start_character":25,"end_line":34,"end_character":34},"in_reply_to":"3aaa91ec_6bf22f9c","updated":"2016-06-29 08:27:07.000000000","message":"Done","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"87458a5e689aeeb64c05dc07cb3e7e064f489dab","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def _is_audit_alive(self, audit):"},{"line_number":56,"context_line":"        audit \u003d audit_objects.Audit.get_by_uuid(self.context_show_deleted,"},{"line_number":57,"context_line":"                                                audit.uuid)"},{"line_number":58,"context_line":"        if audit.state in (audit_objects.State.CANCELLED,"},{"line_number":59,"context_line":"                           audit_objects.State.DELETED,"},{"line_number":60,"context_line":"                           audit_objects.State.FAILED):"},{"line_number":61,"context_line":"            # if audit isn\u0027t in active states, audit\u0027s job must be removed to"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_72d30939","line":58,"updated":"2016-06-29 13:54:05.000000000","message":"deleting audit jobs in _is_audit_alive is not 100% logically right. Suggest use a new function _delete_audit_jobs, and call it in execute_audit.","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"818c0a363edd24c2dde58dbceaf28b399f548d0a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def _is_audit_alive(self, audit):"},{"line_number":56,"context_line":"        audit \u003d audit_objects.Audit.get_by_uuid(self.context_show_deleted,"},{"line_number":57,"context_line":"                                                audit.uuid)"},{"line_number":58,"context_line":"        if audit.state in (audit_objects.State.CANCELLED,"},{"line_number":59,"context_line":"                           audit_objects.State.DELETED,"},{"line_number":60,"context_line":"                           audit_objects.State.FAILED):"},{"line_number":61,"context_line":"            # if audit isn\u0027t in active states, audit\u0027s job must be removed to"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_3de7edad","line":58,"in_reply_to":"3aaa91ec_72d30939","updated":"2016-07-08 07:00:17.000000000","message":"Renamed to is_audit_inactive","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":17898,"name":"Jinquan Ni","email":"ni.jinquan@zte.com.cn","username":"jinquanni"},"change_message_id":"74d5f8a9d91088b7676eaffade5537f1f2c8d729","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        audit_context \u003d context.RequestContext(is_admin\u003dTrue)"},{"line_number":92,"context_line":"        audit_filters \u003d {"},{"line_number":93,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":94,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"},{"line_number":95,"context_line":"                          audit_objects.State.ONGOING,"},{"line_number":96,"context_line":"                          audit_objects.State.SUCCEEDED)"},{"line_number":97,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_9717b853","line":94,"range":{"start_line":94,"start_character":13,"end_line":94,"end_character":22},"updated":"2016-06-28 09:35:57.000000000","message":"s/state__in/state_in","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"401de45388373a69ed54ee071d5c821b1ab591f3","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        audit_context \u003d context.RequestContext(is_admin\u003dTrue)"},{"line_number":92,"context_line":"        audit_filters \u003d {"},{"line_number":93,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":94,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"},{"line_number":95,"context_line":"                          audit_objects.State.ONGOING,"},{"line_number":96,"context_line":"                          audit_objects.State.SUCCEEDED)"},{"line_number":97,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_a05a3481","line":94,"range":{"start_line":94,"start_character":13,"end_line":94,"end_character":22},"in_reply_to":"3aaa91ec_9717b853","updated":"2016-06-29 08:27:07.000000000","message":"Done","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"87458a5e689aeeb64c05dc07cb3e7e064f489dab","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _start(self):"},{"line_number":111,"context_line":"        self.scheduler.add_job("},{"line_number":112,"context_line":"            self.launch_audits_periodically,"},{"line_number":113,"context_line":"            \u0027interval\u0027,"},{"line_number":114,"context_line":"            seconds\u003dCONF.watcher_decision_engine.period_interval)"},{"line_number":115,"context_line":"        self.scheduler.start()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_96a80c8e","line":112,"range":{"start_line":112,"start_character":17,"end_line":112,"end_character":43},"updated":"2016-06-29 13:54:05.000000000","message":"launch_audits_periodically is maintaining the whole periodic audit list, so the period of each audit is not guaranteed since it depends on launch_audits_periodically called with freq of CONF.watcher_decision_engine.period_interval.\n\nWhy not just allowing do_execute re-alarm execute via add_job if audit state is good? We also need notification handler to detect audit state changes and remove related jobs.","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"818c0a363edd24c2dde58dbceaf28b399f548d0a","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _start(self):"},{"line_number":111,"context_line":"        self.scheduler.add_job("},{"line_number":112,"context_line":"            self.launch_audits_periodically,"},{"line_number":113,"context_line":"            \u0027interval\u0027,"},{"line_number":114,"context_line":"            seconds\u003dCONF.watcher_decision_engine.period_interval)"},{"line_number":115,"context_line":"        self.scheduler.start()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_80403a37","line":112,"range":{"start_line":112,"start_character":17,"end_line":112,"end_character":43},"in_reply_to":"3aaa91ec_96a80c8e","updated":"2016-07-08 07:00:17.000000000","message":"Your suggestions are good but what if decision engine service is restarted? Then we need mechanism that launch all continuous audits again with proper intervals. I will see what we can do with your propositions in the second iteration of this BP (with integrating audit job store https://github.com/agronholm/apscheduler/blob/master/examples/jobstores/sqlalchemy_.py)","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        solution \u003d self.strategy_context.execute_strategy(audit.uuid,"},{"line_number":76,"context_line":"                                                          request_context)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        if audit.type \u003d\u003d audit_objects.AuditType.CONTINUOUS.value:"},{"line_number":79,"context_line":"            a_plan_filters \u003d {\u0027audit_uuid\u0027: audit.uuid,"},{"line_number":80,"context_line":"                              \u0027state\u0027: action_objects.State.RECOMMENDED}"},{"line_number":81,"context_line":"            action_plans \u003d action_objects.ActionPlan.list("}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_76289d9a","line":78,"range":{"start_line":78,"start_character":16,"end_line":78,"end_character":21},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        solution \u003d self.strategy_context.execute_strategy(audit.uuid,"},{"line_number":76,"context_line":"                                                          request_context)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        if audit.type \u003d\u003d audit_objects.AuditType.CONTINUOUS.value:"},{"line_number":79,"context_line":"            a_plan_filters \u003d {\u0027audit_uuid\u0027: audit.uuid,"},{"line_number":80,"context_line":"                              \u0027state\u0027: action_objects.State.RECOMMENDED}"},{"line_number":81,"context_line":"            action_plans \u003d action_objects.ActionPlan.list("}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_79decedd","line":78,"range":{"start_line":78,"start_character":16,"end_line":78,"end_character":21},"in_reply_to":"1aa78d24_76289d9a","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def launch_audits_periodically(self):"},{"line_number":94,"context_line":"        audit_context \u003d context.RequestContext(is_admin\u003dTrue)"},{"line_number":95,"context_line":"        audit_filters \u003d {"},{"line_number":96,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":97,"context_line":"            \u0027state_in\u0027: (audit_objects.State.PENDING,"},{"line_number":98,"context_line":"                         audit_objects.State.ONGOING,"},{"line_number":99,"context_line":"                         audit_objects.State.SUCCEEDED)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d61d1174","line":96,"range":{"start_line":96,"start_character":12,"end_line":96,"end_character":17},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def launch_audits_periodically(self):"},{"line_number":94,"context_line":"        audit_context \u003d context.RequestContext(is_admin\u003dTrue)"},{"line_number":95,"context_line":"        audit_filters \u003d {"},{"line_number":96,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":97,"context_line":"            \u0027state_in\u0027: (audit_objects.State.PENDING,"},{"line_number":98,"context_line":"                         audit_objects.State.ONGOING,"},{"line_number":99,"context_line":"                         audit_objects.State.SUCCEEDED)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_b9e4b6ab","line":96,"range":{"start_line":96,"start_character":12,"end_line":96,"end_character":17},"in_reply_to":"1aa78d24_d61d1174","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"595c55bfe717671a0b908a3f831a2b19d83b0327","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            return True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        return False"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def do_execute(self, audit, request_context):"},{"line_number":74,"context_line":"        # execute the strategy"},{"line_number":75,"context_line":"        solution \u003d self.strategy_context.execute_strategy(audit.uuid,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_8f57ec56","line":72,"updated":"2016-07-07 15:28:26.000000000","message":"You actually miss the following:\n\n    def post_execute(self, audit, solution, request_context):\n        self.planner.schedule(request_context, audit.id, solution)\n\n        # change state of the audit to SUCCEEDED\n        self.update_audit_state(request_context, audit,\n                                audit_objects.State.SUCCEEDED)\n\n\n-------\n\nThis is because we want to have our continuous audit to stay as ONGOING even if it succeeded because it will re-run undefinitely until someone cancels it.\n\n(Can\u0027t remember where but I think we discussed this before)","commit_id":"9d538912db5631c116607506de2fca996341c631"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"e9be20dec2d4479a0ffd2c666aedf726107286fd","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            return True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        return False"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def do_execute(self, audit, request_context):"},{"line_number":74,"context_line":"        # execute the strategy"},{"line_number":75,"context_line":"        solution \u003d self.strategy_context.execute_strategy(audit.uuid,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_aab8d611","line":72,"in_reply_to":"1aa78d24_8f57ec56","updated":"2016-07-07 15:33:14.000000000","message":"Fixed the snippet from above:\n\n    def post_execute(self, audit, solution, request_context):\n        self.planner.schedule(request_context, audit.id, solution)","commit_id":"9d538912db5631c116607506de2fca996341c631"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"595c55bfe717671a0b908a3f831a2b19d83b0327","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        audit_context \u003d context.RequestContext(is_admin\u003dTrue)"},{"line_number":95,"context_line":"        audit_filters \u003d {"},{"line_number":96,"context_line":"            \u0027audit_type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":97,"context_line":"            \u0027state_in\u0027: (audit_objects.State.PENDING,"},{"line_number":98,"context_line":"                         audit_objects.State.ONGOING,"},{"line_number":99,"context_line":"                         audit_objects.State.SUCCEEDED)"},{"line_number":100,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_0f92dc4b","line":97,"range":{"start_line":97,"start_character":13,"end_line":97,"end_character":21},"updated":"2016-07-07 15:28:26.000000000","message":"the filter is wrong here: s/state_in/state__in with a double underscore. (jinquan\u0027s comment was not correct)","commit_id":"9d538912db5631c116607506de2fca996341c631"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"a70b6624a9ce707c30165b9265252a15d78f56a7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"WATCHER_CONTINUOUS_OPTS \u003d ["},{"line_number":32,"context_line":"    cfg.IntOpt(\u0027period_interval\u0027,"},{"line_number":33,"context_line":"               default\u003d10,"},{"line_number":34,"context_line":"               help\u003d\u0027The frequency (in seconds) continuous\u0027"},{"line_number":35,"context_line":"                    \u0027audits is called with.\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_49e5ff06","line":32,"range":{"start_line":32,"start_character":16,"end_line":32,"end_character":31},"updated":"2016-07-07 16:00:59.000000000","message":"continuous_audit_check_interval","commit_id":"647c9e93d61a473e54a549d8f709c106c7fb7f6a"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"a70b6624a9ce707c30165b9265252a15d78f56a7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"WATCHER_CONTINUOUS_OPTS \u003d ["},{"line_number":32,"context_line":"    cfg.IntOpt(\u0027period_interval\u0027,"},{"line_number":33,"context_line":"               default\u003d10,"},{"line_number":34,"context_line":"               help\u003d\u0027The frequency (in seconds) continuous\u0027"},{"line_number":35,"context_line":"                    \u0027audits is called with.\u0027)"},{"line_number":36,"context_line":"]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF.register_opts(WATCHER_CONTINUOUS_OPTS, \u0027watcher_decision_engine\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_69ea7bdc","line":35,"range":{"start_line":34,"start_character":21,"end_line":35,"end_character":42},"updated":"2016-07-07 16:00:59.000000000","message":"Interval, in seconds, for checking new created continuous audit","commit_id":"647c9e93d61a473e54a549d8f709c106c7fb7f6a"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"359a4369d03486d436e1ea6b1382c41576855084","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                              if job.name \u003d\u003d \u0027execute_audit\u0027]"},{"line_number":108,"context_line":"        for audit in audits:"},{"line_number":109,"context_line":"            if audit.uuid not in [arg[0].uuid for arg in scheduler_job_args]:"},{"line_number":110,"context_line":"                job \u003d self.scheduler.add_job(self.execute_audit, \u0027interval\u0027,"},{"line_number":111,"context_line":"                                             args\u003d[audit, audit_context],"},{"line_number":112,"context_line":"                                             seconds\u003daudit.interval,"},{"line_number":113,"context_line":"                                             name\u003d\u0027execute_audit\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_e53cd194","line":110,"range":{"start_line":110,"start_character":37,"end_line":110,"end_character":44},"updated":"2016-07-07 15:46:48.000000000","message":"When I create a continuous audit, I expect this one starts immediately at T0 and not at T0 + interval. \n\nIf you add this option next_run_time\u003ddatetime.datetime.now() to add_job(), the first occurrence will be run at T0, and the second one at T0+internal, and so on ...","commit_id":"647c9e93d61a473e54a549d8f709c106c7fb7f6a"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"2578e711c15f0c8d2295208a6313d4e6e24dee5f","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                              if job.name \u003d\u003d \u0027execute_audit\u0027]"},{"line_number":108,"context_line":"        for audit in audits:"},{"line_number":109,"context_line":"            if audit.uuid not in [arg[0].uuid for arg in scheduler_job_args]:"},{"line_number":110,"context_line":"                job \u003d self.scheduler.add_job(self.execute_audit, \u0027interval\u0027,"},{"line_number":111,"context_line":"                                             args\u003d[audit, audit_context],"},{"line_number":112,"context_line":"                                             seconds\u003daudit.interval,"},{"line_number":113,"context_line":"                                             name\u003d\u0027execute_audit\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_a552c932","line":110,"range":{"start_line":110,"start_character":37,"end_line":110,"end_character":44},"in_reply_to":"1aa78d24_e53cd194","updated":"2016-07-07 15:56:24.000000000","message":"Done","commit_id":"647c9e93d61a473e54a549d8f709c106c7fb7f6a"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"359a4369d03486d436e1ea6b1382c41576855084","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                self.jobs.append({audit.uuid: job})"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _start(self):"},{"line_number":117,"context_line":"        self.scheduler.add_job("},{"line_number":118,"context_line":"            self.launch_audits_periodically,"},{"line_number":119,"context_line":"            \u0027interval\u0027,"},{"line_number":120,"context_line":"            seconds\u003dCONF.watcher_decision_engine.period_interval)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_854ead38","line":117,"range":{"start_line":117,"start_character":23,"end_line":117,"end_character":30},"updated":"2016-07-07 15:46:48.000000000","message":"ditto","commit_id":"647c9e93d61a473e54a549d8f709c106c7fb7f6a"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"2578e711c15f0c8d2295208a6313d4e6e24dee5f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                self.jobs.append({audit.uuid: job})"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _start(self):"},{"line_number":117,"context_line":"        self.scheduler.add_job("},{"line_number":118,"context_line":"            self.launch_audits_periodically,"},{"line_number":119,"context_line":"            \u0027interval\u0027,"},{"line_number":120,"context_line":"            seconds\u003dCONF.watcher_decision_engine.period_interval)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_453a05e8","line":117,"range":{"start_line":117,"start_character":23,"end_line":117,"end_character":30},"in_reply_to":"1aa78d24_854ead38","updated":"2016-07-07 15:56:24.000000000","message":"Done","commit_id":"647c9e93d61a473e54a549d8f709c106c7fb7f6a"}],"watcher/decision_engine/audit/default.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audits \u003d audit_objects.Audit.list(context,"},{"line_number":64,"context_line":"                                          filters\u003d{\u0027type\u0027: \u0027CONTINUOUS\u0027,"},{"line_number":65,"context_line":"                                                   \u0027state\u0027: (\u0027PENDING\u0027,"},{"line_number":66,"context_line":"                                                             \u0027ONGOING\u0027,"},{"line_number":67,"context_line":"                                                             \u0027SUCCEEDED\u0027)})"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_ac99db70","line":64,"range":{"start_line":64,"start_character":60,"end_line":64,"end_character":70},"updated":"2016-06-06 09:58:51.000000000","message":"nit: can you use the AuditType enum here? i.e.\n\naudit_objects.AuditType.CONTINUOUS.value","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audits \u003d audit_objects.Audit.list(context,"},{"line_number":64,"context_line":"                                          filters\u003d{\u0027type\u0027: \u0027CONTINUOUS\u0027,"},{"line_number":65,"context_line":"                                                   \u0027state\u0027: (\u0027PENDING\u0027,"},{"line_number":66,"context_line":"                                                             \u0027ONGOING\u0027,"},{"line_number":67,"context_line":"                                                             \u0027SUCCEEDED\u0027)})"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_119d9165","line":64,"range":{"start_line":64,"start_character":60,"end_line":64,"end_character":70},"in_reply_to":"7aa08908_ac99db70","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audits \u003d audit_objects.Audit.list(context,"},{"line_number":64,"context_line":"                                          filters\u003d{\u0027type\u0027: \u0027CONTINUOUS\u0027,"},{"line_number":65,"context_line":"                                                   \u0027state\u0027: (\u0027PENDING\u0027,"},{"line_number":66,"context_line":"                                                             \u0027ONGOING\u0027,"},{"line_number":67,"context_line":"                                                             \u0027SUCCEEDED\u0027)})"},{"line_number":68,"context_line":"        for audit in audits:"},{"line_number":69,"context_line":"            if audit.uuid not in self.audits:"},{"line_number":70,"context_line":"                self.audits.append(audit.uuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_acfefb68","line":67,"range":{"start_line":65,"start_character":61,"end_line":67,"end_character":72},"updated":"2016-06-06 09:58:51.000000000","message":"ditto with audit_objects.State","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audits \u003d audit_objects.Audit.list(context,"},{"line_number":64,"context_line":"                                          filters\u003d{\u0027type\u0027: \u0027CONTINUOUS\u0027,"},{"line_number":65,"context_line":"                                                   \u0027state\u0027: (\u0027PENDING\u0027,"},{"line_number":66,"context_line":"                                                             \u0027ONGOING\u0027,"},{"line_number":67,"context_line":"                                                             \u0027SUCCEEDED\u0027)})"},{"line_number":68,"context_line":"        for audit in audits:"},{"line_number":69,"context_line":"            if audit.uuid not in self.audits:"},{"line_number":70,"context_line":"                self.audits.append(audit.uuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_518d5930","line":67,"range":{"start_line":65,"start_character":61,"end_line":67,"end_character":72},"in_reply_to":"7aa08908_acfefb68","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def execute(self, audit, context):"},{"line_number":55,"context_line":"        time.sleep(audit.period)"},{"line_number":56,"context_line":"        da \u003d DefaultAuditHandler(self._messaging)"},{"line_number":57,"context_line":"        da.execute(audit.uuid, context)"},{"line_number":58,"context_line":"        self.audits.remove(audit.uuid)"},{"line_number":59,"context_line":"        return audit.uuid"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_1a922cf6","line":56,"updated":"2016-06-14 16:21:39.000000000","message":"I would prefer that the PeriodicAuditHandler extend the DefaultAuditHandler.","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def execute(self, audit, context):"},{"line_number":55,"context_line":"        time.sleep(audit.period)"},{"line_number":56,"context_line":"        da \u003d DefaultAuditHandler(self._messaging)"},{"line_number":57,"context_line":"        da.execute(audit.uuid, context)"},{"line_number":58,"context_line":"        self.audits.remove(audit.uuid)"},{"line_number":59,"context_line":"        return audit.uuid"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_1ca2f74b","line":56,"in_reply_to":"7aa08908_1a922cf6","updated":"2016-06-17 10:23:34.000000000","message":"Done","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        return audit.uuid"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audit_filters \u003d {"},{"line_number":64,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":65,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_3d0d5f8f","line":62,"updated":"2016-06-14 16:21:39.000000000","message":"I\u0027m not very fan of this global loop.\nIt requires that at each step of the loop we check individually if an audit have to be launched or not.\n\nMoreover, the global period have to be under the minimum period specify in the audits. Otherwise, we will not be able to schedule the audit at the good frequency.","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        return audit.uuid"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audit_filters \u003d {"},{"line_number":64,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":65,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_bca80322","line":62,"in_reply_to":"7aa08908_3d0d5f8f","updated":"2016-06-17 10:23:34.000000000","message":"I used apscheduler instead of periodic task","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audit_filters \u003d {"},{"line_number":64,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":65,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"},{"line_number":66,"context_line":"                          audit_objects.State.ONGOING,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_3dd27fd1","line":63,"updated":"2016-06-14 16:21:39.000000000","message":"I would prefer a third-party that supports multiple simultaneous timers capable of trigger an audit.\nMaybe something like the library apscheduler https://github.com/agronholm/apscheduler\nI will take look later if i can find something cool.","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"e4360d79ffee042b29319521a6e5e3202e96850c","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audit_filters \u003d {"},{"line_number":64,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":65,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"},{"line_number":66,"context_line":"                          audit_objects.State.ONGOING,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_82a84a22","line":63,"in_reply_to":"7aa08908_3dd27fd1","updated":"2016-06-15 08:45:14.000000000","message":"IMHO, you should develop the scheduling part with the BackgroundScheduler.\nYou can see below an example:\nhttps://github.com/agronholm/apscheduler/blob/master/examples/schedulers/background.py","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audit_filters \u003d {"},{"line_number":64,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":65,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"},{"line_number":66,"context_line":"                          audit_objects.State.ONGOING,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_3c6b73f3","line":63,"in_reply_to":"7aa08908_3dd27fd1","updated":"2016-06-17 10:23:34.000000000","message":"ditto","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @periodic_task.periodic_task(run_immediately\u003dTrue)"},{"line_number":62,"context_line":"    def launch_audits_periodically(self, context):"},{"line_number":63,"context_line":"        audit_filters \u003d {"},{"line_number":64,"context_line":"            \u0027type\u0027: audit_objects.AuditType.CONTINUOUS.value,"},{"line_number":65,"context_line":"            \u0027state__in\u0027: (audit_objects.State.PENDING,"},{"line_number":66,"context_line":"                          audit_objects.State.ONGOING,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_bc7f63aa","line":63,"in_reply_to":"7aa08908_82a84a22","updated":"2016-06-17 10:23:34.000000000","message":"Done","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        audits \u003d audit_objects.Audit.list(context,"},{"line_number":70,"context_line":"                                          filters\u003daudit_filters)"},{"line_number":71,"context_line":"        for audit in audits:"},{"line_number":72,"context_line":"            if audit.uuid not in self.audits:"},{"line_number":73,"context_line":"                self.audits.append(audit.uuid)"},{"line_number":74,"context_line":"                self.executor.submit(self.execute, audit, context)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_1a1a297d","line":72,"updated":"2016-06-14 16:21:39.000000000","message":"You don\u0027t take into account that each audit can have different periods.\nYou should use the parameter available here: https://review.openstack.org/#/c/321411/4/watcher/db/sqlalchemy/models.py","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        audits \u003d audit_objects.Audit.list(context,"},{"line_number":70,"context_line":"                                          filters\u003daudit_filters)"},{"line_number":71,"context_line":"        for audit in audits:"},{"line_number":72,"context_line":"            if audit.uuid not in self.audits:"},{"line_number":73,"context_line":"                self.audits.append(audit.uuid)"},{"line_number":74,"context_line":"                self.executor.submit(self.execute, audit, context)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_9c538739","line":72,"in_reply_to":"7aa08908_1a1a297d","updated":"2016-06-17 10:23:34.000000000","message":"I use period at 55 line","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            audit \u003d audit_objects.Audit.get_by_uuid(request_context,"},{"line_number":121,"context_line":"                                                    audit_uuid)"},{"line_number":122,"context_line":"            if audit.state \u003d\u003d audit_objects.State.CANCELLED:"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"            self.update_audit_state(request_context, audit_uuid,"},{"line_number":125,"context_line":"                                    audit_objects.State.ONGOING)"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_5d6b0bf1","line":123,"updated":"2016-06-14 16:21:39.000000000","message":"This is not the responsibility of the DefaultAuditHandler.\nYou should move this code in the PeriodicAuditHandler class.","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            audit \u003d audit_objects.Audit.get_by_uuid(request_context,"},{"line_number":121,"context_line":"                                                    audit_uuid)"},{"line_number":122,"context_line":"            if audit.state \u003d\u003d audit_objects.State.CANCELLED:"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"            self.update_audit_state(request_context, audit_uuid,"},{"line_number":125,"context_line":"                                    audit_objects.State.ONGOING)"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_9c7c27b7","line":123,"in_reply_to":"7aa08908_5d6b0bf1","updated":"2016-06-17 10:23:34.000000000","message":"Done","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"8d590c13fad3f34e11db85e792a67632bf5fbb5e","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            solution \u003d self.strategy_context.execute_strategy(audit_uuid,"},{"line_number":84,"context_line":"                                                              request_context)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            if audit.type \u003d\u003d audit_objects.AuditType.CONTINUOUS.value:"},{"line_number":87,"context_line":"                a_plan_filters \u003d {\u0027audit_uuid\u0027: audit.uuid,"},{"line_number":88,"context_line":"                                  \u0027state\u0027: action_objects.State.RECOMMENDED}"},{"line_number":89,"context_line":"                action_plans \u003d action_objects.ActionPlan.list("},{"line_number":90,"context_line":"                    request_context,"},{"line_number":91,"context_line":"                    filters\u003da_plan_filters)"},{"line_number":92,"context_line":"                for plan in action_plans:"},{"line_number":93,"context_line":"                    plan.state \u003d action_objects.State.CANCELLED"},{"line_number":94,"context_line":"                    plan.save()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            self.planner.schedule(request_context, audit.id, solution)"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_232e39a5","line":94,"range":{"start_line":86,"start_character":0,"end_line":94,"end_character":31},"updated":"2016-06-23 16:23:04.000000000","message":"You are using inheritance between the 2 audit handlers but at the same time their logic together in this execute() method.\n\nIMHO, we should make ContinuousAuditHandler inherit from a AuditHandler class. This AuditHandler class would also be an abstract class which is inheriting from BaseAuditHandler but would provide everything DefaultAuditHandler does provide except the execute() method.\nThis execute() would then have a different implementation for ContinuousAuditHandler and DefaultAuditHandler.\n\nBTW, I would argue we rename DefaultAuditHandler as OneShotAuditHandler so it becomes less confusing. We can then put ContinuousAuditHandler into a contiunuous.py module while default.py could be renamed oneshot.py. As for AuditHandler, I would simply put it in the base.py module.","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"37f9560572325fd5b35224fadcc6cfa71055fb27","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            solution \u003d self.strategy_context.execute_strategy(audit_uuid,"},{"line_number":84,"context_line":"                                                              request_context)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            if audit.type \u003d\u003d audit_objects.AuditType.CONTINUOUS.value:"},{"line_number":87,"context_line":"                a_plan_filters \u003d {\u0027audit_uuid\u0027: audit.uuid,"},{"line_number":88,"context_line":"                                  \u0027state\u0027: action_objects.State.RECOMMENDED}"},{"line_number":89,"context_line":"                action_plans \u003d action_objects.ActionPlan.list("},{"line_number":90,"context_line":"                    request_context,"},{"line_number":91,"context_line":"                    filters\u003da_plan_filters)"},{"line_number":92,"context_line":"                for plan in action_plans:"},{"line_number":93,"context_line":"                    plan.state \u003d action_objects.State.CANCELLED"},{"line_number":94,"context_line":"                    plan.save()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            self.planner.schedule(request_context, audit.id, solution)"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_322dbafe","line":94,"range":{"start_line":86,"start_character":0,"end_line":94,"end_character":31},"in_reply_to":"3aaa91ec_232e39a5","updated":"2016-06-27 16:08:42.000000000","message":"Done","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"8d590c13fad3f34e11db85e792a67632bf5fbb5e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                                    audit_objects.State.FAILED)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class ContinuousAuditManager(DefaultAuditHandler):"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def __init__(self, messaging):"},{"line_number":110,"context_line":"        super(ContinuousAuditManager, self).__init__(messaging)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a9d85d2_7d6dde03","line":107,"range":{"start_line":107,"start_character":6,"end_line":107,"end_character":28},"updated":"2016-06-23 16:23:04.000000000","message":"Shouldn\u0027t we call it ContinuousAuditHandler instead since it inherits from DefaultAuditHandler?\n\nAfter reading the specs in more details, it looks like this class is trying to do 2 different things.\n\nFirst of all, you are trying to write an audit handler manager which is itself a handler instead of having a separate manager class that would be responsible for dispatching the incoming audit requests to the right handler.","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"37f9560572325fd5b35224fadcc6cfa71055fb27","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                                    audit_objects.State.FAILED)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"class ContinuousAuditManager(DefaultAuditHandler):"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def __init__(self, messaging):"},{"line_number":110,"context_line":"        super(ContinuousAuditManager, self).__init__(messaging)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_35b804c8","line":107,"range":{"start_line":107,"start_character":6,"end_line":107,"end_character":28},"in_reply_to":"5a9d85d2_7d6dde03","updated":"2016-06-27 16:08:42.000000000","message":"Done","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"8d590c13fad3f34e11db85e792a67632bf5fbb5e","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                             if job.keys()[0] \u003d\u003d audit.uuid][0]"},{"line_number":129,"context_line":"            job_to_delete.remove()"},{"line_number":130,"context_line":"            return"},{"line_number":131,"context_line":"        context.show_deleted \u003d False"},{"line_number":132,"context_line":"        super(ContinuousAuditManager, self).execute(audit.uuid, context)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def launch_audits_periodically(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a9d85d2_90c19183","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":36},"updated":"2016-06-23 16:23:04.000000000","message":"if you do that, you may be overriding the initial setup of show_deleted in case show_deleted was True in the first place.\n\nIMHO, you should move the job_to_delete logic into a separate method which would use a completely separate context with show_deleted.","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"37f9560572325fd5b35224fadcc6cfa71055fb27","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                             if job.keys()[0] \u003d\u003d audit.uuid][0]"},{"line_number":129,"context_line":"            job_to_delete.remove()"},{"line_number":130,"context_line":"            return"},{"line_number":131,"context_line":"        context.show_deleted \u003d False"},{"line_number":132,"context_line":"        super(ContinuousAuditManager, self).execute(audit.uuid, context)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def launch_audits_periodically(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_d5a8a079","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":36},"in_reply_to":"5a9d85d2_90c19183","updated":"2016-06-27 16:08:42.000000000","message":"Done","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"8d590c13fad3f34e11db85e792a67632bf5fbb5e","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _start(self):"},{"line_number":155,"context_line":"        self.scheduler.add_job(self.launch_audits_periodically, \u0027interval\u0027,"},{"line_number":156,"context_line":"                               seconds\u003d10)"},{"line_number":157,"context_line":"        self.scheduler.start()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_d59bb570","line":156,"range":{"start_line":156,"start_character":39,"end_line":156,"end_character":41},"updated":"2016-06-23 16:23:04.000000000","message":"Shouldn\u0027t this be configurable here?","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"37f9560572325fd5b35224fadcc6cfa71055fb27","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _start(self):"},{"line_number":155,"context_line":"        self.scheduler.add_job(self.launch_audits_periodically, \u0027interval\u0027,"},{"line_number":156,"context_line":"                               seconds\u003d10)"},{"line_number":157,"context_line":"        self.scheduler.start()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_f2c69266","line":156,"range":{"start_line":156,"start_character":39,"end_line":156,"end_character":41},"in_reply_to":"3aaa91ec_d59bb570","updated":"2016-06-27 16:08:42.000000000","message":"Done","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"}],"watcher/decision_engine/manager.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"8d590c13fad3f34e11db85e792a67632bf5fbb5e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    API_VERSION \u003d \u00271.0\u0027"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    conductor_endpoints \u003d [audit_endpoint.AuditEndpoint,"},{"line_number":84,"context_line":"                           default.ContinuousAuditManager]"},{"line_number":85,"context_line":"    status_endpoints \u003d []"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_f01b5f19","line":84,"range":{"start_line":84,"start_character":27,"end_line":84,"end_character":57},"updated":"2016-06-23 16:23:04.000000000","message":"After looking at the rest of the code, it looks like you missed one level here.\nThe way it is done for ONESHOT audits is that the AuditEndpoint\nexecutes the do_trigger_audit() method which then calls the DefaultAuditHandler.execute() one.\n\nIMHO, you shouldn\u0027t add another endpoint here since in both cases, we are still handling audits. Instead, we should have the second layer of indirection where you can dispatch to the right type of audit handler.","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"37f9560572325fd5b35224fadcc6cfa71055fb27","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    API_VERSION \u003d \u00271.0\u0027"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    conductor_endpoints \u003d [audit_endpoint.AuditEndpoint,"},{"line_number":84,"context_line":"                           default.ContinuousAuditManager]"},{"line_number":85,"context_line":"    status_endpoints \u003d []"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3aaa91ec_de2ebf41","line":84,"range":{"start_line":84,"start_character":27,"end_line":84,"end_character":57},"in_reply_to":"3aaa91ec_f01b5f19","updated":"2016-06-27 16:08:42.000000000","message":"I moved initial of continuous audit handler to AuditEndpoint.","commit_id":"9d9100f69ced90260a3f424092d1ef9c809fb6f0"}],"watcher/decision_engine/messaging/audit_endpoint.py":[{"author":{"_account_id":17898,"name":"Jinquan Ni","email":"ni.jinquan@zte.com.cn","username":"jinquanni"},"change_message_id":"74d5f8a9d91088b7676eaffade5537f1f2c8d729","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._oneshot_handler \u003d oneshot_handler.OneShotAuditHandler("},{"line_number":38,"context_line":"            self.messaging)"},{"line_number":39,"context_line":"        self._continuous_handler \u003d continuous_handler.ContinuousAuditHandler("},{"line_number":40,"context_line":"            self.messaging)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def executor(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_28414d3a","line":40,"range":{"start_line":40,"start_character":26,"end_line":40,"end_character":27},"updated":"2016-06-28 09:35:57.000000000","message":"Do we need consider the audit type plugable?\nI  think it will be add more aduit type in futrue.","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"401de45388373a69ed54ee071d5c821b1ab591f3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._oneshot_handler \u003d oneshot_handler.OneShotAuditHandler("},{"line_number":38,"context_line":"            self.messaging)"},{"line_number":39,"context_line":"        self._continuous_handler \u003d continuous_handler.ContinuousAuditHandler("},{"line_number":40,"context_line":"            self.messaging)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def executor(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_634df671","line":40,"range":{"start_line":40,"start_character":26,"end_line":40,"end_character":27},"in_reply_to":"3aaa91ec_28414d3a","updated":"2016-06-29 08:27:07.000000000","message":"I don\u0027t think we need to add audit type as plugin since we have to control any new supposed types.\nI have discussed it with jed56 and vincentfrancoise here: http://eavesdrop.openstack.org/irclogs/%23openstack-watcher/%23openstack-watcher.2016-06-29.log.html#t2016-06-29T08:09:31","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"0ff262b19dac02b41e0d6dd36254d2e961cd65e7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self._oneshot_handler \u003d oneshot_handler.OneShotAuditHandler("},{"line_number":38,"context_line":"            self.messaging)"},{"line_number":39,"context_line":"        self._continuous_handler \u003d continuous_handler.ContinuousAuditHandler("},{"line_number":40,"context_line":"            self.messaging)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @property"},{"line_number":43,"context_line":"    def executor(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_a3207e9c","line":40,"range":{"start_line":40,"start_character":26,"end_line":40,"end_character":27},"in_reply_to":"3aaa91ec_28414d3a","updated":"2016-06-29 08:21:27.000000000","message":"IMO, we didn\u0027t need this feature, since we always managing the type of audits.","commit_id":"2556d38d8be6cf95f3af36b1207e0574b1a26bb9"}],"watcher/objects/audit.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \u0027state\u0027: obj_utils.str_or_none,"},{"line_number":86,"context_line":"        \u0027deadline\u0027: obj_utils.datetime_or_str_or_none,"},{"line_number":87,"context_line":"        \u0027audit_template_id\u0027: obj_utils.int_or_none,"},{"line_number":88,"context_line":"        \u0027period\u0027: int,"},{"line_number":89,"context_line":"    }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_acf39b09","line":88,"range":{"start_line":88,"start_character":18,"end_line":88,"end_character":21},"updated":"2016-06-06 09:58:51.000000000","message":"Why not obj_utils.int_or_none since period is a nullable field?","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \u0027state\u0027: obj_utils.str_or_none,"},{"line_number":86,"context_line":"        \u0027deadline\u0027: obj_utils.datetime_or_str_or_none,"},{"line_number":87,"context_line":"        \u0027audit_template_id\u0027: obj_utils.int_or_none,"},{"line_number":88,"context_line":"        \u0027period\u0027: int,"},{"line_number":89,"context_line":"    }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_71b695dd","line":88,"range":{"start_line":88,"start_character":18,"end_line":88,"end_character":21},"in_reply_to":"7aa08908_acf39b09","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"}],"watcher/tests/api/v1/test_audits.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        audit_dict \u003d post_get_test_audit()"},{"line_number":572,"context_line":"        del audit_dict[\u0027uuid\u0027]"},{"line_number":573,"context_line":"        del audit_dict[\u0027state\u0027]"},{"line_number":574,"context_line":"        audit_dict[\u0027type\u0027] \u003d objects.audit.AuditType.CONTINUOUS.value"},{"line_number":575,"context_line":"        audit_dict[\u0027interval\u0027] \u003d 1200"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        response \u003d self.post_json(\u0027/audits\u0027, audit_dict)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d9042216","line":574,"range":{"start_line":574,"start_character":19,"end_line":574,"end_character":26},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        audit_dict \u003d post_get_test_audit()"},{"line_number":572,"context_line":"        del audit_dict[\u0027uuid\u0027]"},{"line_number":573,"context_line":"        del audit_dict[\u0027state\u0027]"},{"line_number":574,"context_line":"        audit_dict[\u0027type\u0027] \u003d objects.audit.AuditType.CONTINUOUS.value"},{"line_number":575,"context_line":"        audit_dict[\u0027interval\u0027] \u003d 1200"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        response \u003d self.post_json(\u0027/audits\u0027, audit_dict)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_19b86a74","line":574,"range":{"start_line":574,"start_character":19,"end_line":574,"end_character":26},"in_reply_to":"1aa78d24_d9042216","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":589,"context_line":"        audit_dict \u003d post_get_test_audit()"},{"line_number":590,"context_line":"        del audit_dict[\u0027uuid\u0027]"},{"line_number":591,"context_line":"        del audit_dict[\u0027state\u0027]"},{"line_number":592,"context_line":"        audit_dict[\u0027type\u0027] \u003d objects.audit.AuditType.CONTINUOUS.value"},{"line_number":593,"context_line":"        del audit_dict[\u0027interval\u0027]"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        response \u003d self.post_json(\u0027/audits\u0027, audit_dict, expect_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_190b4a25","line":592,"range":{"start_line":592,"start_character":20,"end_line":592,"end_character":25},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":589,"context_line":"        audit_dict \u003d post_get_test_audit()"},{"line_number":590,"context_line":"        del audit_dict[\u0027uuid\u0027]"},{"line_number":591,"context_line":"        del audit_dict[\u0027state\u0027]"},{"line_number":592,"context_line":"        audit_dict[\u0027type\u0027] \u003d objects.audit.AuditType.CONTINUOUS.value"},{"line_number":593,"context_line":"        del audit_dict[\u0027interval\u0027]"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        response \u003d self.post_json(\u0027/audits\u0027, audit_dict, expect_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_b9a95626","line":592,"range":{"start_line":592,"start_character":20,"end_line":592,"end_character":25},"in_reply_to":"1aa78d24_190b4a25","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":607,"context_line":"        audit_dict \u003d post_get_test_audit()"},{"line_number":608,"context_line":"        del audit_dict[\u0027uuid\u0027]"},{"line_number":609,"context_line":"        del audit_dict[\u0027state\u0027]"},{"line_number":610,"context_line":"        audit_dict[\u0027type\u0027] \u003d objects.audit.AuditType.ONESHOT.value"},{"line_number":611,"context_line":"        audit_dict[\u0027interval\u0027] \u003d 1200"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        response \u003d self.post_json(\u0027/audits\u0027, audit_dict, expect_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_f928fe87","line":610,"range":{"start_line":610,"start_character":19,"end_line":610,"end_character":26},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"bc184ff930ae7fa20b9bc7b244ca01e7eeec79dc","unresolved":false,"context_lines":[{"line_number":607,"context_line":"        audit_dict \u003d post_get_test_audit()"},{"line_number":608,"context_line":"        del audit_dict[\u0027uuid\u0027]"},{"line_number":609,"context_line":"        del audit_dict[\u0027state\u0027]"},{"line_number":610,"context_line":"        audit_dict[\u0027type\u0027] \u003d objects.audit.AuditType.ONESHOT.value"},{"line_number":611,"context_line":"        audit_dict[\u0027interval\u0027] \u003d 1200"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        response \u003d self.post_json(\u0027/audits\u0027, audit_dict, expect_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d968a2f7","line":610,"range":{"start_line":610,"start_character":19,"end_line":610,"end_character":26},"in_reply_to":"1aa78d24_f928fe87","updated":"2016-07-07 16:35:12.000000000","message":"Done","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"}],"watcher/tests/decision_engine/audit/test_audit_handlers.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"62a940e67b4382e206a0b4ccdc8ead44295897d3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            self.context,"},{"line_number":84,"context_line":"            uuid\u003duuid.uuid4(),"},{"line_number":85,"context_line":"            audit_template_id\u003daudit_template.id,"},{"line_number":86,"context_line":"            type\u003daudit_objects.AuditType.CONTINUOUS.value) for i in range(2)]"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @mock.patch.object(background.BackgroundScheduler, \u0027add_job\u0027)"},{"line_number":89,"context_line":"    @mock.patch.object(background.BackgroundScheduler, \u0027get_jobs\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_19222aa3","line":86,"range":{"start_line":86,"start_character":12,"end_line":86,"end_character":16},"updated":"2016-07-07 14:55:18.000000000","message":"ditto","commit_id":"7fedf1ebf5c276ad0b8f86369844ca6c5d7ed7cb"}],"watcher/tests/decision_engine/audit/test_default_audit_handler.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"3173c7e86e397ad80d68cc5dcc55c688701d7d8f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.audit \u003d obj_utils.create_test_audit("},{"line_number":79,"context_line":"            self.context,"},{"line_number":80,"context_line":"            audit_template_id\u003daudit_template.id,"},{"line_number":81,"context_line":"            type\u003d\"CONTINUOUS\")"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @mock.patch.object(audit_objects.Audit, \u0027list\u0027)"},{"line_number":84,"context_line":"    def test_launch_audits_periodically(self, mock_list):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_0c9d8f65","line":81,"range":{"start_line":81,"start_character":17,"end_line":81,"end_character":29},"updated":"2016-06-06 09:58:51.000000000","message":"audit_objects.AuditType.CONTINUOUS.value","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"af6f642614b5b26f52235f75b677f360c32ec5e3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.audit \u003d obj_utils.create_test_audit("},{"line_number":79,"context_line":"            self.context,"},{"line_number":80,"context_line":"            audit_template_id\u003daudit_template.id,"},{"line_number":81,"context_line":"            type\u003d\"CONTINUOUS\")"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @mock.patch.object(audit_objects.Audit, \u0027list\u0027)"},{"line_number":84,"context_line":"    def test_launch_audits_periodically(self, mock_list):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_f1ca854e","line":81,"range":{"start_line":81,"start_character":17,"end_line":81,"end_character":29},"in_reply_to":"7aa08908_0c9d8f65","updated":"2016-06-07 13:05:27.000000000","message":"Done","commit_id":"17389c5c43128e398ea0c238b7df806b52432b66"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"56aea4f50b107aa29c233c7aa4d13c00a65be29c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        mock_list.return_value \u003d audits"},{"line_number":89,"context_line":"        with mock.patch.object(audit_handler.executor,"},{"line_number":90,"context_line":"                               \u0027submit\u0027) as mock_submit:"},{"line_number":91,"context_line":"            audit_handler.launch_audits_periodically(self.context)"},{"line_number":92,"context_line":"            mock_submit.assert_called()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_bdff8f00","line":91,"updated":"2016-06-14 16:21:39.000000000","message":"You should add some unit-tests.\n(e.g :\n- verify that we can handle several audit with different periods.\n- verify that we remove an audit it is not called anymore.)","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"},{"author":{"_account_id":19055,"name":"Alexander Chadin","email":"joker946@gmail.com","username":"joker946"},"change_message_id":"c0f9be2c46a74c50665c936e253a2e023b8c6943","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        mock_list.return_value \u003d audits"},{"line_number":89,"context_line":"        with mock.patch.object(audit_handler.executor,"},{"line_number":90,"context_line":"                               \u0027submit\u0027) as mock_submit:"},{"line_number":91,"context_line":"            audit_handler.launch_audits_periodically(self.context)"},{"line_number":92,"context_line":"            mock_submit.assert_called()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_077eacae","line":91,"in_reply_to":"7aa08908_bdff8f00","updated":"2016-06-17 10:23:34.000000000","message":"Done","commit_id":"5e231b6cf5c20addce0a9a28a160061af1ea6043"}]}
