Reverted platform configuration override change.

This commit is contained in:
Daniel Stolt 2013-08-28 00:28:39 +02:00 committed by Sebastien Ros
parent 5bb2ff2f78
commit 9c61a70e41
5 changed files with 44 additions and 104 deletions

View File

@ -154,9 +154,6 @@
<Compile Include="Services\Logging\AzureDiagnosticsAppender.cs" />
<Compile Include="Services\MissingSettingsBanner.cs" />
</ItemGroup>
<ItemGroup>
<WCFMetadata Include="Service References\" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Orchard.Azure.Services.FileSystems;
using Orchard.Environment.Configuration;
using Orchard.FileSystems.Media;
@ -22,28 +21,36 @@ namespace Orchard.Azure.Services.Environment.Configuration {
/// </remarks>
public class AzureBlobShellSettingsManager : Component, IShellSettingsManager {
protected readonly IShellSettingsManagerEventHandler Events;
protected readonly AzureFileSystem FileSystem;
private readonly AzureFileSystem _fileSystem;
private readonly IShellSettingsManagerEventHandler _events;
public AzureBlobShellSettingsManager(IShellSettingsManagerEventHandler events, IMimeTypeProvider mimeTypeProvider) {
Events = events;
FileSystem = new AzureFileSystem(CloudConfigurationManager.GetSetting(Constants.ShellSettingsStorageConnectionStringSettingName), Constants.ShellSettingsContainerName, String.Empty, true, mimeTypeProvider);
if (RoleEnvironment.IsAvailable) {
RoleEnvironment.Changing += RoleEnvironment_Changing;
RoleEnvironment.Changed += RoleEnvironment_Changed;
}
public AzureBlobShellSettingsManager(IMimeTypeProvider mimeTypeProvider, IShellSettingsManagerEventHandler events) {
_fileSystem = new AzureFileSystem(CloudConfigurationManager.GetSetting(Constants.ShellSettingsStorageConnectionStringSettingName), Constants.ShellSettingsContainerName, String.Empty, true, mimeTypeProvider);
_events = events;
}
public virtual IEnumerable<ShellSettings> LoadSettings() {
var settings = LoadSettingsInternal().ToArray();
PlatformShellSettings.ApplyTo(settings); // Apply platform configuration overrides.
return settings;
Logger.Debug("Reading ShellSettings...");
var settingsList = LoadSettingsInternal().ToArray();
var tenantNamesQuery =
from settings in settingsList
select settings.Name;
Logger.Debug("Returning {0} ShellSettings objects for tenants {1}.", tenantNamesQuery.Count(), String.Join(", ", tenantNamesQuery));
return settingsList;
}
public virtual void SaveSettings(ShellSettings settings) {
if (settings == null)
throw new ArgumentNullException("settings");
if (String.IsNullOrEmpty(settings.Name))
throw new ArgumentException("The Name property of the supplied ShellSettings object is null or empty; the settings cannot be saved.", "settings");
Logger.Debug("Saving ShellSettings for tenant '{0}'...", settings.Name);
var content = ShellSettingsSerializer.ComposeSettings(settings);
var filePath = FileSystem.Combine(settings.Name, Constants.ShellSettingsFileName);
var file = FileSystem.FileExists(filePath) ? FileSystem.GetFile(filePath) : FileSystem.CreateFile(filePath);
var filePath = _fileSystem.Combine(settings.Name, Constants.ShellSettingsFileName);
var file = _fileSystem.FileExists(filePath) ? _fileSystem.GetFile(filePath) : _fileSystem.CreateFile(filePath);
using (var stream = file.OpenWrite()) {
using (var writer = new StreamWriter(stream)) {
@ -51,34 +58,13 @@ namespace Orchard.Azure.Services.Environment.Configuration {
}
}
Events.Saved(settings);
}
void RoleEnvironment_Changing(object sender, RoleEnvironmentChangingEventArgs e) {
// Indicate to the fabric controller that we can handle any changes.
e.Cancel = false;
}
private void RoleEnvironment_Changed(object sender, RoleEnvironmentChangedEventArgs e) {
Logger.Debug("Handling RoleEnvironmentChanged event.");
var configurationChangeQuery =
from c in e.Changes
where c is RoleEnvironmentConfigurationSettingChange
select c;
// If there's a configuration settings change, inform all Orchard tenants.
if (configurationChangeQuery.Any()) {
Logger.Information("Role configuration settings changed; refreshing Orchard shell settings.");
var settingsList = LoadSettings();
foreach (var settings in settingsList)
Events.Saved(settings);
}
Logger.Debug("ShellSettings saved successfully; flagging tenant '{0}' for restart.", settings.Name);
_events.Saved(settings);
}
private IEnumerable<ShellSettings> LoadSettingsInternal() {
foreach (var folder in FileSystem.ListFolders(null)) {
foreach (var file in FileSystem.ListFiles(folder.GetPath())) {
foreach (var folder in _fileSystem.ListFolders(null)) {
foreach (var file in _fileSystem.ListFiles(folder.GetPath())) {
if (!String.Equals(file.GetName(), Constants.ShellSettingsFileName))
continue;
using (var stream = file.OpenRead()) {

View File

@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.WindowsAzure;
namespace Orchard.Environment.Configuration {
/// <summary>
/// Provides logic to override individual shell settings with values read from platform configuration.
/// </summary>
/// <remarks>
/// This class is used by IShellSettingsManager implementations to apply overrides of individual
/// shell settings from corresponding values in platform configuration. For each setting found
/// in the shell settings, this class looks for a corresponding platform setting named
/// Orchard.TenantName.SettingName in platform configuration. Platform configuration refers to
/// anywhere the <see cref="Microsoft.WindowsAzure.CloudConfigurationManager"/> class looks.
/// </remarks>
public static class PlatformShellSettings {
private const string _prefix = "Orchard";
private const string _emptyValueString = "null";
/// <summary>
/// Applies platform configuration overrides to the specified ShellSettings objects.
/// </summary>
/// <param name="shellSettingsList">A list of ShellSettings objects to which platform configuration overrides will be applied.</param>
public static void ApplyTo(IEnumerable<ShellSettings> shellSettingsList) {
foreach (var settings in shellSettingsList) {
foreach (var key in settings.Keys.ToArray()) {
var cloudConfigurationKey = String.Format("{0}.{1}.{2}", _prefix, settings.Name, key);
var cloudConfigurationValue = ParseValue(CloudConfigurationManager.GetSetting(cloudConfigurationKey));
if (cloudConfigurationValue != null)
settings[key] = cloudConfigurationValue;
}
}
}
private static string ParseValue(string value) {
if (value == _emptyValueString || String.IsNullOrWhiteSpace(value))
return null;
return value;
}
}
}

View File

@ -3,42 +3,44 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using Orchard.FileSystems.AppData;
using Orchard.Localization;
using Orchard.Logging;
namespace Orchard.Environment.Configuration {
public class ShellSettingsManager : IShellSettingsManager {
public class ShellSettingsManager : Component, IShellSettingsManager {
private const string _settingsFileName = "Settings.txt";
private readonly IAppDataFolder _appDataFolder;
private readonly IShellSettingsManagerEventHandler _events;
public Localizer T {
get;
set;
}
public ShellSettingsManager(
IAppDataFolder appDataFolder,
IShellSettingsManagerEventHandler events) {
public ShellSettingsManager(IAppDataFolder appDataFolder, IShellSettingsManagerEventHandler events) {
_appDataFolder = appDataFolder;
_events = events;
T = NullLocalizer.Instance;
}
IEnumerable<ShellSettings> IShellSettingsManager.LoadSettings() {
var settings = LoadSettingsInternal().ToArray();
PlatformShellSettings.ApplyTo(settings); // Apply platform configuration overrides.
return settings;
Logger.Debug("Reading ShellSettings...");
var settingsList = LoadSettingsInternal().ToArray();
var tenantNamesQuery =
from settings in settingsList
select settings.Name;
Logger.Debug("Returning {0} ShellSettings objects for tenants {1}.", tenantNamesQuery.Count(), String.Join(", ", tenantNamesQuery));
return settingsList;
}
void IShellSettingsManager.SaveSettings(ShellSettings settings) {
if (settings == null)
throw new ArgumentNullException("settings");
if (String.IsNullOrEmpty(settings.Name))
throw new ArgumentException("The Name property of the supplied ShellSettings object is null or empty. The settings cannot be saved.", "settings");
throw new ArgumentException("The Name property of the supplied ShellSettings object is null or empty; the settings cannot be saved.", "settings");
Logger.Debug("Saving ShellSettings for tenant '{0}'...", settings.Name);
var filePath = Path.Combine(Path.Combine("Sites", settings.Name), _settingsFileName);
_appDataFolder.CreateFile(filePath, ShellSettingsSerializer.ComposeSettings(settings));
Logger.Debug("ShellSettings saved successfully; flagging tenant '{0}' for restart.", settings.Name);
_events.Saved(settings);
}

View File

@ -222,7 +222,6 @@
<Compile Include="Environment\AutofacUtil\ConfigurationSettingsReaderConstants.cs" />
<Compile Include="Environment\CollectionOrderModule.cs" />
<Compile Include="Caching\DefaultAsyncTokenProvider.cs" />
<Compile Include="Environment\Configuration\PlatformShellSettings.cs" />
<Compile Include="Environment\Configuration\ShellSettingsSerializer.cs" />
<Compile Include="Environment\Extensions\DefaultCriticalErrorProvider.cs" />
<Compile Include="Environment\Extensions\ExtensionMonitoringCoordinator.cs" />