From 2b4c8bd846d96596aa3ec3f630697b0a6455c9ec Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Fri, 8 Sep 2017 15:57:29 +0100 Subject: [PATCH 1/2] clear docupdater project state in deleteAuxFiles --- .../Features/Compile/ClsiManager.coffee | 8 +++- .../DocumentUpdaterHandler.coffee | 16 ++++++++ .../coffee/Compile/ClsiManagerTests.coffee | 6 +++ .../DocumentUpdaterHandlerTests.coffee | 38 ++++++++++++++++++- 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/Compile/ClsiManager.coffee b/services/web/app/coffee/Features/Compile/ClsiManager.coffee index a5402e0546..a3cf891df8 100755 --- a/services/web/app/coffee/Features/Compile/ClsiManager.coffee +++ b/services/web/app/coffee/Features/Compile/ClsiManager.coffee @@ -62,7 +62,13 @@ module.exports = ClsiManager = opts = url:compilerUrl method:"DELETE" - ClsiManager._makeRequest project_id, opts, callback + ClsiManager._makeRequest project_id, opts, (clsiError) -> + # always clear the project state from the docupdater, even if there + # was a problem with the request to the clsi + DocumentUpdaterHandler.clearProjectState project_id, (docUpdaterError) -> + error = clsiError or docUpdaterError + return callback(error) if error? + callback() _makeRequest: (project_id, opts, callback)-> ClsiCookieManager.getCookieJar project_id, (err, jar)-> diff --git a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee index 6e013ef5f2..502fa6c96e 100644 --- a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee +++ b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee @@ -153,6 +153,22 @@ module.exports = DocumentUpdaterHandler = logger.error project_id:project_id, url: url, "doc updater returned a non-success status code: #{res.statusCode}" callback new Error("doc updater returned a non-success status code: #{res.statusCode}") + clearProjectState: (project_id, callback = (error) ->) -> + timer = new metrics.Timer("clear-project-state") + url = "#{settings.apis.documentupdater.url}/project/#{project_id}/clear" + logger.log project_id:project_id, "clearing project state from document updater" + request.post url, (error, res)-> + timer.done() + if error? + logger.error err:error, url:url, project_id:project_id, "error clearing project state from doc updater" + return callback(error) + else if res.statusCode is 200 + logger.log project_id:project_id, "cleared project state from doc updater" + callback() + else + logger.error project_id:project_id, url: url, "doc updater returned a non-success status code: #{res.statusCode}" + callback new Error("doc updater returned a non-success status code: #{res.statusCode}") + acceptChanges: (project_id, doc_id, change_ids = [], callback = (error) ->) -> timer = new metrics.Timer("accept-changes") reqSettings = diff --git a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee index a0a3e3d9cc..24422690b9 100644 --- a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee @@ -125,6 +125,7 @@ describe "ClsiManager", -> describe "deleteAuxFiles", -> beforeEach -> @ClsiManager._makeRequest = sinon.stub().callsArg(2) + @DocumentUpdaterHandler.clearProjectState = sinon.stub().callsArg(1) describe "with the standard compileGroup", -> beforeEach -> @@ -135,6 +136,11 @@ describe "ClsiManager", -> .calledWith(@project_id, { method:"DELETE", url:"#{@settings.apis.clsi.url}/project/#{@project_id}/user/#{@user_id}"}) .should.equal true + it "should clear the project state from the docupdater", -> + @DocumentUpdaterHandler.clearProjectState + .calledWith(@project_id) + .should.equal true + it "should call the callback", -> @callback.called.should.equal true diff --git a/services/web/test/UnitTests/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee b/services/web/test/UnitTests/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee index 11838e1bdf..3c54e8d224 100644 --- a/services/web/test/UnitTests/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/DocumentUpdater/DocumentUpdaterHandlerTests.coffee @@ -293,6 +293,42 @@ describe 'DocumentUpdaterHandler', -> .alwaysCalledWithExactly() .should.equal true + + describe "clearProjectState", -> + beforeEach -> + @callback = sinon.stub() + + describe "successfully", -> + beforeEach -> + @request.post = sinon.stub().callsArgWith(1, null, {statusCode: 200}) + @handler.clearProjectState @project_id, @callback + + it 'should clear the project state from the document updater', -> + url = "#{@settings.apis.documentupdater.url}/project/#{@project_id}/clear" + @request.post.calledWith(url).should.equal true + + it "should call the callback", -> + @callback.calledWithExactly().should.equal true + + describe "when the document updater API returns an error", -> + beforeEach -> + @request.get = sinon.stub().callsArgWith(1, @error = new Error("something went wrong"), null, null) + @handler.getProjectDocsIfMatch @project_id, @project_state_hash, @callback + + it "should return an error to the callback", -> + @callback.calledWith(@error).should.equal true + + describe "when the document updater returns a conflict error code", -> + beforeEach -> + @request.get = sinon.stub().callsArgWith(1, null, { statusCode: 409 }, "Conflict") + @handler.getProjectDocsIfMatch @project_id, @project_state_hash, @callback + + it "should return the callback with no documents", -> + @callback + .alwaysCalledWithExactly() + .should.equal true + + describe "acceptChanges", -> beforeEach -> @change_id = "mock-change-id-1" @@ -364,4 +400,4 @@ describe 'DocumentUpdaterHandler', -> it "should return the callback with an error", -> @callback .calledWith(new Error("doc updater returned failure status code: 500")) - .should.equal true \ No newline at end of file + .should.equal true From 0e87b8950e44d8e4444c7912a4873fd7ee91530d Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 12 Sep 2017 11:40:00 +0100 Subject: [PATCH 2/2] update clearProjectState endpoint --- .../Features/DocumentUpdater/DocumentUpdaterHandler.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee index 502fa6c96e..466152924e 100644 --- a/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee +++ b/services/web/app/coffee/Features/DocumentUpdater/DocumentUpdaterHandler.coffee @@ -155,7 +155,7 @@ module.exports = DocumentUpdaterHandler = clearProjectState: (project_id, callback = (error) ->) -> timer = new metrics.Timer("clear-project-state") - url = "#{settings.apis.documentupdater.url}/project/#{project_id}/clear" + url = "#{settings.apis.documentupdater.url}/project/#{project_id}/clearState" logger.log project_id:project_id, "clearing project state from document updater" request.post url, (error, res)-> timer.done()