@@ -54,14 +54,13 @@ public async Task<IActionResult> Get()
54
54
[ Route ( "admin/host/extensions" ) ]
55
55
public Task < IActionResult > Put ( int id , [ FromBody ] ExtensionPackageReference package ) => InstallExtension ( package ) ;
56
56
57
- [ HttpDelete ( "{id}" ) ]
58
- [ Route ( "admin/host/extensions" ) ]
57
+ [ HttpDelete ]
58
+ [ Route ( "admin/host/extensions/{id} " ) ]
59
59
public async Task < IActionResult > Delete ( string id )
60
60
{
61
61
// TODO: Check if we have an active job
62
62
63
- var job = await CreateJob ( ) ;
64
-
63
+ var job = await CreateJob ( new ExtensionPackageReference ( ) { Id = id , Version = string . Empty } ) ;
65
64
await _extensionsManager . DeleteExtensions ( id )
66
65
. ContinueWith ( t => ProcessJobTaskResult ( t , job . Id ) ) ;
67
66
@@ -85,6 +84,16 @@ public async Task<IActionResult> GetJobs(string id)
85
84
return Ok ( apiModel ) ;
86
85
}
87
86
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
+
88
97
public async Task < IActionResult > InstallExtension ( ExtensionPackageReference package , bool verifyConflict = true )
89
98
{
90
99
if ( package == null )
@@ -102,7 +111,7 @@ public async Task<IActionResult> InstallExtension(ExtensionPackageReference pack
102
111
}
103
112
}
104
113
105
- ExtensionsRestoreJob job = await CreateJob ( ) ;
114
+ ExtensionsRestoreJob job = await CreateJob ( package ) ;
106
115
107
116
string jobId = job . Id ;
108
117
var addTask = _extensionsManager . AddExtensions ( package )
@@ -136,24 +145,29 @@ private async Task ProcessJobTaskResult(Task jobTask, string jobId)
136
145
await SaveJob ( job ) ;
137
146
}
138
147
139
- private async Task < ExtensionsRestoreJob > CreateJob ( )
148
+ private async Task < ExtensionsRestoreJob > CreateJob ( ExtensionPackageReference package )
140
149
{
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
+ } ;
142
158
await SaveJob ( job ) ;
143
-
144
159
return job ;
145
160
}
146
161
147
162
private async Task SaveJob ( ExtensionsRestoreJob job )
148
163
{
149
- string jobPath = GetJobPath ( job . Id ) ;
150
-
164
+ string jobPath = Path . Combine ( GetJobBasePath ( ) , $ "{ job . Id } .json") ;
151
165
Directory . CreateDirectory ( Path . GetDirectoryName ( jobPath ) ) ;
152
166
153
167
await FileUtility . WriteAsync ( jobPath , JsonConvert . SerializeObject ( job ) ) ;
154
168
}
155
169
156
- private string GetJobPath ( string jobId )
170
+ private string GetJobBasePath ( )
157
171
{
158
172
string home = _settingsManager . GetSetting ( EnvironmentSettingNames . AzureWebsiteHomePath ) ;
159
173
string basePath = null ;
@@ -165,13 +179,12 @@ private string GetJobPath(string jobId)
165
179
{
166
180
basePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . UserProfile ) , ".azurefunctions" , "extensions" ) ;
167
181
}
168
-
169
- return Path . Combine ( basePath , $ "{ jobId } .json") ;
182
+ return basePath ;
170
183
}
171
184
172
185
private async Task < ExtensionsRestoreJob > GetJob ( string jobId )
173
186
{
174
- string path = GetJobPath ( jobId ) ;
187
+ string path = Path . Combine ( GetJobBasePath ( ) , $ " { jobId } .json" ) ;
175
188
176
189
if ( System . IO . File . Exists ( path ) )
177
190
{
@@ -182,5 +195,24 @@ private async Task<ExtensionsRestoreJob> GetJob(string jobId)
182
195
183
196
return null ;
184
197
}
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
+ }
185
217
}
186
218
}
0 commit comments