317 lines
13 KiB
C#
Raw Normal View History

//* ============================================================================
//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.Management.Automation;
using OpenStack.Client.Powershell.Utility;
using System.Linq;
using OpenStack.Identity;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using OpenStack.Client.Powershell.Providers.Storage;
using OpenStack.Storage;
using System.Threading.Tasks;
using System;
namespace OpenStack.Client.Powershell.Cmdlets.Common
{
[Cmdlet(VerbsCommon.Set, "SP", SupportsShouldProcess = true)]
public class SetServiceProviderCmdlet : BasePSCmdlet
{
private string _name;
private SwitchParameter _setDefault = false;
#region Properties
//=========================================================================================
/// <summary>
///
/// </summary>
//=========================================================================================
[Parameter(ParameterSetName = "SetSP", Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "Help Text")]
[Alias("d")]
[ValidateNotNullOrEmpty]
public SwitchParameter SetDefault
{
get { return _setDefault; }
set { _setDefault = value; }
}
//=========================================================================================
/// <summary>
///
/// </summary>
//=========================================================================================
[Parameter(Position = 0, ParameterSetName = "SetSP", Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
[Alias("n")]
public string Name
{
get { return _name; }
set { _name = value; }
}
#endregion
#region Methods
//=========================================================================================
/// <summary>
///
/// </summary>
//=========================================================================================
protected override void ProcessRecord()
{
ConfigurationManager manager = new ConfigurationManager();
manager.Load();
ServiceProvider provider = manager.GetServiceProvider(this.Name);
provider.IsDefault = this.SetDefault;
this.WriteObject("");
this.WriteObject(" - Connecting to OpenStack Provider " + this.Name);
this.InitialzeServiceProvider(provider);
}
//==================================================================================================
/// <summary>
///
/// </summary>
/// <returns></returns>
//==================================================================================================
private bool DoesRequireCredentials()
{
return true;
}
//==================================================================================================
/// <summary>
///
/// </summary>
//==================================================================================================
private void InitialzeServiceProvider(ServiceProvider provider)
{
if (this.SetDefault)
{
ConfigurationManager configManager = new ConfigurationManager();
configManager.Load();
configManager.SetDefaultServiceProvider(provider.Name);
}
this.WriteObject(" - Loading Service Provider extensions ");
ExtensionManager manager = new ExtensionManager(this.SessionState, this.Context);
manager.LoadExtension(provider);
this.ShowAccountState();
}
//=======================================================================================================
/// <summary>
///
/// </summary>
//=======================================================================================================
private void ShowAccountState()
{
// Show the User the new ServiceCatalog that we just received..
this.WriteObject(" - Success!");
this.WriteObject("");
this.WriteServices();
// If ObjectStorage is among those new Services, show the new Container set bound to those credentials..
if (this.Context.ServiceCatalog.Exists("Object Storage"))
{
this.WriteContainers();
}
}
//=======================================================================================================
/// <summary>
/// Removes all currently registered drives..
/// </summary>
//=======================================================================================================
private void RemoveDrives()
{
// Remove the old Users drives first..
Collection<PSDriveInfo> deadDrives = this.SessionState.Drive.GetAllForProvider("Object Storage");
foreach (PSDriveInfo deadDrive in deadDrives)
{
this.SessionState.Drive.Remove(deadDrive.Name, true, "local");
}
}
//=======================================================================================================
/// <summary>
///
/// </summary>
//=======================================================================================================
protected void WriteServices()
{
WriteObject("");
Console.ForegroundColor = ConsoleColor.DarkGray;
WriteObject("=================================================================");
Console.ForegroundColor = ConsoleColor.Yellow;
WriteObject(" Binding to new Account. New service catalog is as follows.");
Console.ForegroundColor = ConsoleColor.DarkGray;
WriteObject("=================================================================");
Console.ForegroundColor = ConsoleColor.Green;
WriteObject(" ");
foreach (OpenStackServiceDefinition service in this.Context.ServiceCatalog)
{
WriteObject(service);
}
WriteObject("");
}
//=======================================================================================================
/// <summary>
///
/// </summary>
//=======================================================================================================
protected void WriteContainers()
{
List<string> invalidDriveNames = new List<string>();
OSDriveParameters parameters = new OSDriveParameters();
// Write out the commands header information first..
WriteObject("");
Console.ForegroundColor = ConsoleColor.DarkGray;
WriteObject("===================================================================");
Console.ForegroundColor = ConsoleColor.Yellow;
WriteObject(" Object Storage Service available. Remapping to the following drives.");
Console.ForegroundColor = ConsoleColor.DarkGray;
WriteObject("===================================================================");
Console.ForegroundColor = ConsoleColor.Green;
WriteObject(" ");
HPOSNavigationProvider provider = new HPOSNavigationProvider();
Collection<PSDriveInfo> drives = this.GetAvailableDrives(this.Context.Settings, this.SessionState.Provider.GetOne("Object Storage"));
if (drives != null)
{
this.RemoveDrives();
foreach (PSDriveInfo drive in drives)
{
if (drive.Name != string.Empty)
{
WriteObject(" Storage Container : [" + drive.Name + "] now available.");
}
try
{
this.SessionState.Drive.New(drive, "local");
}
catch (PSArgumentException ex)
{
if (drive.Name != string.Empty)
invalidDriveNames.Add(drive.Name);
}
catch (Exception) { }
}
WriteObject("");
}
else
{
// No storageContainers exist for the new credentials so make some up...
//PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.SessionState.Drive.Current.Provider, "/", "Root folder for your storageContainer", null);
//this.SessionState.Drive.New(new OSDriveInfo(driveInfo, parameters, this.Context), "local");
}
if (invalidDriveNames.Count > 0)
{
WriteObject("");
Console.ForegroundColor = ConsoleColor.DarkGray;
WriteObject("=================================================================");
Console.ForegroundColor = ConsoleColor.Red;
WriteObject(" Error : A subset of your Containers could not be bound to this");
WriteObject(" session due to naming conflicts with the naming standards required");
WriteObject(" for Powershell drives. These containers are listed below.");
Console.ForegroundColor = ConsoleColor.DarkGray;
WriteObject("=================================================================");
Console.ForegroundColor = ConsoleColor.Green;
WriteObject(" ");
foreach (string name in invalidDriveNames)
{
WriteObject(name);
WriteObject(" ");
}
WriteObject(" ");
}
}
//==================================================================================================
/// <summary>
///
/// </summary>
/// <returns></returns>
//==================================================================================================
private System.Collections.ObjectModel.Collection<PSDriveInfo> GetAvailableDrives(Settings settings, ProviderInfo providerInfo) //, string configFilePath)
{
IEnumerable<StorageContainer> storageContainers = null;
OSDriveParameters parameters = new OSDriveParameters();
if (this.Context.Settings != null)
{
parameters.Settings = this.Context.Settings;
}
else
{
parameters.Settings = settings;
}
try
{
Task <StorageAccount> getStorageAccountTask = this.CoreClient.CreateServiceClient<IStorageServiceClient>().GetStorageAccount();
getStorageAccountTask.Wait();
StorageAccount result = getStorageAccountTask.Result;
storageContainers = result.Containers;
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Collection<PSDriveInfo> drives = new Collection<PSDriveInfo>();
// For every storageContainer that the User has access to, create a Drive that he can mount within Powershell..
try
{
string publicStoreUrl = this.Context.ServiceCatalog.GetPublicEndpoint("Object Storage", "region-a.geo-1").ToString();
if (storageContainers.Count() > 0)
{
foreach (StorageContainer storageContainer in storageContainers)
{
PSDriveInfo driveInfo = new PSDriveInfo(storageContainer.Name, providerInfo, "/", "Root folder for your storageContainer", null);
OpenStackPSDriveInfo kvsDriveInfo = new OpenStackPSDriveInfo(driveInfo, parameters, this.Context, publicStoreUrl);
try
{
drives.Add(kvsDriveInfo);
}
catch (Exception) { }
}
}
else
{
PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.SessionState.Drive.Current.Provider, "/", "Root folder for your storageContainer", null);
return new Collection<PSDriveInfo>
{
new OpenStackPSDriveInfo(driveInfo, parameters, this.Context, publicStoreUrl)
};
}
}
catch (Exception ex)
{
int g = 7;
}
return drives;
}
#endregion
}
}