Skip to content

Commit d2bc361

Browse files
authored
Adding api to track inprogress installations (#3060)
1 parent cb1dcf2 commit d2bc361

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

src/WebJobs.Script.WebHost/Controllers/ExtensionsController.cs

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,13 @@ public async Task<IActionResult> Get()
5454
[Route("admin/host/extensions")]
5555
public Task<IActionResult> Put(int id, [FromBody]ExtensionPackageReference package) => InstallExtension(package);
5656

57-
[HttpDelete("{id}")]
58-
[Route("admin/host/extensions")]
57+
[HttpDelete]
58+
[Route("admin/host/extensions/{id}")]
5959
public async Task<IActionResult> Delete(string id)
6060
{
6161
// TODO: Check if we have an active job
6262

63-
var job = await CreateJob();
64-
63+
var job = await CreateJob(new ExtensionPackageReference() { Id = id, Version = string.Empty });
6564
await _extensionsManager.DeleteExtensions(id)
6665
.ContinueWith(t => ProcessJobTaskResult(t, job.Id));
6766

@@ -85,6 +84,16 @@ public async Task<IActionResult> GetJobs(string id)
8584
return Ok(apiModel);
8685
}
8786

87+
[HttpGet]
88+
[Route("admin/host/extensions/jobs")]
89+
public async Task<IActionResult> GetJobs()
90+
{
91+
IEnumerable<ExtensionsRestoreJob> jobs = await GetInProgressJobs();
92+
var jobContent = new { jobs };
93+
var result = ApiModelUtility.CreateApiModel(jobContent, Request);
94+
return Ok(result);
95+
}
96+
8897
public async Task<IActionResult> InstallExtension(ExtensionPackageReference package, bool verifyConflict = true)
8998
{
9099
if (package == null)
@@ -102,7 +111,7 @@ public async Task<IActionResult> InstallExtension(ExtensionPackageReference pack
102111
}
103112
}
104113

105-
ExtensionsRestoreJob job = await CreateJob();
114+
ExtensionsRestoreJob job = await CreateJob(package);
106115

107116
string jobId = job.Id;
108117
var addTask = _extensionsManager.AddExtensions(package)
@@ -136,24 +145,29 @@ private async Task ProcessJobTaskResult(Task jobTask, string jobId)
136145
await SaveJob(job);
137146
}
138147

139-
private async Task<ExtensionsRestoreJob> CreateJob()
148+
private async Task<ExtensionsRestoreJob> CreateJob(ExtensionPackageReference package)
140149
{
141-
var job = new ExtensionsRestoreJob();
150+
var job = new ExtensionsRestoreJob()
151+
{
152+
Properties = new Dictionary<string, string>()
153+
{
154+
{ "id", package.Id },
155+
{ "version", package.Version }
156+
}
157+
};
142158
await SaveJob(job);
143-
144159
return job;
145160
}
146161

147162
private async Task SaveJob(ExtensionsRestoreJob job)
148163
{
149-
string jobPath = GetJobPath(job.Id);
150-
164+
string jobPath = Path.Combine(GetJobBasePath(), $"{job.Id}.json");
151165
Directory.CreateDirectory(Path.GetDirectoryName(jobPath));
152166

153167
await FileUtility.WriteAsync(jobPath, JsonConvert.SerializeObject(job));
154168
}
155169

156-
private string GetJobPath(string jobId)
170+
private string GetJobBasePath()
157171
{
158172
string home = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteHomePath);
159173
string basePath = null;
@@ -165,13 +179,12 @@ private string GetJobPath(string jobId)
165179
{
166180
basePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".azurefunctions", "extensions");
167181
}
168-
169-
return Path.Combine(basePath, $"{jobId}.json");
182+
return basePath;
170183
}
171184

172185
private async Task<ExtensionsRestoreJob> GetJob(string jobId)
173186
{
174-
string path = GetJobPath(jobId);
187+
string path = Path.Combine(GetJobBasePath(), $"{jobId}.json");
175188

176189
if (System.IO.File.Exists(path))
177190
{
@@ -182,5 +195,24 @@ private async Task<ExtensionsRestoreJob> GetJob(string jobId)
182195

183196
return null;
184197
}
198+
199+
private async Task<IEnumerable<ExtensionsRestoreJob>> GetInProgressJobs()
200+
{
201+
var jobPaths = await FileUtility.GetFilesAsync(GetJobBasePath(), "*.json");
202+
List<ExtensionsRestoreJob> jobs = new List<ExtensionsRestoreJob>();
203+
foreach (var jobPath in jobPaths)
204+
{
205+
if (System.IO.File.Exists(jobPath))
206+
{
207+
string json = await FileUtility.ReadAsync(jobPath);
208+
var job = JsonConvert.DeserializeObject<ExtensionsRestoreJob>(json);
209+
if (job.Status == ExtensionsRestoreStatus.Started)
210+
{
211+
jobs.Add(job);
212+
}
213+
}
214+
}
215+
return jobs;
216+
}
185217
}
186218
}

src/WebJobs.Script.WebHost/Models/ExtensionsRestoreJob.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,7 @@ public ExtensionsRestoreJob()
2626
public DateTimeOffset? EndTime { get; set; }
2727

2828
public string Error { get; set; }
29+
30+
public IDictionary<string, string> Properties { get; set; }
2931
}
3032
}

0 commit comments

Comments
 (0)