Skip to content
This repository has been archived by the owner on Sep 4, 2024. It is now read-only.

Commit

Permalink
Support Install SiteExtension from packageUri
Browse files Browse the repository at this point in the history
  • Loading branch information
suwatch committed Jun 28, 2020
1 parent 94525c0 commit d1d5c8c
Show file tree
Hide file tree
Showing 8 changed files with 213 additions and 51 deletions.
3 changes: 2 additions & 1 deletion Kudu.Client/SiteExtensions/RemoteSiteExtensionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,13 @@ public async Task<HttpResponseMessage> GetLocalExtension(string id, bool checkLa
return (await Client.GetAsync(url.ToString())).EnsureSuccessful();
}

public async Task<HttpResponseMessage> InstallExtension(string id, string version = null, string feedUrl = null, SiteExtensionInfo.SiteExtensionType? type = null, string installationArgs = null)
public async Task<HttpResponseMessage> InstallExtension(string id, string version = null, string feedUrl = null, SiteExtensionInfo.SiteExtensionType? type = null, string installationArgs = null, string packageUri = null)
{
var json = new JObject();
json["version"] = version;
json["feed_url"] = feedUrl;
json["installer_command_line_params"] = installationArgs;
json["packageUri"] = packageUri;
if (type.HasValue)
{
json["type"] = Enum.GetName(typeof(SiteExtensionInfo.SiteExtensionType), type.Value);
Expand Down
11 changes: 1 addition & 10 deletions Kudu.Contracts/SiteExtensions/ISiteExtensionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,7 @@ public interface ISiteExtensionManager

Task<SiteExtensionInfo> GetLocalExtension(string id, bool checkLatest);

/// <summary>
/// Install or update a site extension.
/// </summary>
/// <param name="id"></param>
/// <param name="version"></param>
/// <param name="feedUrl"></param>
/// <param name="type"></param>
/// <param name="tracer"></param>
/// <param name="installationArgs">String argument to pass to the install.cmd script. If the string is "a b" then the batch script will parse as %1 = a, %2 = b</param>
Task<SiteExtensionInfo> InstallExtension(string id, string version, string feedUrl, SiteExtensionInfo.SiteExtensionType type, ITracer tracer, string installationArgs);
Task<SiteExtensionInfo> InstallExtension(string id, SiteExtensionInfo requestInfo, ITracer tracer);

Task<bool> UninstallExtension(string id);
}
Expand Down
12 changes: 12 additions & 0 deletions Kudu.Contracts/SiteExtensions/SiteExtensionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public SiteExtensionInfo(JObject json)
LicenseUrl = json.Value<string>("licenseUrl");
Summary = json.Value<string>("description");
IconUrl = json.Value<string>("iconUrl") ?? "https://www.nuget.org/Content/Images/packageDefaultIcon-50x50.png";
PackageUri = json.Value<string>("packageUri");
}

public SiteExtensionInfo(SiteExtensionInfo info)
Expand All @@ -81,6 +82,7 @@ public SiteExtensionInfo(SiteExtensionInfo info)
LocalPath = info.LocalPath;
InstalledDateTime = info.InstalledDateTime;
InstallationArgs = info.InstallationArgs;
PackageUri = info.PackageUri;
}

public SiteExtensionInfo(UIPackageMetadata data)
Expand Down Expand Up @@ -253,6 +255,16 @@ public string Comment
set;
}

/// <summary>
/// explicit url to download nupkg such as https://globalcdn.nuget.org/packages/microsoft.applicationinsights.azurewebsites.2.6.5.nupkg
/// </summary>
[JsonProperty(PropertyName = "packageUri")]
public string PackageUri
{
get;
set;
}

private static string GetElementValue(IEnumerable<XElement> elements, string name)
{
var element = elements.FirstOrDefault(e => e.Name.LocalName.Equals(name, StringComparison.OrdinalIgnoreCase));
Expand Down
19 changes: 11 additions & 8 deletions Kudu.Core/SiteExtensions/FeedExtensionsV2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public static async Task<IEnumerable<SiteExtensionInfo>> SearchLocalRepo(string
throw new InvalidOperationException($"{packageId}.nuspec contains empty content!");
}

if (string.IsNullOrEmpty(searchTerm) || content.Contains(searchTerm))
if (string.IsNullOrEmpty(searchTerm) || content.Contains(searchTerm) || content.IndexOf($"<id>{searchTerm}</id>", StringComparison.OrdinalIgnoreCase) > 0)
{
using (var reader = XmlReader.Create(new System.IO.StringReader(content)))
{
Expand Down Expand Up @@ -206,12 +206,13 @@ public static async Task<SiteExtensionInfo> GetPackageByIdentity(string packageI
/// <param name="destinationFolder">Folder where we copy the package content (content folder only) to</param>
/// <param name="pathToLocalCopyOfNupkg">File path where we copy the nudpk to</param>
/// <returns></returns>
public static async Task DownloadPackageToFolder(string packageId, string packageVersion, string destinationFolder, string pathToLocalCopyOfNupkg)
public static async Task DownloadPackageToFolder(SiteExtensionInfo package, string destinationFolder, string pathToLocalCopyOfNupkg)
{
var packageId = package.Id;
var packageVersion = package.Version;
using (var client = new HttpClient { Timeout = HttpClientTimeout })
{
var uri = new Uri(String.Format("https://www.nuget.org/api/v2/package/{0}/{1}", packageId, packageVersion));

var uri = new Uri(!string.IsNullOrEmpty(package.PackageUri) ? package.PackageUri : $"https://www.nuget.org/api/v2/package/{packageId}/{packageVersion}");
var response = await client.GetAsync(uri);

using (Stream packageStream = await response.Content.ReadAsStreamAsync())
Expand Down Expand Up @@ -253,23 +254,25 @@ public static async Task DownloadPackageToFolder(string packageId, string packag
}
}

public static async Task UpdateLocalPackage(string siteExntentionsRootPath, string packageId, string packageVersion, string destinationFolder, string pathToLocalCopyOfNupkg, ITracer tracer)
public static async Task UpdateLocalPackage(string siteExtentionsRootPath, SiteExtensionInfo package, string destinationFolder, string pathToLocalCopyOfNupkg, ITracer tracer)
{
var packageId = package.Id;
var packageVersion = package.Version;
tracer.Trace("Performing incremental package update for {0}", packageId);
using (var client = new HttpClient { Timeout = HttpClientTimeout })
{
var uri = new Uri(String.Format("https://www.nuget.org/api/v2/package/{0}/{1}", packageId, packageVersion));
var uri = new Uri(!string.IsNullOrEmpty(package.PackageUri) ? package.PackageUri : $"https://www.nuget.org/api/v2/package/{packageId}/{packageVersion}");
var response = await client.GetAsync(uri);
using (Stream newPackageStream = await response.Content.ReadAsStreamAsync())
{
// update file
var localPackage = (await FeedExtensionsV2.SearchLocalRepo(siteExntentionsRootPath, packageId)).FirstOrDefault();
var localPackage = (await FeedExtensionsV2.SearchLocalRepo(siteExtentionsRootPath, packageId)).FirstOrDefault();
if (localPackage == null)
{
throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, "Package {0} not found from local repo.", packageId));
}

string nupkgFile = Directory.GetFiles(Path.Combine(siteExntentionsRootPath, packageId), "*.nupkg", SearchOption.TopDirectoryOnly).FirstOrDefault();
string nupkgFile = Directory.GetFiles(Path.Combine(siteExtentionsRootPath, packageId), "*.nupkg", SearchOption.TopDirectoryOnly).FirstOrDefault();

using (ZipFile oldPackageZip = ZipFile.Read(nupkgFile))
using (ZipFile newPackageZip = ZipFile.Read(newPackageStream))
Expand Down
10 changes: 7 additions & 3 deletions Kudu.Core/SiteExtensions/SiteExtensionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,9 @@ public async Task<SiteExtensionInfo> GetLocalExtension(string id, bool checkLate
return info;
}

public Task<SiteExtensionInfo> InstallExtension(string id, string version, string feedUrl, SiteExtensionInfo.SiteExtensionType type, ITracer tracer, string installationArgs = null)
public Task<SiteExtensionInfo> InstallExtension(string id, SiteExtensionInfo requestInfo, ITracer tracer)
{
var installationTask = InstallExtensionCore(id, version, feedUrl, type, tracer, installationArgs);
var installationTask = InstallExtensionCore(id, requestInfo, tracer);

#pragma warning disable 4014
// Track pending task
Expand All @@ -229,8 +229,12 @@ public Task<SiteExtensionInfo> InstallExtension(string id, string version, strin
return installationTask;
}

private async Task<SiteExtensionInfo> InstallExtensionCore(string id, string version, string feedUrl, SiteExtensionInfo.SiteExtensionType type, ITracer tracer, string installationArgs)
private async Task<SiteExtensionInfo> InstallExtensionCore(string id, SiteExtensionInfo requestInfo, ITracer tracer)
{
var version = requestInfo.Version;
var feedUrl = requestInfo.FeedUrl;
var type = requestInfo.Type;
var installationArgs = requestInfo.InstallationArgs;
try
{
using (tracer.Step("Installing '{0}' version '{1}' from '{2}'", id, version, feedUrl))
Expand Down
Loading

0 comments on commit d1d5c8c

Please sign in to comment.