public async Task <SiteExtensionInfo> GetRemoteExtension(string id, string version, string feedUrl) { ITracer tracer = _traceFactory.GetTracer(); SourceRepository remoteRepo = GetRemoteRepository(feedUrl); UIPackageMetadata package = null; if (string.IsNullOrWhiteSpace(version)) { using (tracer.Step("Version is null, search latest package by id: {0}", id)) { package = await remoteRepo.GetLatestPackageByIdFromSrcRepo(id); } } else { using (tracer.Step("Search package by id: {0} and version: {1}", id, version)) { package = await remoteRepo.GetPackageByIdentity(id, version); } } if (package == null) { tracer.Trace("No package found with id: {0} and version: {1}", id, version); return(null); } var metadataResource = await _localRepository.GetResourceAndValidateAsync <UIMetadataResource>(); return(await ConvertRemotePackageToSiteExtensionInfo(package, feedUrl, metadataResource)); }
public async Task <SiteExtensionInfo> GetRemoteExtension(string id, string version, string feedUrl) { ITracer tracer = _traceFactory.GetTracer(); SiteExtensionInfo info = GetPreInstalledExtension(id); if (info != null) { return(info); } SourceRepository remoteRepo = GetRemoteRepository(feedUrl); UIPackageMetadata package = null; if (string.IsNullOrWhiteSpace(version)) { using (tracer.Step("Version is null, search latest package by id: {0}", id)) { package = await remoteRepo.GetLatestPackageById(id); } } else { using (tracer.Step("Search package by id: {0} and version: {1}", id, version)) { package = await remoteRepo.GetPackageByIdentity(id, version); } } if (package == null) { tracer.Trace("No package found with id: {0} and version: {1}", id, version); return(null); } return(await ConvertRemotePackageToSiteExtensionInfo(package, feedUrl)); }
private async Task <SiteExtensionInfo> TryInstallExtension(string id, string version, string feedUrl, SiteExtensionInfo.SiteExtensionType type, ITracer tracer, string installationArgs) { SiteExtensionInfo info = null; HttpStatusCode status = HttpStatusCode.OK; // final status when success bool alreadyInstalled = false; try { // Check if site extension already installed (id, version, feedUrl), if already install with correct installation arguments then return right away if (await this.IsSiteExtensionInstalled(id, version, feedUrl, installationArgs)) { // package already installed, return package from local repo. tracer.Trace("Package {0} with version {1} from {2} with installation arguments '{3}' already installed.", id, version, feedUrl, installationArgs); info = await GetLocalExtension(id); alreadyInstalled = true; } else { JsonSettings siteExtensionSettings = GetSettingManager(id); feedUrl = (string.IsNullOrEmpty(feedUrl) ? siteExtensionSettings.GetValue(_feedUrlSetting) : feedUrl); SourceRepository remoteRepo = GetRemoteRepository(feedUrl); UIPackageMetadata localPackage = null; UIPackageMetadata repoPackage = null; if (this.IsInstalledToWebRoot(id)) { // override WebRoot type from setting // WebRoot is a special type that install package to wwwroot, when perform update we need to update new content to wwwroot even if type is not specified type = SiteExtensionInfo.SiteExtensionType.WebRoot; } if (string.IsNullOrWhiteSpace(version)) { using (tracer.Step("Version is null, search latest package by id: {0}, will not search for unlisted package.", id)) { repoPackage = await remoteRepo.GetLatestPackageByIdFromSrcRepo(id); } } else { using (tracer.Step("Search package by id: {0} and version: {1}, will also search for unlisted package.", id, version)) { repoPackage = await remoteRepo.GetPackageByIdentity(id, version); } } if (repoPackage != null) { using (tracer.Step("Install package: {0}.", id)) { string installationDirectory = GetInstallationDirectory(id); localPackage = await InstallExtension(repoPackage, installationDirectory, feedUrl, type, tracer, installationArgs); siteExtensionSettings.SetValues(new KeyValuePair <string, JToken>[] { new KeyValuePair <string, JToken>(_versionSetting, localPackage.Identity.Version.ToNormalizedString()), new KeyValuePair <string, JToken>(_feedUrlSetting, feedUrl), new KeyValuePair <string, JToken>(_installUtcTimestampSetting, DateTime.UtcNow.ToString("u")), new KeyValuePair <string, JToken>(_packageType, Enum.GetName(typeof(SiteExtensionInfo.SiteExtensionType), type)), new KeyValuePair <string, JToken>(_installationArgs, installationArgs) }); } } info = await ConvertLocalPackageToSiteExtensionInfo(localPackage, checkLatest : true, tracer : tracer); } } catch (FileNotFoundException ex) { _analytics.UnexpectedException( ex, method: "PUT", path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id), result: Constants.SiteExtensionProvisioningStateFailed, message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl), trace: false); tracer.TraceError(ex); info = new SiteExtensionInfo(); info.Id = id; info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed; info.Comment = ex.ToString(); status = HttpStatusCode.NotFound; } catch (WebException ex) { _analytics.UnexpectedException( ex, method: "PUT", path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id), result: Constants.SiteExtensionProvisioningStateFailed, message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl), trace: false); tracer.TraceError(ex); info = new SiteExtensionInfo(); info.Id = id; info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed; info.Comment = ex.ToString(); status = HttpStatusCode.BadRequest; } catch (InvalidEndpointException ex) { _analytics.UnexpectedException(ex, trace: false); tracer.TraceError(ex); info = new SiteExtensionInfo(); info.Id = id; info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed; info.Comment = ex.ToString(); status = HttpStatusCode.BadRequest; } catch (Exception ex) { _analytics.UnexpectedException( ex, method: "PUT", path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id), result: Constants.SiteExtensionProvisioningStateFailed, message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl), trace: false); tracer.TraceError(ex); info = new SiteExtensionInfo(); info.Id = id; info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed; info.Comment = ex.ToString(); status = HttpStatusCode.BadRequest; } if (info == null) { // treat this as an error case since no result return from repo _analytics.UnexpectedException( new FileNotFoundException(id), method: "PUT", path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id), result: Constants.SiteExtensionProvisioningStateFailed, message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl), trace: false); info = new SiteExtensionInfo(); info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed; info.Comment = string.Format(Constants.SiteExtensionProvisioningStateNotFoundMessageFormat, id); status = HttpStatusCode.NotFound; } else if (!string.Equals(Constants.SiteExtensionProvisioningStateFailed, info.ProvisioningState, StringComparison.OrdinalIgnoreCase)) { info.ProvisioningState = Constants.SiteExtensionProvisioningStateSucceeded; info.Comment = null; } using (tracer.Step("Update arm settings for {0} installation. Status: {1}", id, status)) { SiteExtensionStatus armSettings = new SiteExtensionStatus(_environment.SiteExtensionSettingsPath, id, tracer); armSettings.ReadSiteExtensionInfo(info); armSettings.Status = status; armSettings.Operation = alreadyInstalled ? null : Constants.SiteExtensionOperationInstall; } return(info); }
// <inheritdoc /> public async Task <SiteExtensionInfo> InstallExtension(string id, string version, string feedUrl) { ITracer tracer = _traceFactory.GetTracer(); if (_preInstalledExtensionDictionary.ContainsKey(id)) { tracer.Trace("Pre-installed site extension found: {0}, not going to perform new installation.", id); return(EnablePreInstalledExtension(_preInstalledExtensionDictionary[id])); } else { // Check if site extension already installed (id, version, feedUrl), if already install return right away if (await this.IsSiteExtensionInstalled(id, version, feedUrl)) { // package already installed, return package from local repo. tracer.Trace("Site extension {0} with version {1} from {2} already installed.", id, version, feedUrl); return(await GetLocalExtension(id)); } JsonSettings siteExtensionSettings = GetSettingManager(id); if (String.IsNullOrEmpty(feedUrl)) { feedUrl = siteExtensionSettings.GetValue(_feedUrlSetting); } SourceRepository remoteRepo = GetRemoteRepository(feedUrl); UIPackageMetadata localPackage = null; UIPackageMetadata repoPackage = null; if (string.IsNullOrWhiteSpace(version)) { using (tracer.Step("Version is null, search latest package by id: {0}", id)) { repoPackage = await remoteRepo.GetLatestPackageById(id); } } else { using (tracer.Step("Search package by id: {0} and version: {1}", id, version)) { repoPackage = await remoteRepo.GetPackageByIdentity(id, version); } } if (repoPackage != null) { using (tracer.Step("Install package: {0}.", id)) { string installationDirectory = GetInstallationDirectory(id); localPackage = await InstallExtension(repoPackage, installationDirectory, feedUrl); siteExtensionSettings.SetValues(new KeyValuePair <string, JToken>[] { new KeyValuePair <string, JToken>(_versionSetting, localPackage.Identity.Version.ToNormalizedString()), new KeyValuePair <string, JToken>(_feedUrlSetting, feedUrl), new KeyValuePair <string, JToken>(_installUtcTimestampSetting, DateTime.UtcNow.ToString("u")) }); } } return(await ConvertLocalPackageToSiteExtensionInfo(localPackage, checkLatest : true)); } }