Skip to content

Commit f462d89

Browse files
committed
Adding SyncTriggers support
1 parent 05929b9 commit f462d89

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2256
-70
lines changed

src/WebJobs.Script.WebHost/App_Start/AutofacBootstrap.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System.IO.Abstractions;
5+
using System.Net.Http;
56
using Autofac;
67
using Microsoft.Azure.WebJobs.Host;
78
using Microsoft.Azure.WebJobs.Script.Config;
89
using Microsoft.Azure.WebJobs.Script.Eventing;
10+
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
911
using Microsoft.Azure.WebJobs.Script.WebHost.WebHooks;
1012
using Microsoft.Extensions.Logging;
1113

@@ -31,6 +33,7 @@ internal static void Initialize(ScriptSettingsManager settingsManager, Container
3133
builder.Register<WebScriptHostManager>(ct => ct.Resolve<WebHostResolver>().GetWebScriptHostManager(settings)).ExternallyOwned();
3234
builder.Register<WebHookReceiverManager>(ct => ct.Resolve<WebHostResolver>().GetWebHookReceiverManager(settings)).ExternallyOwned();
3335
builder.Register<ILoggerFactory>(ct => ct.Resolve<WebHostResolver>().GetLoggerFactory(settings)).ExternallyOwned();
36+
builder.Register<IFunctionsSyncManager>(ct => ct.Resolve<WebHostResolver>().GetFunctionsSyncManager(settings)).ExternallyOwned();
3437
}
3538
}
3639
}

src/WebJobs.Script.WebHost/App_Start/WebHostResolver.cs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.Azure.WebJobs.Script.Diagnostics;
1313
using Microsoft.Azure.WebJobs.Script.Eventing;
1414
using Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics;
15+
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
1516
using Microsoft.Azure.WebJobs.Script.WebHost.Properties;
1617
using Microsoft.Azure.WebJobs.Script.WebHost.WebHooks;
1718
using Microsoft.Extensions.Logging;
@@ -55,18 +56,7 @@ public ILoggerFactory GetLoggerFactory(WebHostSettings settings)
5556
else
5657
{
5758
// if there is no active host, return the default logger factory
58-
if (_defaultLoggerFactory == null)
59-
{
60-
lock (_syncLock)
61-
{
62-
if (_defaultLoggerFactory == null)
63-
{
64-
_defaultLoggerFactory = CreateDefaultLoggerFactory(settings);
65-
}
66-
}
67-
}
68-
69-
return _defaultLoggerFactory;
59+
return GetDefaultLoggerFactory(settings);
7060
}
7161
}
7262

@@ -112,6 +102,11 @@ public ISecretManager GetSecretManager(WebHostSettings settings)
112102
return GetWebScriptHostManager(settings).SecretManager;
113103
}
114104

105+
public IFunctionsSyncManager GetFunctionsSyncManager(WebHostSettings settings)
106+
{
107+
return GetWebScriptHostManager(settings).FunctionsSyncManager;
108+
}
109+
115110
public WebScriptHostManager GetWebScriptHostManager(WebHostSettings settings)
116111
{
117112
return GetActiveInstance(settings, ref _activeHostManager, ref _standbyHostManager);
@@ -143,7 +138,8 @@ internal void EnsureInitialized(WebHostSettings settings)
143138
_specializationTimer = null;
144139

145140
_activeScriptHostConfig = CreateScriptHostConfiguration(settings);
146-
_activeHostManager = new WebScriptHostManager(_activeScriptHostConfig, _secretManagerFactory, _eventManager, _settingsManager, settings);
141+
var defaultLoggerFactory = GetDefaultLoggerFactory(settings);
142+
_activeHostManager = new WebScriptHostManager(_activeScriptHostConfig, _secretManagerFactory, _eventManager, _settingsManager, settings, defaultLoggerFactory);
147143
_activeReceiverManager = new WebHookReceiverManager(_activeHostManager.SecretManager);
148144
InitializeFileSystem(_settingsManager.FileSystemIsReadOnly);
149145

@@ -177,7 +173,8 @@ internal void EnsureInitialized(WebHostSettings settings)
177173
{
178174
var standbySettings = CreateStandbySettings(settings);
179175
_standbyScriptHostConfig = CreateScriptHostConfiguration(standbySettings, true);
180-
_standbyHostManager = new WebScriptHostManager(_standbyScriptHostConfig, _secretManagerFactory, _eventManager, _settingsManager, standbySettings);
176+
var defaultLoggerFactory = GetDefaultLoggerFactory(settings);
177+
_standbyHostManager = new WebScriptHostManager(_standbyScriptHostConfig, _secretManagerFactory, _eventManager, _settingsManager, standbySettings, defaultLoggerFactory);
181178
_standbyReceiverManager = new WebHookReceiverManager(_standbyHostManager.SecretManager);
182179

183180
InitializeFileSystem(_settingsManager.FileSystemIsReadOnly);
@@ -218,6 +215,7 @@ internal static ScriptHostConfiguration CreateScriptHostConfiguration(WebHostSet
218215
var scriptHostConfig = new ScriptHostConfiguration
219216
{
220217
RootScriptPath = settings.ScriptPath,
218+
TestDataPath = settings.TestDataPath,
221219
RootLogPath = settings.LogPath,
222220
FileLoggingMode = FileLoggingMode.DebugOnly,
223221
TraceWriter = settings.TraceWriter,
@@ -247,6 +245,22 @@ private TraceWriter CreateDefaultTraceWriter(WebHostSettings settings)
247245
return systemTraceWriter;
248246
}
249247

248+
private ILoggerFactory GetDefaultLoggerFactory(WebHostSettings settings)
249+
{
250+
if (_defaultLoggerFactory == null)
251+
{
252+
lock (_syncLock)
253+
{
254+
if (_defaultLoggerFactory == null)
255+
{
256+
_defaultLoggerFactory = CreateDefaultLoggerFactory(settings);
257+
}
258+
}
259+
}
260+
261+
return _defaultLoggerFactory;
262+
}
263+
250264
private ILoggerFactory CreateDefaultLoggerFactory(WebHostSettings settings)
251265
{
252266
var loggerFactory = new LoggerFactory();

src/WebJobs.Script.WebHost/App_Start/WebHostSettings.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class WebHostSettings
2323

2424
public string SecretsPath { get; set; }
2525

26+
public string TestDataPath { get; set; }
27+
2628
/// <summary>
2729
/// Gets or sets a value indicating whether authentication/authorization
2830
/// should be disabled. Useful for local debugging or CLI scenarios.
@@ -46,12 +48,14 @@ internal static WebHostSettings CreateDefault(ScriptSettingsManager settingsMana
4648
settings.ScriptPath = Path.Combine(home, @"site\wwwroot");
4749
settings.LogPath = Path.Combine(home, @"LogFiles\Application\Functions");
4850
settings.SecretsPath = Path.Combine(home, @"data\Functions\secrets");
51+
settings.TestDataPath = Path.Combine(home, @"data\Functions\sampledata");
4952
}
5053
else
5154
{
5255
settings.ScriptPath = settingsManager.GetSetting(EnvironmentSettingNames.AzureWebJobsScriptRoot);
5356
settings.LogPath = Path.Combine(Path.GetTempPath(), @"Functions");
5457
settings.SecretsPath = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Secrets");
58+
settings.TestDataPath = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/SampleData");
5559
}
5660

5761
if (string.IsNullOrEmpty(settings.ScriptPath))

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
using Microsoft.Azure.WebJobs.Host;
1616
using Microsoft.Azure.WebJobs.Script.Description;
1717
using Microsoft.Azure.WebJobs.Script.WebHost.Filters;
18+
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
1819
using Microsoft.Azure.WebJobs.Script.WebHost.Models;
1920
using Microsoft.Extensions.Logging;
2021
using Newtonsoft.Json;
22+
using Newtonsoft.Json.Linq;
2123

2224
namespace Microsoft.Azure.WebJobs.Script.WebHost.Controllers
2325
{
@@ -33,13 +35,15 @@ public class AdminController : ApiController
3335
private readonly WebHostSettings _webHostSettings;
3436
private readonly TraceWriter _traceWriter;
3537
private readonly ILogger _logger;
38+
private readonly IFunctionsSyncManager _functionsSyncManager;
3639

37-
public AdminController(WebScriptHostManager scriptHostManager, WebHostSettings webHostSettings, TraceWriter traceWriter, ILoggerFactory loggerFactory)
40+
public AdminController(WebScriptHostManager scriptHostManager, WebHostSettings webHostSettings, TraceWriter traceWriter, ILoggerFactory loggerFactory, IFunctionsSyncManager functionsSyncManager)
3841
{
3942
_scriptHostManager = scriptHostManager;
4043
_webHostSettings = webHostSettings;
4144
_traceWriter = traceWriter.WithDefaults($"{ScriptConstants.TraceSourceHostAdmin}.Api");
4245
_logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryAdminController);
46+
_functionsSyncManager = functionsSyncManager;
4347
}
4448

4549
[HttpPost]
@@ -206,6 +210,22 @@ public HttpResponseMessage LaunchDebugger()
206210
return new HttpResponseMessage(HttpStatusCode.NotImplemented);
207211
}
208212

213+
[HttpPost]
214+
[Route("admin/host/synctriggers")]
215+
public async Task<HttpResponseMessage> SyncTriggers()
216+
{
217+
var result = await _functionsSyncManager.TrySyncTriggersAsync();
218+
219+
// Return a dummy body to make it valid in ARM template action evaluation
220+
var statusCode = result.Success ? HttpStatusCode.OK : HttpStatusCode.InternalServerError;
221+
var responseContent = new JObject
222+
{
223+
{ "status", result.Success ? "success" : result.Error }
224+
};
225+
226+
return Request.CreateResponse(statusCode, responseContent);
227+
}
228+
209229
[Route("admin/extensions/{name}/{*extra}")]
210230
[HttpGet]
211231
[HttpPost]

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.Azure.WebJobs.Extensions.Http;
1313
using Microsoft.Azure.WebJobs.Host;
1414
using Microsoft.Azure.WebJobs.Script.WebHost.Filters;
15+
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
1516
using Microsoft.Azure.WebJobs.Script.WebHost.Models;
1617
using Microsoft.Azure.WebJobs.Script.WebHost.Properties;
1718
using Microsoft.Extensions.Logging;
@@ -30,14 +31,16 @@ public class KeysController : ApiController
3031
private readonly ILogger _logger;
3132
private readonly WebHostSettings _settings;
3233
private readonly IFileSystem _fileSystem;
34+
private readonly IFunctionsSyncManager _functionsSyncManager;
3335

34-
public KeysController(WebHostSettings settings, ISecretManager secretManager, TraceWriter traceWriter, ILoggerFactory loggerFactory, IFileSystem fileSystem)
36+
public KeysController(WebHostSettings settings, ISecretManager secretManager, TraceWriter traceWriter, ILoggerFactory loggerFactory, IFileSystem fileSystem, IFunctionsSyncManager functionsSyncManager)
3537
{
3638
_settings = settings;
3739
_secretManager = secretManager;
3840
_traceWriter = traceWriter.WithDefaults($"{ScriptConstants.TraceSourceSecretManagement}.Api");
3941
_logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryKeysController);
4042
_fileSystem = fileSystem;
43+
_functionsSyncManager = functionsSyncManager;
4144
}
4245

4346
[HttpGet]
@@ -190,11 +193,13 @@ private async Task<IHttpActionResult> AddOrUpdateSecretAsync(string keyName, str
190193
case OperationResult.Created:
191194
{
192195
var keyResponse = ApiModelUtility.CreateApiModel(new { name = keyName, value = operationResult.Secret }, Request);
196+
await _functionsSyncManager.TrySyncTriggersAsync();
193197
return Created(ApiModelUtility.GetBaseUri(Request), keyResponse);
194198
}
195199
case OperationResult.Updated:
196200
{
197201
var keyResponse = ApiModelUtility.CreateApiModel(new { name = keyName, value = operationResult.Secret }, Request);
202+
await _functionsSyncManager.TrySyncTriggersAsync();
198203
return Ok(keyResponse);
199204
}
200205
case OperationResult.NotFound:
@@ -247,6 +252,8 @@ private async Task<IHttpActionResult> DeleteFunctionSecretAsync(string keyName,
247252
return NotFound();
248253
}
249254

255+
await _functionsSyncManager.TrySyncTriggersAsync();
256+
250257
string message = string.Format(Resources.TraceKeysApiSecretChange, keyName, keyScope ?? "host", "Deleted");
251258
_traceWriter.Info(message);
252259
_logger?.LogInformation(message);

0 commit comments

Comments
 (0)