paybackman 3a9dd43380 Minor changes... About to port from other Repo
Port from New-CLI repo with MVS working.

Changed naming from Openstack to OpenStack across the board to match API..

Trying to comit

Change-Id: I575d847e38c903e1ae308b55d0f0768bd33fa7e1
2014-05-08 09:51:36 -05:00

307 lines
14 KiB
C#

/* ============================================================================
Copyright 2014 Hewlett Packard
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
============================================================================ */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Collections;
using System.IO;
using System.Xml.XPath;
namespace OpenStack.Client.Powershell.Utility
{
public class ConfigurationManager
{
private bool _isLoaded = false;
private XDocument _document = new XDocument();
public XDocument Document
{
get { return _document; }
set { _document = value; }
}
public bool IsLoaded
{
get { return _isLoaded; }
set { _isLoaded = value; }
}
//====================================================================================
/// <summary>
///
/// </summary>
//====================================================================================
public ConfigurationManager()
{ }
//====================================================================================
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
//=========================================================================================
private XElement CreateAddElement(CredentialElement credentialElement)
{
XElement element = new XElement("add");
element.SetAttributeValue("key", credentialElement.Key);
element.SetAttributeValue("value", credentialElement.Value);
element.SetAttributeValue("displayName", credentialElement.DisplayName);
element.SetAttributeValue("isMandatory", credentialElement.IsMandatory);
return element;
}
//==================================================================================================
/// <summary>
///
/// </summary>
/// <param name="provider"></param>
/// <returns></returns>
//==================================================================================================
private ServiceProvider ResolveServiceProviderCredentials(ServiceProvider provider)
{
if (!this.IsLoaded) throw new InvalidOperationException("Instance must be Loaded first..");
CredentialElement configFilePathCredentialElement = provider.CredentialElements.Where(ce => ce.Key == "ConfigFilePath").SingleOrDefault();
if (configFilePathCredentialElement != null)
{
// Need to get credentials from the linked in Config File..
ConfigurationManager manager = new ConfigurationManager();
manager.Load(configFilePathCredentialElement.Value);
provider.CredentialElements.Remove(provider.CredentialElements.Where(ce => ce.Key == "ConfigFilePath").Single());
return manager.GetServiceProvider(provider.Name);
}
else
{
return provider;
}
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <param name="moduleName"></param>
//=========================================================================================
public void SetDefaultServiceProvider(string providerName)
{
if (!this.IsLoaded) throw new InvalidOperationException("Instance must be Loaded first..");
XElement defaultProvider = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("isDefault").Value == "true").Single();
defaultProvider.Attribute("isDefault").SetValue("false");
XElement serviceProviderNode = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == providerName).Single();
serviceProviderNode.Attribute("isDefault").SetValue("true");
this.Document.Save(this.GetFullConfigPath());
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <returns></returns>
//=========================================================================================
public ServiceProvider GetDefaultServiceProvider()
{
if (!this.IsLoaded) throw new InvalidOperationException("Instance must be Loaded first..");
XElement serviceProviderNode = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("isDefault").Value == "true").Single();
return this.GetServiceProvider(serviceProviderNode.Attribute("name").Value);
}
//=========================================================================================
/// <summary>
///
/// </summary>
//=========================================================================================
public void Load()
{
_document = new XDocument(); ;
_document = XDocument.Load(this.GetFullConfigPath());
_isLoaded = true;
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <param name="configFilePath"></param>
//=========================================================================================
public void Load(string configFilePath)
{
_document = new XDocument();
_document = XDocument.Load(configFilePath);
_isLoaded = true;
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <returns></returns>
//=========================================================================================
private string GetFullConfigPath()
{
if (File.Exists("OpenStack.config"))
{
return this.GetType().Assembly.Location;
}
else if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"OS\OpenStack.config"))
{
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"OS\OpenStack.config";
}
else
{
throw new InvalidOperationException("Unable to locate OpenStack.config file.");
}
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
//=========================================================================================
public ServiceProvider GetServiceProvider(string name)
{
if (!this.IsLoaded) throw new InvalidOperationException("Instance must be Loaded first..");
XElement serviceProviderNode = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == name).Single();
var provider = new ServiceProvider();
provider.Name = serviceProviderNode.Attribute("name").Value;
provider.IsDefault = Convert.ToBoolean(serviceProviderNode.Attribute("isDefault").Value);
// The ServiceProvider in the Primary config file is pointing to a Vender specific config so reolve that first..
foreach (XElement xElement in serviceProviderNode.Elements())
{
CredentialElement element = new CredentialElement();
element.Key = xElement.Attribute("key").Value;
element.Value = xElement.Attribute("value").Value;
if (xElement.Attribute("key").Value == "AuthenticationServiceURI")
provider.AuthenticationServiceURI = xElement.Attribute("value").Value;
if (xElement.Attribute("key").Value == "isDefault")
provider.IsDefault = Convert.ToBoolean(xElement.Attribute("value").Value);
try
{
element.IsMandatory = Convert.ToBoolean(xElement.Attribute("isMandatory").Value);
element.DisplayName = xElement.Attribute("displayName").Value;
//element.HelpText = xElement.Attribute("helpText").Value;
}
catch (Exception) { }
if (element.Key == "ConfigFilePath")
{
provider.CredentialElements.Add(element);
ServiceProvider resolvedProvider = this.ResolveServiceProviderCredentials(provider);
resolvedProvider.ConfigFilePath = element.Value;
return resolvedProvider;
}
else
provider.CredentialElements.Add(element);
}
return provider;
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <returns></returns>
//=========================================================================================
public IEnumerable<ServiceProvider> GetServiceProviders()
{
List<ServiceProvider> serviceProviders = new List<ServiceProvider>();
foreach (XElement element in this.Document.Descendants("ServiceProvider"))
{
ServiceProvider newProvider = this.GetServiceProvider(element.Attribute("name").Value);
newProvider.IsDefault = Convert.ToBoolean(element.Attribute("isDefault").Value);
serviceProviders.Add(newProvider);
}
return serviceProviders;
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <param name="providerName"></param>
//=========================================================================================
public void RemoveInitialServiceProvider(ref XDocument _document)
{
try
{
XElement oldServiceProvider = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == String.Empty).Single();
if (oldServiceProvider != null)
oldServiceProvider.Remove();
}
catch (InvalidOperationException ex) { }
}
//=========================================================================================
/// <summary>
///
/// </summary>
/// <param name="doc"></param>
/// <param name="isDefault"></param>
//=========================================================================================
private void RemoveDefaultServiceProvider(ref XDocument doc)
{
try
{
XElement serviceProviderNode = doc.Descendants("ServiceProvider").Where(sp => sp.Attribute("isDefault").Value == "True").Single();
serviceProviderNode.Attribute("isDefault").SetValue("false");
}
catch (Exception) { }
}
//=========================================================================================
/// <summary>
/// Flush and fill style..
/// </summary>
//=========================================================================================
public void WriteServiceProvider(ServiceProvider serviceProvider, bool removeInitialServiceProvider = false)
{
IEnumerable<XElement> serviceProviderNodes = this.Document.Descendants("ServiceProvider");
XElement spElement = new XElement("ServiceProvider",
new XAttribute("name", serviceProvider.Name),
new XAttribute("isDefault", serviceProvider.IsDefault));
// Get rid of the old ServiceProvider first ...
try
{
XElement oldServiceProvider = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == serviceProvider.Name).Single();
if (oldServiceProvider != null)
oldServiceProvider.Remove();
}
catch (InvalidOperationException ex) { }
// If this new Provider is set = default, remove the default flag from the previous one..
if (serviceProvider.IsDefault) {
RemoveDefaultServiceProvider(ref _document);
}
// Create CredentialElement instances for all Key\Value (Add elements)..
foreach (CredentialElement element in serviceProvider.CredentialElements) {
spElement.Add(this.CreateAddElement(element));
}
if (removeInitialServiceProvider == true)
this.RemoveInitialServiceProvider(ref _document);
this.Document.XPathSelectElement("configuration/appSettings/IdentityServices").Add(spElement);
this.Document.Save(this.GetFullConfigPath());
}
}
}