317 lines
13 KiB
C#
317 lines
13 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.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
|
|||
|
}
|
|||
|
}
|