private async Task <SiteExtensionInfo> InitInstallSiteExtension(string id, SiteExtensionInfo.SiteExtensionType type) { SiteExtensionStatus settings = new SiteExtensionStatus(_environment.SiteExtensionSettingsPath, id, _traceFactory.GetTracer()); settings.ProvisioningState = Constants.SiteExtensionProvisioningStateCreated; settings.Operation = Constants.SiteExtensionOperationInstall; settings.Status = HttpStatusCode.Created; settings.Type = type; settings.Comment = null; SiteExtensionInfo info = new SiteExtensionInfo(); info.Id = id; settings.FillSiteExtensionInfo(info); return(await Task.FromResult(info)); }
public async Task <HttpResponseMessage> GetLocalExtension(string id, bool checkLatest = true) { var tracer = _traceFactory.GetTracer(); SiteExtensionInfo extension = null; HttpResponseMessage responseMessage = null; if (ArmUtils.IsArmRequest(Request)) { tracer.Trace("Incoming GetLocalExtension is arm request."); SiteExtensionStatus armSettings = new SiteExtensionStatus(_environment.SiteExtensionSettingsPath, id, tracer); if (string.Equals(Constants.SiteExtensionOperationInstall, armSettings.Operation, StringComparison.OrdinalIgnoreCase)) { bool isInstallationLockHeld = IsInstallationLockHeldSafeCheck(id); if (!isInstallationLockHeld && string.Equals(Constants.SiteExtensionProvisioningStateSucceeded, armSettings.ProvisioningState, StringComparison.OrdinalIgnoreCase)) { tracer.Trace("Package {0} was just installed.", id); extension = await _manager.GetLocalExtension(id, checkLatest); if (extension == null) { using (tracer.Step("Status indicate {0} installed, but not able to find it from local repo.", id)) { // should NOT happen extension = new SiteExtensionInfo { Id = id }; responseMessage = Request.CreateResponse(HttpStatusCode.NotFound); // package is gone, remove setting file await armSettings.RemoveStatus(); } } else { if (SiteExtensionInstallationLock.IsAnyPendingLock(_environment.SiteExtensionSettingsPath, tracer)) { using (tracer.Step("{0} finished installation. But there is other installation on-going, fake the status to be Created, so that we can restart once for all.", id)) { // if there is other pending installation, fake the status extension.ProvisioningState = Constants.SiteExtensionProvisioningStateCreated; responseMessage = Request.CreateResponse(HttpStatusCode.Created, ArmUtils.AddEnvelopeOnArmRequest <SiteExtensionInfo>(extension, Request)); } } else { // it is important to call "SiteExtensionStatus.IsAnyInstallationRequireRestart" before "UpdateArmSettingsForSuccessInstallation" // since "IsAnyInstallationRequireRestart" is depending on properties inside site extension status files // while "UpdateArmSettingsForSuccessInstallation" will override some of the values bool requireRestart = SiteExtensionStatus.IsAnyInstallationRequireRestart(_environment.SiteExtensionSettingsPath, _siteExtensionRoot, tracer, _analytics); // clear operation, since opeation is done if (UpdateArmSettingsForSuccessInstallation()) { using (tracer.Step("{0} finished installation and batch update lock aquired. Will notify Antares GEO to restart website.", id)) { responseMessage = Request.CreateResponse(armSettings.Status, ArmUtils.AddEnvelopeOnArmRequest <SiteExtensionInfo>(extension, Request)); // Notify GEO to restart website if necessary if (requireRestart) { responseMessage.Headers.Add(Constants.SiteOperationHeaderKey, Constants.SiteOperationRestart); } } } else { tracer.Trace("Not able to aquire batch update lock, there must be another batch update on-going. return Created status to user to let them poll again."); responseMessage = Request.CreateResponse(HttpStatusCode.Created, ArmUtils.AddEnvelopeOnArmRequest <SiteExtensionInfo>(extension, Request)); } } } } else if (!isInstallationLockHeld && !armSettings.IsTerminalStatus()) { // no background thread is working on instalation // app-pool must be recycled using (tracer.Step("{0} installation cancelled, background thread must be dead.", id)) { extension = new SiteExtensionInfo { Id = id }; extension.ProvisioningState = Constants.SiteExtensionProvisioningStateCanceled; responseMessage = Request.CreateResponse(HttpStatusCode.OK, ArmUtils.AddEnvelopeOnArmRequest <SiteExtensionInfo>(extension, Request)); } } else { // on-going or failed, return status from setting using (tracer.Step("Installation {0}", armSettings.Status)) { extension = new SiteExtensionInfo { Id = id }; armSettings.FillSiteExtensionInfo(extension); responseMessage = Request.CreateResponse(armSettings.Status, ArmUtils.AddEnvelopeOnArmRequest <SiteExtensionInfo>(extension, Request)); } } } // normal GET request if (responseMessage == null) { using (tracer.Step("ARM get : {0}", id)) { extension = await _manager.GetLocalExtension(id, checkLatest); } if (extension == null) { extension = new SiteExtensionInfo { Id = id }; responseMessage = Request.CreateResponse(HttpStatusCode.NotFound); } else { armSettings.FillSiteExtensionInfo(extension); responseMessage = Request.CreateResponse(HttpStatusCode.OK, ArmUtils.AddEnvelopeOnArmRequest <SiteExtensionInfo>(extension, Request)); } } } else { using (tracer.Step("Get: {0}, is not a ARM request.", id)) { extension = await _manager.GetLocalExtension(id, checkLatest); } if (extension == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, id)); } responseMessage = Request.CreateResponse(HttpStatusCode.OK, extension); } return(responseMessage); }