9
9
using System . Reflection ;
10
10
using System . Threading . Tasks ;
11
11
using Microsoft . Azure . WebJobs . Hosting ;
12
+ using Microsoft . Azure . WebJobs . Script . Config ;
12
13
using Microsoft . Azure . WebJobs . Script . Description ;
13
14
using Microsoft . Azure . WebJobs . Script . Diagnostics ;
14
15
using Microsoft . Azure . WebJobs . Script . Diagnostics . Extensions ;
@@ -38,12 +39,11 @@ public class ScriptStartupTypeLocator : IWebJobsStartupTypeLocator
38
39
private readonly IMetricsLogger _metricsLogger ;
39
40
private readonly Lazy < IEnumerable < Type > > _startupTypes ;
40
41
private readonly IOptionsMonitor < LanguageWorkerOptions > _languageWorkerOptions ;
41
-
42
- private static readonly ExtensionRequirementsInfo _extensionRequirements = DependencyHelper . GetExtensionRequirements ( ) ;
42
+ private readonly IOptions < ExtensionRequirementOptions > _extensionRequirementOptions ;
43
43
private static string [ ] _builtinExtensionAssemblies = GetBuiltinExtensionAssemblies ( ) ;
44
44
45
45
public ScriptStartupTypeLocator ( string rootScriptPath , ILogger < ScriptStartupTypeLocator > logger , IExtensionBundleManager extensionBundleManager ,
46
- IFunctionMetadataManager functionMetadataManager , IMetricsLogger metricsLogger , IOptionsMonitor < LanguageWorkerOptions > languageWorkerOptions )
46
+ IFunctionMetadataManager functionMetadataManager , IMetricsLogger metricsLogger , IOptionsMonitor < LanguageWorkerOptions > languageWorkerOptions , IOptions < ExtensionRequirementOptions > extensionRequirementOptions )
47
47
{
48
48
_rootScriptPath = rootScriptPath ?? throw new ArgumentNullException ( nameof ( rootScriptPath ) ) ;
49
49
_extensionBundleManager = extensionBundleManager ?? throw new ArgumentNullException ( nameof ( extensionBundleManager ) ) ;
@@ -52,6 +52,7 @@ public ScriptStartupTypeLocator(string rootScriptPath, ILogger<ScriptStartupType
52
52
_metricsLogger = metricsLogger ;
53
53
_startupTypes = new Lazy < IEnumerable < Type > > ( ( ) => GetExtensionsStartupTypesAsync ( ) . ConfigureAwait ( false ) . GetAwaiter ( ) . GetResult ( ) ) ;
54
54
_languageWorkerOptions = languageWorkerOptions ;
55
+ _extensionRequirementOptions = extensionRequirementOptions ;
55
56
}
56
57
57
58
private static string [ ] GetBuiltinExtensionAssemblies ( )
@@ -84,11 +85,12 @@ public async Task<IEnumerable<Type>> GetExtensionsStartupTypesAsync()
84
85
85
86
// dotnet app precompiled -> Do not use bundles
86
87
var workerConfigs = _languageWorkerOptions . CurrentValue . WorkerConfigs ;
88
+ ExtensionRequirementsInfo extensionRequirements = GetExtensionRequirementsInfo ( ) ;
87
89
ImmutableArray < FunctionMetadata > functionMetadataCollection = ImmutableArray < FunctionMetadata > . Empty ;
88
90
if ( bundleConfigured )
89
91
{
90
92
ExtensionBundleDetails bundleDetails = await _extensionBundleManager . GetExtensionBundleDetails ( ) ;
91
- ValidateBundleRequirements ( bundleDetails ) ;
93
+ ValidateBundleRequirements ( bundleDetails , extensionRequirements ) ;
92
94
93
95
functionMetadataCollection = _functionMetadataManager . GetFunctionMetadata ( forceRefresh : true , includeCustomProviders : false , workerConfigs : workerConfigs ) ;
94
96
bindingsSet = new HashSet < string > ( StringComparer . OrdinalIgnoreCase ) ;
@@ -218,7 +220,7 @@ public async Task<IEnumerable<Type>> GetExtensionsStartupTypesAsync()
218
220
}
219
221
}
220
222
221
- ValidateExtensionRequirements ( startupTypes ) ;
223
+ ValidateExtensionRequirements ( startupTypes , extensionRequirements ) ;
222
224
223
225
return startupTypes ;
224
226
}
@@ -254,9 +256,10 @@ private ExtensionReference[] ParseExtensions(string metadataFilePath)
254
256
}
255
257
}
256
258
257
- private void ValidateBundleRequirements ( ExtensionBundleDetails bundleDetails )
259
+ private void ValidateBundleRequirements ( ExtensionBundleDetails bundleDetails , ExtensionRequirementsInfo requirementsInfo )
258
260
{
259
- if ( _extensionRequirements . BundleRequirementsByBundleId . TryGetValue ( bundleDetails . Id , out BundleRequirement requirement ) )
261
+ if ( requirementsInfo . BundleRequirementsByBundleId != null
262
+ && requirementsInfo . BundleRequirementsByBundleId . TryGetValue ( bundleDetails . Id , out BundleRequirement requirement ) )
260
263
{
261
264
var bundleVersion = new Version ( bundleDetails . Version ) ;
262
265
var minimumVersion = new Version ( requirement . MinimumVersion ) ;
@@ -269,8 +272,12 @@ private void ValidateBundleRequirements(ExtensionBundleDetails bundleDetails)
269
272
}
270
273
}
271
274
272
- private void ValidateExtensionRequirements ( List < Type > startupTypes )
275
+ private void ValidateExtensionRequirements ( List < Type > startupTypes , ExtensionRequirementsInfo requirementsInfo )
273
276
{
277
+ if ( requirementsInfo . ExtensionRequirementsByStartupType is null )
278
+ {
279
+ return ;
280
+ }
274
281
var errors = new List < string > ( ) ;
275
282
276
283
void CollectError ( Type extensionType , Version minimumVersion , ExtensionStartupTypeRequirement requirement )
@@ -282,7 +289,7 @@ void CollectError(Type extensionType, Version minimumVersion, ExtensionStartupTy
282
289
283
290
foreach ( var extensionType in startupTypes )
284
291
{
285
- if ( _extensionRequirements . ExtensionRequirementsByStartupType . TryGetValue ( extensionType . Name , out ExtensionStartupTypeRequirement requirement ) )
292
+ if ( requirementsInfo . ExtensionRequirementsByStartupType . TryGetValue ( extensionType . Name , out ExtensionStartupTypeRequirement requirement ) )
286
293
{
287
294
Version minimumAssemblyVersion = new Version ( requirement . MinimumAssemblyVersion ) ;
288
295
@@ -342,6 +349,14 @@ private bool IsDotnetIsolatedApp(IEnumerable<FunctionMetadata> functions, IEnvir
342
349
return workerRuntime ? . Equals ( RpcWorkerConstants . DotNetIsolatedLanguageWorkerName , StringComparison . OrdinalIgnoreCase ) ?? false ;
343
350
}
344
351
352
+ private ExtensionRequirementsInfo GetExtensionRequirementsInfo ( )
353
+ {
354
+ ExtensionRequirementsInfo requirementsInfo = _extensionRequirementOptions . Value . Bundles != null || _extensionRequirementOptions . Value . Extensions != null
355
+ ? new ExtensionRequirementsInfo ( _extensionRequirementOptions . Value . Bundles , _extensionRequirementOptions . Value . Extensions )
356
+ : DependencyHelper . GetExtensionRequirements ( ) ;
357
+ return requirementsInfo ;
358
+ }
359
+
345
360
private class TypeNameEqualityComparer : IEqualityComparer < Type >
346
361
{
347
362
public bool Equals ( Type x , Type y )
0 commit comments