Skip to content

Commit 38931a0

Browse files
authored
[pack] Fix keys APIs for functions without function.json (#7148)
1 parent 51e7a2e commit 38931a0

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,17 @@ public class KeysController : Controller
3131
private readonly IOptions<ScriptApplicationHostOptions> _applicationOptions;
3232
private readonly IFileSystem _fileSystem;
3333
private readonly IFunctionsSyncManager _functionsSyncManager;
34+
private readonly IFunctionMetadataManager _functionMetadataManager;
3435
private readonly IScriptHostManager _hostManager;
3536

36-
public KeysController(IOptions<ScriptApplicationHostOptions> applicationOptions, ISecretManagerProvider secretManagerProvider, ILoggerFactory loggerFactory, IFileSystem fileSystem, IFunctionsSyncManager functionsSyncManager, IScriptHostManager hostManager)
37+
public KeysController(IOptions<ScriptApplicationHostOptions> applicationOptions, ISecretManagerProvider secretManagerProvider, ILoggerFactory loggerFactory, IFileSystem fileSystem, IFunctionsSyncManager functionsSyncManager, IFunctionMetadataManager functionMetadataManager, IScriptHostManager hostManager)
3738
{
3839
_applicationOptions = applicationOptions;
3940
_secretManagerProvider = secretManagerProvider;
4041
_logger = loggerFactory.CreateLogger(ScriptConstants.LogCategoryKeysController);
4142
_fileSystem = fileSystem;
4243
_functionsSyncManager = functionsSyncManager;
44+
_functionMetadataManager = functionMetadataManager;
4345
_hostManager = hostManager;
4446
}
4547

@@ -285,9 +287,13 @@ internal bool IsBuiltInSystemKeyName(string keyName)
285287

286288
private bool IsFunction(string functionName)
287289
{
288-
string json = null;
289290
string functionPath = Path.Combine(_applicationOptions.Value.ScriptPath, functionName);
290-
return Utility.TryReadFunctionConfig(functionPath, out json, _fileSystem);
291+
if (Utility.TryReadFunctionConfig(functionPath, out _, _fileSystem))
292+
{
293+
return true;
294+
}
295+
296+
return _functionMetadataManager.TryGetFunctionMetadata(functionName, out _);
291297
}
292298
}
293299
}

test/WebJobs.Script.Tests/Controllers/Admin/KeysControllerTests.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,19 @@ public KeysControllerTests()
6363

6464
_functionsSyncManagerMock = new Mock<IFunctionsSyncManager>(MockBehavior.Strict);
6565
_functionsSyncManagerMock.Setup(p => p.TrySyncTriggersAsync(false)).ReturnsAsync(new SyncTriggersResult { Success = true });
66+
6667
var hostManagerMock = new Mock<IScriptHostManager>(MockBehavior.Strict);
6768
hostManagerMock.SetupGet(p => p.State).Returns(ScriptHostState.Running);
68-
_testController = new KeysController(new OptionsWrapper<ScriptApplicationHostOptions>(settings), new TestSecretManagerProvider(_secretsManagerMock.Object), new LoggerFactory(), fileSystem.Object, _functionsSyncManagerMock.Object, hostManagerMock.Object);
69+
70+
var metadataManagerMock = new Mock<IFunctionMetadataManager>(MockBehavior.Strict);
71+
FunctionMetadata metadata = null;
72+
metadataManagerMock.Setup(m => m.TryGetFunctionMetadata("FunctionWithoutFile", out metadata, false)).Returns(true);
73+
metadataManagerMock.Setup(m => m.TryGetFunctionMetadata("TestFunction1", out metadata, false)).Returns(true);
74+
// Function that has a physical file, but is loaded (safety net).
75+
metadataManagerMock.Setup(m => m.TryGetFunctionMetadata("TestFunction2", out metadata, false)).Returns(false);
76+
metadataManagerMock.Setup(m => m.TryGetFunctionMetadata("DNE", out metadata, false)).Returns(false);
77+
78+
_testController = new KeysController(new OptionsWrapper<ScriptApplicationHostOptions>(settings), new TestSecretManagerProvider(_secretsManagerMock.Object), new LoggerFactory(), fileSystem.Object, _functionsSyncManagerMock.Object, metadataManagerMock.Object, hostManagerMock.Object);
6979

7080
var keys = new Dictionary<string, string>
7181
{
@@ -79,6 +89,12 @@ public KeysControllerTests()
7989
};
8090
_secretsManagerMock.Setup(p => p.GetFunctionSecretsAsync("TestFunction2", false)).ReturnsAsync(keys);
8191

92+
keys = new Dictionary<string, string>
93+
{
94+
{ "key1", "secret1" }
95+
};
96+
_secretsManagerMock.Setup(p => p.GetFunctionSecretsAsync("FunctionWithoutFile", false)).ReturnsAsync(keys);
97+
8298
_secretsManagerMock.Setup(p => p.GetFunctionSecretsAsync("DNE", false)).ReturnsAsync((IDictionary<string, string>)null);
8399

84100
SetHttpContext();
@@ -95,6 +111,17 @@ public async Task GetKeys_ReturnsKeys()
95111
Assert.Equal("secret1", keys[0]["value"]);
96112
}
97113

114+
[Fact]
115+
public async Task GetKeys_NoFileFunction_ReturnsKeys()
116+
{
117+
ObjectResult result = (ObjectResult)await _testController.Get("FunctionWithoutFile");
118+
119+
var content = (JObject)result.Value;
120+
var keys = content["keys"];
121+
Assert.Equal("key1", keys[0]["name"]);
122+
Assert.Equal("secret1", keys[0]["value"]);
123+
}
124+
98125
[Fact]
99126
public async Task GetKeys_NotAFunction_ReturnsNotFound()
100127
{

0 commit comments

Comments
 (0)