Skip to content

Commit 69c5a6f

Browse files
committed
Added Settings Manager
1 parent 384b0af commit 69c5a6f

Some content is hidden

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

49 files changed

+355
-176
lines changed

src/WebJobs.Script.Host/Program.cs

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

44
using System;
5+
using Microsoft.Azure.WebJobs.Script.Config;
56

67
namespace Microsoft.Azure.WebJobs.Script.Host
78
{

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

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

44
using Autofac;
5+
using Microsoft.Azure.WebJobs.Script.Config;
56
using Microsoft.Azure.WebJobs.Script.WebHost.WebHooks;
67

78
namespace Microsoft.Azure.WebJobs.Script.WebHost
89
{
910
public static class AutofacBootstrap
1011
{
11-
internal static void Initialize(ContainerBuilder builder, WebHostSettings settings)
12+
internal static void Initialize(ScriptSettingsManager settingsManager, ContainerBuilder builder, WebHostSettings settings)
1213
{
14+
builder.RegisterType<ScriptSettingsManager>().SingleInstance();
15+
1316
// register the resolver so that it is disposed when the container
1417
// is disposed
15-
var webHostResolver = new WebHostResolver();
18+
var webHostResolver = new WebHostResolver(settingsManager);
1619
builder.RegisterInstance(webHostResolver);
1720

1821
// these services are externally owned by the WebHostResolver, and will be disposed

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

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,23 @@
88
using System.Web.Http;
99
using Autofac;
1010
using Autofac.Integration.WebApi;
11+
using Microsoft.Azure.WebJobs.Script.Config;
1112
using Microsoft.Azure.WebJobs.Script.WebHost.Controllers;
1213
using Microsoft.Azure.WebJobs.Script.WebHost.Handlers;
1314

1415
namespace Microsoft.Azure.WebJobs.Script.WebHost
1516
{
1617
public static class WebApiConfig
1718
{
19+
private static ScriptSettingsManager _settingsManager;
20+
1821
public static void Register(HttpConfiguration config)
1922
{
20-
Register(config, GetDefaultSettings());
23+
_settingsManager = ScriptSettingsManager.Instance;
24+
Register(config, _settingsManager, GetDefaultSettings());
2125
}
2226

23-
public static void Register(HttpConfiguration config, WebHostSettings settings = null, Action<ContainerBuilder, WebHostSettings> dependencyCallback = null)
27+
public static void Register(HttpConfiguration config, ScriptSettingsManager settingsManager, WebHostSettings settings = null, Action<ContainerBuilder, WebHostSettings> dependencyCallback = null)
2428
{
2529
if (config == null)
2630
{
@@ -31,6 +35,13 @@ public static void Register(HttpConfiguration config, WebHostSettings settings =
3135
throw new ArgumentNullException("settings");
3236
}
3337

38+
if (settingsManager == null)
39+
{
40+
throw new ArgumentNullException("settingsManager");
41+
}
42+
43+
_settingsManager = settingsManager;
44+
3445
// Delete hostingstart.html if any. Azure creates that in all sites by default
3546
string hostingStart = Path.Combine(settings.ScriptPath, "hostingstart.html");
3647
if (File.Exists(hostingStart))
@@ -43,7 +54,7 @@ public static void Register(HttpConfiguration config, WebHostSettings settings =
4354

4455
var builder = new ContainerBuilder();
4556
builder.RegisterApiControllers(typeof(FunctionsController).Assembly);
46-
AutofacBootstrap.Initialize(builder, settings);
57+
AutofacBootstrap.Initialize(_settingsManager, builder, settings);
4758

4859
// Invoke registration callback
4960
dependencyCallback?.Invoke(builder, settings);
@@ -88,7 +99,7 @@ public static void Register(HttpConfiguration config, WebHostSettings settings =
8899
private static void PrependFoldersToEnvironmentPath()
89100
{
90101
// Only do this when %HOME% is defined (normally on Azure)
91-
string home = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHomePath);
102+
string home = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteHomePath);
92103
if (!string.IsNullOrEmpty(home))
93104
{
94105
// Create the tools folder if it doesn't exist
@@ -98,15 +109,15 @@ private static void PrependFoldersToEnvironmentPath()
98109
var folders = new List<string>();
99110
folders.Add(Path.Combine(home, @"site\tools"));
100111

101-
string path = Environment.GetEnvironmentVariable("PATH");
112+
string path = _settingsManager.GetSetting("PATH");
102113
string additionalPaths = String.Join(";", folders);
103114

104115
// Make sure we haven't already added them. This can happen if the appdomain restart (since it's still same process)
105116
if (!path.Contains(additionalPaths))
106117
{
107118
path = additionalPaths + ";" + path;
108119

109-
Environment.SetEnvironmentVariable("PATH", path);
120+
_settingsManager.SetSetting("PATH", path);
110121
}
111122
}
112123
}
@@ -115,11 +126,11 @@ private static WebHostSettings GetDefaultSettings()
115126
{
116127
WebHostSettings settings = new WebHostSettings();
117128

118-
string home = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHomePath);
129+
string home = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteHomePath);
119130
bool isLocal = string.IsNullOrEmpty(home);
120131
if (isLocal)
121132
{
122-
settings.ScriptPath = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsScriptRoot);
133+
settings.ScriptPath = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebJobsScriptRoot);
123134
settings.LogPath = Path.Combine(Path.GetTempPath(), @"Functions");
124135
settings.SecretsPath = HttpContext.Current.Server.MapPath("~/App_Data/Secrets");
125136
}

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.IO;
66
using System.Linq;
77
using System.Reflection;
8+
using Microsoft.Azure.WebJobs.Script.Config;
89
using Microsoft.Azure.WebJobs.Script.WebHost.WebHooks;
910

1011
namespace Microsoft.Azure.WebJobs.Script.WebHost
@@ -23,6 +24,13 @@ public sealed class WebHostResolver : IDisposable
2324
private ISecretManager _activeSecretManager;
2425
private WebHookReceiverManager _activeReceiverManager;
2526

27+
private static ScriptSettingsManager _settingsManager;
28+
29+
public WebHostResolver(ScriptSettingsManager settingsManager)
30+
{
31+
_settingsManager = settingsManager;
32+
}
33+
2634
public ScriptHostConfiguration GetScriptHostConfiguration(WebHostSettings settings)
2735
{
2836
if (_activeScriptHostConfig != null)
@@ -99,10 +107,10 @@ private void EnsureInitialized(WebHostSettings settings)
99107
}
100108

101109
_activeScriptHostConfig = GetScriptHostConfiguration(settings.ScriptPath, settings.LogPath);
102-
_activeSecretManager = GetSecretManager(settings.SecretsPath);
110+
_activeSecretManager = GetSecretManager(_settingsManager, settings.SecretsPath);
103111
_activeReceiverManager = new WebHookReceiverManager(_activeSecretManager);
104-
_activeHostManager = new WebScriptHostManager(_activeScriptHostConfig, _activeSecretManager, settings);
105-
112+
_activeHostManager = new WebScriptHostManager(_activeScriptHostConfig, _activeSecretManager, _settingsManager, settings);
113+
106114
(_standbySecretManager as IDisposable)?.Dispose();
107115
_standbyHostManager?.Dispose();
108116
_standbyReceiverManager?.Dispose();
@@ -111,16 +119,17 @@ private void EnsureInitialized(WebHostSettings settings)
111119
_standbySecretManager = null;
112120
_standbyHostManager = null;
113121
_standbyReceiverManager = null;
122+
_settingsManager.Reset();
114123
}
115124
}
116125
else
117126
{
118127
if (_standbyHostManager == null)
119128
{
120129
_standbyScriptHostConfig = GetScriptHostConfiguration(settings.ScriptPath, settings.LogPath);
121-
_standbySecretManager = GetSecretManager(settings.SecretsPath);
130+
_standbySecretManager = GetSecretManager(_settingsManager, settings.SecretsPath);
122131
_standbyReceiverManager = new WebHookReceiverManager(_standbySecretManager);
123-
_standbyHostManager = new WebScriptHostManager(_standbyScriptHostConfig, _standbySecretManager, settings);
132+
_standbyHostManager = new WebScriptHostManager(_standbyScriptHostConfig, _standbySecretManager, _settingsManager, settings);
124133
}
125134
}
126135
}
@@ -140,7 +149,7 @@ private static void ReinitializeAppSettings()
140149

141150
private static ScriptHostConfiguration GetScriptHostConfiguration(string scriptPath, string logPath)
142151
{
143-
string home = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHomePath);
152+
string home = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteHomePath);
144153
if (!string.IsNullOrEmpty(home))
145154
{
146155
// Create the tools folder if it doesn't exist
@@ -165,7 +174,7 @@ private static ScriptHostConfiguration GetScriptHostConfiguration(string scriptP
165174
};
166175

167176
// If running on Azure Web App, derive the host ID from the site name
168-
string hostId = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteName);
177+
string hostId = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteName);
169178
if (!String.IsNullOrEmpty(hostId))
170179
{
171180
// Truncate to the max host name length if needed
@@ -184,7 +193,7 @@ private static ScriptHostConfiguration GetScriptHostConfiguration(string scriptP
184193
return scriptHostConfig;
185194
}
186195

187-
private static ISecretManager GetSecretManager(string secretsPath) => new SecretManager(secretsPath, true);
196+
private static ISecretManager GetSecretManager(ScriptSettingsManager settingsManager, string secretsPath) => new SecretManager(settingsManager, secretsPath);
188197

189198
public void Dispose()
190199
{

src/WebJobs.Script.WebHost/Diagnostics/MetricsEventManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Linq;
88
using System.Threading;
99
using System.Threading.Tasks;
10+
using Microsoft.Azure.WebJobs.Script.Config;
1011
using Microsoft.Azure.WebJobs.Script.Description;
1112
using Microsoft.Azure.WebJobs.Script.Diagnostics;
1213
using Microsoft.Azure.WebJobs.Script.WebHost.Models;
@@ -27,10 +28,10 @@ public class MetricsEventManager : IDisposable
2728
// Default time between flushes in seconds (every 30 seconds)
2829
private const int DefaultFlushIntervalMS = 30 * 1000;
2930

30-
public MetricsEventManager(IEventGenerator generator, int functionActivityFlushIntervalSeconds, int metricsFlushIntervalMS = DefaultFlushIntervalMS)
31+
public MetricsEventManager(ScriptSettingsManager settingsManager, IEventGenerator generator, int functionActivityFlushIntervalSeconds, int metricsFlushIntervalMS = DefaultFlushIntervalMS)
3132
{
3233
// we read these in the ctor (not static ctor) since it can change on the fly
33-
appName = GetNormalizedString(Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteName)) ?? string.Empty;
34+
appName = GetNormalizedString(settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteName)) ?? string.Empty;
3435
subscriptionId = Utility.GetSubscriptionId() ?? string.Empty;
3536

3637
_eventGenerator = generator;

src/WebJobs.Script.WebHost/Diagnostics/SystemTraceWriter.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,25 @@
44
using System;
55
using System.Diagnostics;
66
using Microsoft.Azure.WebJobs.Host;
7+
using Microsoft.Azure.WebJobs.Script.Config;
78

89
namespace Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics
910
{
1011
public class SystemTraceWriter : TraceWriter
1112
{
1213
private IEventGenerator _eventGenerator;
14+
private ScriptSettingsManager _settingsManager;
1315
private string _appName;
1416
private string _subscriptionId;
15-
16-
public SystemTraceWriter(TraceLevel level) : this(new EventGenerator(), level)
17+
18+
public SystemTraceWriter(TraceLevel level) : this(new EventGenerator(), ScriptSettingsManager.Instance, level)
1719
{
1820
}
1921

20-
public SystemTraceWriter(IEventGenerator eventGenerator, TraceLevel level) : base(level)
22+
public SystemTraceWriter(IEventGenerator eventGenerator, ScriptSettingsManager settingsManager, TraceLevel level) : base(level)
2123
{
22-
_appName = Environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteName);
24+
_settingsManager = settingsManager;
25+
_appName = _settingsManager.GetSetting(EnvironmentSettingNames.AzureWebsiteName);
2326
_subscriptionId = Utility.GetSubscriptionId();
2427
_eventGenerator = eventGenerator;
2528
}

src/WebJobs.Script.WebHost/Diagnostics/WebHostMetricsLogger.cs

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

44
using System;
5+
using Microsoft.Azure.WebJobs.Script.Config;
56
using Microsoft.Azure.WebJobs.Script.Diagnostics;
67

78
namespace Microsoft.Azure.WebJobs.Script.WebHost.Diagnostics
@@ -12,7 +13,7 @@ public class WebHostMetricsLogger : IMetricsLogger, IDisposable
1213
private bool disposed = false;
1314

1415
public WebHostMetricsLogger()
15-
: this(new EventGenerator(), 5)
16+
: this(ScriptSettingsManager.Instance, new EventGenerator(), 5)
1617
{
1718
}
1819

@@ -21,9 +22,9 @@ public WebHostMetricsLogger(MetricsEventManager eventManager)
2122
_metricsEventManager = eventManager;
2223
}
2324

24-
public WebHostMetricsLogger(IEventGenerator eventGenerator, int metricEventIntervalInSeconds)
25+
public WebHostMetricsLogger(ScriptSettingsManager settingsManager, IEventGenerator eventGenerator, int metricEventIntervalInSeconds)
2526
{
26-
_metricsEventManager = new MetricsEventManager(eventGenerator, metricEventIntervalInSeconds);
27+
_metricsEventManager = new MetricsEventManager(settingsManager, eventGenerator, metricEventIntervalInSeconds);
2728
}
2829

2930
public object BeginEvent(string eventName)

src/WebJobs.Script.WebHost/GlobalSuppressions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,7 @@
7373
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.SecretManager.#.ctor(System.String,Microsoft.Azure.WebJobs.Script.WebHost.IKeyValueConverterFactory,System.Boolean)")]
7474
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.SecretManager.#.ctor(System.String,Microsoft.Azure.WebJobs.Script.WebHost.IKeyValueConverterFactory,System.Boolean)")]
7575
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.Controllers.HomeController.#IsHomePageDisabled")]
76-
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.Controllers.HomeController.#Get()")]
76+
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.Controllers.HomeController.#Get()")]
77+
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.Models.ApiModelUtility.#.cctor()")]
78+
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.WebHostResolver.#GetSecretManager(Microsoft.Azure.WebJobs.Script.Settings.ScriptSettingsManager,System.String)")]
79+
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Scope = "member", Target = "Microsoft.Azure.WebJobs.Script.WebHost.WebHostResolver.#GetSecretManager(Microsoft.Azure.WebJobs.Script.Config.ScriptSettingsManager,System.String)")]

src/WebJobs.Script.WebHost/Security/DefaultKeyValueConverterFactory.cs

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

44
using System;
5-
using System.Collections.Generic;
65
using System.IO;
76
using System.Linq;
87
using System.Text;
@@ -16,9 +15,11 @@ public sealed class DefaultKeyValueConverterFactory : IKeyValueConverterFactory
1615
{
1716
private bool _encryptionSupported;
1817
private static readonly PlaintextKeyValueConverter PlaintextValueConverter = new PlaintextKeyValueConverter(FileAccess.ReadWrite);
18+
private static ScriptSettingsManager _settingsManager;
1919

20-
public DefaultKeyValueConverterFactory()
20+
public DefaultKeyValueConverterFactory(ScriptSettingsManager settingsManager)
2121
{
22+
_settingsManager = settingsManager;
2223
_encryptionSupported = IsEncryptionSupported();
2324
}
2425

@@ -32,7 +33,7 @@ private static bool IsEncryptionSupported()
3233
return FeatureFlags.IsEnabled("SecretEncryption");
3334
}
3435

35-
return Environment.GetEnvironmentVariable(AzureWebsiteLocalEncryptionKey) != null;
36+
return _settingsManager.GetSetting(AzureWebsiteLocalEncryptionKey) != null;
3637
}
3738

3839
public IKeyValueReader GetValueReader(Key key)

src/WebJobs.Script.WebHost/Security/SecretManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Linq;
1010
using System.Security.Cryptography;
1111
using Microsoft.Azure.WebJobs.Host;
12+
using Microsoft.Azure.WebJobs.Script.Config;
1213

1314
namespace Microsoft.Azure.WebJobs.Script.WebHost
1415
{
@@ -26,8 +27,8 @@ public SecretManager()
2627
{
2728
}
2829

29-
public SecretManager(string secretsPath, bool createHostSecretsIfMissing = false)
30-
: this(secretsPath, new DefaultKeyValueConverterFactory(), createHostSecretsIfMissing)
30+
public SecretManager(ScriptSettingsManager settingsManager, string secretsPath, bool createHostSecretsIfMissing = false)
31+
: this(secretsPath, new DefaultKeyValueConverterFactory(settingsManager), createHostSecretsIfMissing)
3132
{
3233
}
3334

0 commit comments

Comments
 (0)