This change addresses the Code Review from the previous commit. Changes include the following
Stronger Validation for Openstack.config. Better handling of detecting and raising NullReferenceExceptions Removal of dead code in a few places Added ability for each ServiceProvider to supply a ServiceMap which translates his name for a CoreService to something we can work with. Optimized code for dealing with Runspaces. This change implements 2 separate use cases for Multi-Vendor support. a. Initial Bootstrapping b. Switch Providers Change-Id: Ided462e5050214321e1ead50cf0498707d59128f Partially-implements: blueprint implement-multiple-vendor-support
This commit is contained in:
parent
3a9dd43380
commit
53dc8b3bf9
164
.gitignore
vendored
Normal file
164
.gitignore
vendored
Normal file
@ -0,0 +1,164 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
CLI.config
|
||||
*.cache
|
||||
FileListAbsolute.txt
|
||||
|
||||
|
||||
# Build results
|
||||
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
build/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
|
||||
!packages/*/build/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.log
|
||||
*.scc
|
||||
*.dll
|
||||
*.pdb
|
||||
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.Publish.xml
|
||||
|
||||
# NuGet Packages Directory
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||
packages/
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.[Pp]ublish.xml
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
App_Data/*.mdf
|
||||
App_Data/*.ldf
|
||||
|
||||
|
||||
#LightSwitch generated files
|
||||
GeneratedArtifacts/
|
||||
_Pvt_Extensions/
|
||||
ModelManifest.xml
|
||||
|
||||
# =========================
|
||||
# Windows detritus
|
||||
# =========================
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac desktop service store files
|
||||
.DS_Store
|
@ -8,7 +8,7 @@ ModuleVersion="1.0.0.0"
|
||||
PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FileList=''
|
||||
RequiredAssemblies = 'OpenStack.dll', 'OpenStack.Common.dll'
|
||||
RequiredAssemblies = 'OpenStack.dll'
|
||||
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\..\Documents\WindowsPowerShell\Modules\Openstack\HP\</OutputPath>
|
||||
<OutputPath>..\..\..\..\..\Documents\WindowsPowerShell\Modules\Openstack\HP\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@ -32,12 +32,28 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="OpenStack, Version=0.9.1.0, Culture=neutral, PublicKeyToken=baf191d8aca7391c, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\OpenStack-SDK-DotNet.0.9.1.0\lib\net40\OpenStack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<Private>True</Private>
|
||||
<HintPath>..\packages\System.Management.Automation.6.1.7601.17515\lib\net45\System.Management.Automation.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Primitives">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Primitives.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
@ -50,16 +66,13 @@
|
||||
<Compile Include="Utility\HPRegistrationManager.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="Deployment\HP.psd1">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\openstack-sdk-dotnet\Openstack\Openstack\Openstack.csproj">
|
||||
<Project>{b2c92371-b62b-45a2-adeb-edebefa3a75c}</Project>
|
||||
<Name>Openstack</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Openstack.Client.Powershell\Openstack.Client.Powershell.csproj">
|
||||
<Project>{32bac168-2ec8-4074-9e6d-8c13460dcfad}</Project>
|
||||
<Name>Openstack.Client.Powershell</Name>
|
||||
@ -70,6 +83,11 @@
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy .\Deployment\HP.psd1 C:\Users\tplummer\Documents\WindowsPowerShell\Modules\Openstack\HP</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
|
||||
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
|
||||
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
|
||||
<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
|
||||
</Target>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
|
@ -4,12 +4,13 @@ using System.Linq;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using OpenStack.Identity;
|
||||
|
||||
namespace HP.OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
|
||||
[ServiceProviderAttribute("HP")]
|
||||
public class HPRegistrationManager : RegistrationManager
|
||||
{
|
||||
public override RegistrationResponse Register(ServiceProvider serviceProvider)
|
||||
|
@ -1,21 +0,0 @@
|
||||
@{
|
||||
ModuleToProcess = 'HP.Openstack.Client.Powershell.dll'
|
||||
GUID="{847a28a4-6407-4aa6-8070-a4a51396db70}"
|
||||
Author="Travis Plummer"
|
||||
CompanyName="Hewlett-Packard Corporation"
|
||||
Copyright="© Hewlett-Packard. All rights reserved."
|
||||
ModuleVersion="1.0.0.0"
|
||||
PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FormatsToProcess=""
|
||||
FileList=''
|
||||
RequiredAssemblies = 'Openstack.dll', 'Openstack.Common.dll'
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
9
HP.Openstack.Client.Powershell/packages.config
Normal file
9
HP.Openstack.Client.Powershell/packages.config
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Bcl" version="1.1.9" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="6.0.2" targetFramework="net45" />
|
||||
<package id="OpenStack-SDK-DotNet" version="0.9.1.0" targetFramework="net45" />
|
||||
<package id="System.Management.Automation" version="6.1.7601.17515" targetFramework="net45" />
|
||||
</packages>
|
@ -12,8 +12,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D4A8C6
|
||||
.nuget\NuGet.targets = .nuget\NuGet.targets
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Openstack", "..\openstack-sdk-dotnet\Openstack\Openstack\Openstack.csproj", "{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HP.Openstack.Client.Powershell", "HP.Openstack.Client.Powershell\HP.Openstack.Client.Powershell.csproj", "{B6C5D486-BEDE-4E4F-8035-63B72513E4BD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rackspace.Openstack.Client.Powershell", "Rackspace.Client.Powershell\Rackspace.Openstack.Client.Powershell.csproj", "{8E2903DF-9FB6-48F8-85BF-FD2422BE38AF}"
|
||||
@ -46,21 +44,6 @@ Global
|
||||
{32BAC168-2EC8-4074-9E6D-8C13460DCFAD}.TransformTool Build|Mixed Platforms.ActiveCfg = TransformTool Build|Any CPU
|
||||
{32BAC168-2EC8-4074-9E6D-8C13460DCFAD}.TransformTool Build|Mixed Platforms.Build.0 = TransformTool Build|Any CPU
|
||||
{32BAC168-2EC8-4074-9E6D-8C13460DCFAD}.TransformTool Build|x86.ActiveCfg = TransformTool Build|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.TransformTool Build|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.TransformTool Build|Any CPU.Build.0 = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.TransformTool Build|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.TransformTool Build|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{B2C92371-B62B-45A2-ADEB-EDEBEFA3A75C}.TransformTool Build|x86.ActiveCfg = Release|Any CPU
|
||||
{B6C5D486-BEDE-4E4F-8035-63B72513E4BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6C5D486-BEDE-4E4F-8035-63B72513E4BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6C5D486-BEDE-4E4F-8035-63B72513E4BD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
|
@ -26,6 +26,8 @@ using OpenStack.Client.Powershell.Providers.Common;
|
||||
using System.Linq;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Management.Automation.Host;
|
||||
using System.Threading;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
@ -82,6 +84,19 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="service"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected T CreateServiceClient<T>(CoreServices service) where T : IOpenStackServiceClient
|
||||
{
|
||||
ServiceProvider provider = this.Context.CurrentServiceProvider;
|
||||
return this.CoreClient.CreateServiceClientByName<T>(provider.ServiceMaps.TranslateServiceName(service));
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
protected IOpenStackClient CoreClient
|
||||
{
|
||||
@ -95,6 +110,17 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override void StopProcessing()
|
||||
{
|
||||
CancellationTokenSource source = (CancellationTokenSource)this.SessionState.PSVariable.Get("CancellationTokenSource").Value;
|
||||
source.Cancel();
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@ -209,6 +235,7 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
//=========================================================================================
|
||||
|
||||
protected bool UserConfirmsDeleteAction(string entity)
|
||||
{
|
||||
Collection<ChoiceDescription> choices = new Collection<ChoiceDescription>();
|
||||
@ -301,10 +328,10 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
//=========================================================================================
|
||||
//protected StoragePath CreateStoragePath(string path)
|
||||
//{
|
||||
// return ((OSDriveInfo)this.Drive).CreateStoragePath(path);
|
||||
//}
|
||||
protected StoragePath CreateStoragePath(string path)
|
||||
{
|
||||
return ((ObjectStoragePSDriveInfo)this.Drive).CreateStoragePath(path);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -16,9 +16,6 @@ limitations under the License.
|
||||
using System;
|
||||
using System.Management.Automation;
|
||||
using System.Collections;
|
||||
using OpenStack.Client.Powershell.Cmdlets.Common;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
@ -61,9 +58,9 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
if (((string)setting.Key) == "SecretKey" || ((string)setting.Key)== "AccessKey")
|
||||
{
|
||||
DictionaryEntry entry = new DictionaryEntry();
|
||||
entry.Value = "***********";
|
||||
entry.Key = setting.Key;
|
||||
var entry = new DictionaryEntry();
|
||||
entry.Value = "***********";
|
||||
entry.Key = setting.Key;
|
||||
WriteObject(entry);
|
||||
}
|
||||
else
|
||||
|
@ -31,8 +31,6 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
//[RequiredServiceIdentifierAttribute(OpenStack.Objects.Domain.Admin.Services.ObjectStorage)]
|
||||
public class GetServiceProvidersCmdlet : BasePSCmdlet
|
||||
{
|
||||
#region Parameters
|
||||
#endregion
|
||||
#region Methods
|
||||
|
||||
//=========================================================================================
|
||||
@ -42,8 +40,12 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
//=========================================================================================
|
||||
protected override void ProcessRecord()
|
||||
{
|
||||
ConfigurationManager manager = new ConfigurationManager();
|
||||
var manager = new ConfigurationManager();
|
||||
manager.Load();
|
||||
|
||||
this.WriteObject("");
|
||||
this.WriteObject("Current Service Provider : " + this.Context.CurrentServiceProvider.Name);
|
||||
this.WriteObject("-----------------------------------------");
|
||||
this.WriteObject(manager.GetServiceProviders());
|
||||
}
|
||||
#endregion
|
||||
|
@ -17,7 +17,6 @@ using System;
|
||||
using System.Management.Automation;
|
||||
using OpenStack.Client.Powershell.Cmdlets.Common;
|
||||
using System.Reflection;
|
||||
using OpenStack.Client.Powershell.Providers.Common;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Cmdlets.GroupManagement
|
||||
{
|
||||
|
@ -14,13 +14,11 @@ 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.Text;
|
||||
using OpenStack.Client.Powershell.Cmdlets.Common;
|
||||
using System.Management.Automation;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using System.Linq;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
@ -34,13 +32,13 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
//=========================================================================================
|
||||
protected override void ProcessRecord()
|
||||
{
|
||||
string configFilePath = this.ConfigFilePath;
|
||||
XDocument doc = XDocument.Load(configFilePath);
|
||||
XElement defaultZoneNode = doc.XPathSelectElement("//AvailabilityZone[@isDefault='True']");
|
||||
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("Current Availability Zone is " + defaultZoneNode.Attribute("name").Value);
|
||||
Console.WriteLine("");
|
||||
AvailabilityZone zone = this.Context.CurrentServiceProvider.AvailabilityZones.Where(z => z.IsDefault == true).Single();
|
||||
|
||||
if (zone != null) {
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("Current Availability Zone is " + zone.Name);
|
||||
Console.WriteLine("");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,74 +21,68 @@ using OpenStack.Client.Powershell.Cmdlets.Common;
|
||||
using System.Management.Automation;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
[Cmdlet("Get", "Zones", SupportsShouldProcess = true)]
|
||||
public class GetZonesCmdlet : BasePSCmdlet
|
||||
{
|
||||
private SwitchParameter _verbose = true;
|
||||
//private SwitchParameter _verbose = true;
|
||||
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
[Parameter(Mandatory = false, ParameterSetName = "gc0", ValueFromPipelineByPropertyName = true, HelpMessage = "Prints extended information for each service.")]
|
||||
[Alias("v")]
|
||||
[ValidateNotNullOrEmpty]
|
||||
public SwitchParameter Verbose2
|
||||
{
|
||||
get { return _verbose; }
|
||||
set { _verbose = value; }
|
||||
}
|
||||
//[Parameter(Mandatory = false, ParameterSetName = "gz", ValueFromPipelineByPropertyName = true, HelpMessage = "Prints extended information for each service.")]
|
||||
//[Alias("v")]
|
||||
//[ValidateNotNullOrEmpty]
|
||||
//public SwitchParameter Verbose
|
||||
//{
|
||||
// get { return _verbose; }
|
||||
// set { _verbose = value; }
|
||||
//}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
private void ShowVerboseOutput(IEnumerable<XElement> zoneKeyNode)
|
||||
private void ShowVerboseOutput()
|
||||
{
|
||||
foreach (XElement element in zoneKeyNode)
|
||||
foreach (AvailabilityZone zone in this.Context.CurrentServiceProvider.AvailabilityZones)
|
||||
{
|
||||
this.WriteHeaderSection("Zone : " + element.Attribute("name").Value);
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), this.Context.Forecolor);
|
||||
Console.WriteLine("Zone Id : " + element.Attribute("id").Value);
|
||||
Console.WriteLine("Zone Name : " + element.Attribute("name").Value);
|
||||
Console.WriteLine("Shell Foreground Color : " + element.Attribute("shellForegroundColor").Value);
|
||||
this.WriteHeaderSection("Zone : " + zone.Name);
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), zone.ShellForegroundColor);
|
||||
Console.WriteLine("Zone Id : " + zone.Id);
|
||||
Console.WriteLine("Zone Name : " + zone.Name);
|
||||
Console.WriteLine("Shell Foreground Color : " + zone.ShellForegroundColor);
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("The following Services are available from this Availability Zone");
|
||||
Console.WriteLine("----------------------------------------------------------------");
|
||||
this.WriteObject(this.Context.ServiceCatalog.GetServicesInAvailabilityZone(element.Attribute("name").Value));
|
||||
|
||||
this.WriteObject(this.Context.ServiceCatalog.GetServicesInAvailabilityZone(zone.Name));
|
||||
Console.WriteLine("");
|
||||
}
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("");
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
private void ShowNonVerboseOutput(IEnumerable<XElement> zoneKeyNode)
|
||||
private void ShowNonVerboseOutput()
|
||||
{
|
||||
//Console.WriteLine("");
|
||||
//Console.WriteLine("Current Availability Zones include ");
|
||||
//Console.WriteLine("");
|
||||
//foreach (XElement element in zoneKeyNode)
|
||||
//{
|
||||
// Zone zone = new Zone();
|
||||
// zone.Name = element.Attribute("name").Value;
|
||||
// zone.ShellForegroundColor = element.Attribute("shellForegroundColor").Value;
|
||||
// zone.Id = element.Attribute("id").Value;
|
||||
|
||||
// if (element.Attribute("isDefault").Value == "True")
|
||||
// zone.IsDefault = true;
|
||||
// else
|
||||
// zone.IsDefault = false;
|
||||
|
||||
// this.WriteObject(zone);
|
||||
//}
|
||||
//Console.WriteLine("");
|
||||
foreach (AvailabilityZone zone in this.Context.CurrentServiceProvider.AvailabilityZones)
|
||||
{
|
||||
this.WriteHeaderSection("Zone : " + zone.Name);
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), zone.ShellForegroundColor);
|
||||
Console.WriteLine("Zone Id : " + zone.Id);
|
||||
Console.WriteLine("Zone Name : " + zone.Name);
|
||||
Console.WriteLine("Shell Foreground Color : " + zone.ShellForegroundColor);
|
||||
Console.WriteLine("");
|
||||
}
|
||||
Console.WriteLine("");
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
@ -97,18 +91,16 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
//=========================================================================================
|
||||
protected override void ProcessRecord()
|
||||
{
|
||||
string configFilePath = this.ConfigFilePath; ;
|
||||
XDocument doc = XDocument.Load(configFilePath);
|
||||
IEnumerable<XElement> zoneKeyNode = doc.Descendants("AvailabilityZone");
|
||||
this.ShowVerboseOutput();
|
||||
|
||||
if (_verbose)
|
||||
{
|
||||
this.ShowVerboseOutput(zoneKeyNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.ShowNonVerboseOutput(zoneKeyNode);
|
||||
}
|
||||
//if (_verbose)
|
||||
//{
|
||||
// this.ShowVerboseOutput();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// this.ShowNonVerboseOutput();
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,12 +26,12 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
public class NewServiceProvidersCmdlet : BasePSCmdlet
|
||||
{
|
||||
|
||||
private string _name = "HP21";
|
||||
private string _name = "";
|
||||
private bool _isDefault = false;
|
||||
private string _authenticationServiceURI = "https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens";
|
||||
private string _username = "travis.plummer@hp.com";
|
||||
private string _password = "NoRemorseGlock27";
|
||||
private string _defTenantId = "travis.plummer@hp.com";
|
||||
private string _authenticationServiceURI = "";
|
||||
private string _username = "";
|
||||
private string _password = "";
|
||||
private string _defTenantId = "";
|
||||
|
||||
#region Parameters
|
||||
|
||||
|
@ -13,31 +13,17 @@ 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.Management.Automation;
|
||||
using System.Xml.Linq;
|
||||
using System.Linq;
|
||||
using OpenStack;
|
||||
using System.Xml.XPath;
|
||||
using OpenStack.Client.Powershell.Providers.Common;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using OpenStack.Identity;
|
||||
using OpenStack.Client.Powershell.Providers.Storage;
|
||||
using OpenStack.Storage;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
[Cmdlet(VerbsCommon.Set, "Config", SupportsShouldProcess = true)]
|
||||
public class SetConfigCmdlet : BasePSCmdlet
|
||||
{
|
||||
private string _key;
|
||||
private string _value;
|
||||
private string _configFilePath = @"C:\Users\tplummer\Source\Repos\OpenStack-NewCLI\Rackspace.Client.Powershell\Deployment\Rackspace.config";
|
||||
//private string _configFilePath = @"C:\Users\tplummer\Source\Repos\OpenStack-NewCLI\Rackspace.Client.Powershell\Deployment\Rackspace.config";
|
||||
private string _configFilePath = null;
|
||||
private SwitchParameter _reset = false;
|
||||
private string _oldAccessKey;
|
||||
|
||||
#region Parameters
|
||||
//=========================================================================================
|
||||
@ -66,310 +52,29 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
get { return _configFilePath; }
|
||||
set { _configFilePath = value; }
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
//[Parameter(Position = 1, Mandatory = true, ParameterSetName = "sc", ValueFromPipelineByPropertyName = true, HelpMessage = "s")]
|
||||
//[Alias("k")]
|
||||
//[ValidateNotNullOrEmpty]
|
||||
//public string Key
|
||||
//{
|
||||
// get { return _key; }
|
||||
// set { _key = value; }
|
||||
//}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
//[Parameter(Position = 2, Mandatory = true, ParameterSetName = "sc", ValueFromPipelineByPropertyName = true, HelpMessage = "s")]
|
||||
//[Alias("v")]
|
||||
//[ValidateNotNullOrEmpty]
|
||||
//public string Value
|
||||
//{
|
||||
// get { return _value; }
|
||||
// set { _value = value; }
|
||||
//}
|
||||
#endregion
|
||||
//=======================================================================================================
|
||||
/// <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>
|
||||
//=================================================zx======================================================
|
||||
private void LoadConfigFile()
|
||||
{
|
||||
ConfigurationManager configManager = new ConfigurationManager();
|
||||
var configManager = new ConfigurationManager();
|
||||
configManager.Load(this.ConfigFilePathKey);
|
||||
ServiceProvider provider = configManager.GetDefaultServiceProvider();
|
||||
|
||||
ExtensionManager loader = new ExtensionManager(this.SessionState, this.Context);
|
||||
var loader = new ExtensionManager(this.SessionState, this.Context);
|
||||
|
||||
loader.LoadCore(provider);
|
||||
loader.LoadExtension(provider);
|
||||
|
||||
// Show the User the new ServiceCatalog that we just received..
|
||||
|
||||
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(_configFilePath);
|
||||
}
|
||||
var capabilities = new AccountCapabilities(this.SessionState, this.Context, this.CoreClient, this);
|
||||
capabilities.WriteServices();
|
||||
capabilities.WriteContainers();
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private System.Collections.ObjectModel.Collection<PSDriveInfo> GetAvailableDrives(Settings settings, ProviderInfo providerInfo) //, string configFilePath)
|
||||
{
|
||||
List<StorageContainer> storageContainers = null;
|
||||
OSDriveParameters parameters = new OSDriveParameters();
|
||||
|
||||
if (this.Context.Settings != null)
|
||||
{
|
||||
parameters.Settings = this.Context.Settings;
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Settings = settings;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Task<IEnumerable<StorageContainer>> getContainersTask = this.CoreClient.CreateServiceClient<IStorageServiceClient>().ListStorageContainers();
|
||||
getContainersTask.Wait();
|
||||
storageContainers = getContainersTask.Result.ToList<StorageContainer>();
|
||||
}
|
||||
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;
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <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 WriteContainers(string configFilePath)
|
||||
{
|
||||
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>
|
||||
/// <param name="address"></param>
|
||||
/// <returns></returns>
|
||||
//======================================================================================================================
|
||||
private string GetContainerName(string url)
|
||||
{
|
||||
string[] elements = url.Split('/');
|
||||
return elements[elements.Length - 1];
|
||||
}
|
||||
//======================================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <returns></returns>
|
||||
//======================================================================================================================
|
||||
private string GetDNSPortion(string url)
|
||||
{
|
||||
string[] elements = url.Split('/');
|
||||
return elements[2];
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=======================================================================================================
|
||||
//private void LoadConfigFile(string configFilePath)
|
||||
//{
|
||||
// this.Settings = Settings.LoadConfig(configFilePath);
|
||||
// this.Context.Settings = this.Settings;
|
||||
// this.Context = this.Context;
|
||||
|
||||
// // We need to ensure that the Users new identity doesn't alter the list bof available storageContainers. If so, just deal with it..
|
||||
|
||||
// if (_oldAccessKey != this.Settings.Username)
|
||||
// {
|
||||
// this.InitializeSession(this.Settings);
|
||||
|
||||
// // Show the User the new ServiceCatalog that we just received..
|
||||
|
||||
// this.WriteServices();
|
||||
|
||||
// // If ObjectStorage is among those new Services, show the new Container set bound to those credentials..
|
||||
|
||||
// if (this.Context.ServiceCatalog.DoesServiceExist("OS-Storage"))
|
||||
// {
|
||||
// this.WriteContainers(_configFilePath);
|
||||
// }
|
||||
|
||||
// if (this.Drive.Name == "OpenStack")
|
||||
// {
|
||||
// this.SessionState.InvokeCommand.InvokeScript(@"cd\");
|
||||
// ((CommonDriveInfo)this.Drive).CurrentContainer.Load();
|
||||
// }
|
||||
|
||||
// this.SessionState.PSVariable.Set(new PSVariable("ConfigPath", configFilePath));
|
||||
|
||||
// //Context tempContext = (Context)this.SessionState.PSVariable.GetValue("Context", null);
|
||||
// //this.UpdateCache(tempContext);
|
||||
// }
|
||||
//}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
@ -378,20 +83,6 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
protected override void ProcessRecord()
|
||||
{
|
||||
this.LoadConfigFile();
|
||||
|
||||
|
||||
//if (_reset)
|
||||
//{
|
||||
// _configFilePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"OS\CLI.config";
|
||||
// this.LoadConfigFile();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// if (_configFilePath != null)
|
||||
// this.LoadConfigFile(_configFilePath);
|
||||
// else
|
||||
// this.Settings[_key] = _value;
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,14 +12,6 @@
|
||||
//============================================================================ */
|
||||
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
|
||||
{
|
||||
@ -64,10 +56,10 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
//=========================================================================================
|
||||
protected override void ProcessRecord()
|
||||
{
|
||||
ConfigurationManager manager = new ConfigurationManager();
|
||||
var manager = new ConfigurationManager();
|
||||
manager.Load();
|
||||
|
||||
ServiceProvider provider = manager.GetServiceProvider(this.Name);
|
||||
var provider = manager.GetServiceProvider(this.Name);
|
||||
provider.IsDefault = this.SetDefault;
|
||||
|
||||
this.WriteObject("");
|
||||
@ -94,13 +86,13 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
if (this.SetDefault)
|
||||
{
|
||||
ConfigurationManager configManager = new ConfigurationManager();
|
||||
var configManager = new ConfigurationManager();
|
||||
configManager.Load();
|
||||
configManager.SetDefaultServiceProvider(provider.Name);
|
||||
}
|
||||
|
||||
this.WriteObject(" - Loading Service Provider extensions ");
|
||||
ExtensionManager manager = new ExtensionManager(this.SessionState, this.Context);
|
||||
var manager = new ExtensionManager(this.SessionState, this.Context);
|
||||
manager.LoadExtension(provider);
|
||||
this.ShowAccountState();
|
||||
}
|
||||
@ -115,201 +107,14 @@ namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
|
||||
this.WriteObject(" - Success!");
|
||||
this.WriteObject("");
|
||||
this.WriteServices();
|
||||
|
||||
// If ObjectStorage is among those new Services, show the new Container set bound to those credentials..
|
||||
// This is a hack for sure.. Need to move Zones into Vendor specific section.
|
||||
|
||||
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..
|
||||
this.Context.CurrentRegion = "region-a.geo-1";
|
||||
|
||||
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;
|
||||
var capabilities = new AccountCapabilities(this.SessionState, this.Context, this.CoreClient, this);
|
||||
capabilities.WriteServices();
|
||||
capabilities.WriteContainers();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
@ -14,16 +14,11 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
============================================================================ */
|
||||
using System;
|
||||
using Openstack.Client.Powershell.Cmdlets.Common;
|
||||
using System.Management.Automation;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using System.Collections.Generic;
|
||||
using Openstack.Objects.Domain;
|
||||
using Openstack.Client.Powershell.Providers.Storage;
|
||||
using System.Collections.ObjectModel;
|
||||
using Openstack.Common.Properties;
|
||||
using Openstack.Objects.DataAccess;
|
||||
using OpenStack.Client.Powershell.Cmdlets.Common;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
|
||||
namespace Openstack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
@ -32,6 +27,7 @@ namespace Openstack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
private string _Zone;
|
||||
|
||||
#region Properties
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
@ -45,124 +41,109 @@ namespace Openstack.Client.Powershell.Cmdlets.Common
|
||||
{
|
||||
get { return _Zone; }
|
||||
set { _Zone = value; }
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
#region Methods
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
protected override void ProcessRecord()
|
||||
{
|
||||
if (this.Drive.Provider.Name != "OS-Cloud" && this.Drive.Provider.Name != "OS-Storage")
|
||||
{
|
||||
ConsoleColor oldColor = Console.ForegroundColor;
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("Setting the Availability Zone requires you to be connected to the OpenStack: drive or a valid Storage Container. Please map to one of these drive types and reissue the command.");
|
||||
Console.WriteLine("");
|
||||
Console.ForegroundColor = oldColor;
|
||||
{
|
||||
if (this.Drive.Provider.Name != "OpenStack-Cloud" && this.Drive.Provider.Name != "Object Storage") {
|
||||
ShowError();
|
||||
}
|
||||
else
|
||||
{
|
||||
string configFilePath = this.ConfigFilePath;
|
||||
XDocument doc = XDocument.Load(configFilePath);
|
||||
XElement zoneKeyNode = doc.XPathSelectElement("//AvailabilityZone[@id='" + _Zone + "']");
|
||||
XElement defaultZoneNode = doc.XPathSelectElement("//AvailabilityZone[@isDefault='True']");
|
||||
// Mark down the new default Region and reload the config file..
|
||||
|
||||
defaultZoneNode.SetAttributeValue("isDefault", "False");
|
||||
zoneKeyNode.SetAttributeValue("isDefault", "True");
|
||||
doc.Save(configFilePath);
|
||||
this.Settings.Load(configFilePath);
|
||||
|
||||
this.Context.Forecolor = zoneKeyNode.Attribute("shellForegroundColor").Value;
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), zoneKeyNode.Attribute("shellForegroundColor").Value);
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("New Availability Zone " + zoneKeyNode.Attribute("name").Value + " selected.");
|
||||
Console.WriteLine("");
|
||||
|
||||
|
||||
if (this.Drive.Name == "OpenStack")
|
||||
this.SessionState.InvokeCommand.InvokeScript(@"cd\");
|
||||
else
|
||||
this.SessionState.InvokeCommand.InvokeScript("cd c:");
|
||||
XElement zoneKeyNode = SaveZone();
|
||||
this.Context.CurrentRegion = zoneKeyNode.Attribute("name").Value;
|
||||
this.Context.Settings.Load(this.ConfigFilePath);
|
||||
|
||||
ConfigurationManager manager = new ConfigurationManager();
|
||||
manager.Load();
|
||||
|
||||
this.SetUI(zoneKeyNode);
|
||||
this.ChanegDirectory();
|
||||
this.UpdateCache();
|
||||
this.WriteServices(zoneKeyNode.Attribute("name").Value);
|
||||
this.WriteContainers();
|
||||
|
||||
// Now show the User what he is getting for this action..
|
||||
|
||||
var abilities = new AccountCapabilities(this.SessionState, this.Context, this.CoreClient , this);
|
||||
abilities.WriteServices();
|
||||
abilities.WriteContainers();
|
||||
}
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=======================================================================================================
|
||||
private void ShowError()
|
||||
{
|
||||
ConsoleColor oldColor = Console.ForegroundColor;
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("Setting the Availability Zone requires you to be connected to the OpenStack: drive or a valid Storage Container. Please map to one of these drive types and reissue the command.");
|
||||
Console.WriteLine("");
|
||||
Console.ForegroundColor = oldColor;
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="zoneKeyNode"></param>
|
||||
//=======================================================================================================
|
||||
private void SetUI(XElement zoneKeyNode)
|
||||
{
|
||||
this.Context.Forecolor = zoneKeyNode.Attribute("shellForegroundColor").Value;
|
||||
Console.ForegroundColor =(ConsoleColor) Enum.Parse(typeof (ConsoleColor), zoneKeyNode.Attribute("shellForegroundColor").Value);
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("New Availability Zone " + zoneKeyNode.Attribute("name").Value + " selected.");
|
||||
Console.WriteLine("");
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=======================================================================================================
|
||||
private void ChanegDirectory()
|
||||
{
|
||||
if (this.Drive.Provider.Name == "Object Storage")
|
||||
this.SessionState.InvokeCommand.InvokeScript(@"cd\");
|
||||
else
|
||||
this.SessionState.InvokeCommand.InvokeScript("cd c:");
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//=======================================================================================================
|
||||
private XElement SaveZone()
|
||||
{
|
||||
string configFilePath = this.ConfigFilePath;
|
||||
XDocument doc = XDocument.Load(configFilePath);
|
||||
XElement zoneKeyNode = doc.XPathSelectElement("//AvailabilityZone[@id='" + _Zone + "']");
|
||||
XElement defaultZoneNode = doc.XPathSelectElement("//AvailabilityZone[@isDefault='True']");
|
||||
|
||||
defaultZoneNode.SetAttributeValue("isDefault", "False");
|
||||
zoneKeyNode.SetAttributeValue("isDefault", "True");
|
||||
doc.Save(configFilePath);
|
||||
return zoneKeyNode;
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=======================================================================================================
|
||||
private void WriteServices(string availabilityZone)
|
||||
{
|
||||
{
|
||||
this.WriteHeader("This Availability Zone has the following services available.");
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), this.Context.Forecolor);
|
||||
WriteObject(this.Context.ServiceCatalog.GetAZServices(availabilityZone));
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private System.Collections.ObjectModel.Collection<PSDriveInfo> GetAvailableDrives(Settings settings, ProviderInfo providerInfo)
|
||||
{
|
||||
List<StorageContainer> storageContainers = null;
|
||||
OSDriveParameters parameters = new OSDriveParameters();
|
||||
|
||||
if (this.Settings != null)
|
||||
{
|
||||
parameters.Settings = this.Settings;
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Settings = settings;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
IContainerRepository storageContainerRepository = this.RepositoryFactory.CreateContainerRepository();
|
||||
storageContainers = storageContainerRepository.GetStorageContainers();
|
||||
}
|
||||
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
|
||||
{
|
||||
if (storageContainers.Count > 0)
|
||||
{
|
||||
foreach (StorageContainer storageContainer in storageContainers)
|
||||
{
|
||||
PSDriveInfo driveInfo = new PSDriveInfo(storageContainer.Name, providerInfo, "/", "Root folder for your storageContainer", null);
|
||||
OSDriveInfo kvsDriveInfo = new OSDriveInfo(driveInfo, parameters, this.Context);
|
||||
drives.Add(kvsDriveInfo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.SessionState.Drive.Current.Provider, "/", "Root folder for your storageContainer", null);
|
||||
return new Collection<PSDriveInfo>
|
||||
{
|
||||
new OSDriveInfo(driveInfo, parameters, this.Context)
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return drives;
|
||||
WriteObject(this.Context.ServiceCatalog.GetServicesInAvailabilityZone(availabilityZone));
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
@ -183,80 +164,6 @@ namespace Openstack.Client.Powershell.Cmdlets.Common
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
WriteObject(" ");
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
private void WriteContainers()
|
||||
{
|
||||
List<string> invalidDriveNames = new List<string>();
|
||||
OSDriveParameters parameters = new OSDriveParameters();
|
||||
HPOSNavigationProvider provider = new HPOSNavigationProvider();
|
||||
Collection<PSDriveInfo> drives = this.GetAvailableDrives(this.Settings, this.SessionState.Provider.GetOne("OS-Storage"));
|
||||
|
||||
if (drives != null)
|
||||
{
|
||||
this.WriteHeader("Storage Containers available in this Region include");
|
||||
|
||||
// Remove the old Users drives first..
|
||||
|
||||
Collection<PSDriveInfo> deadDrives = this.SessionState.Drive.GetAllForProvider("OS-Storage");
|
||||
foreach (PSDriveInfo deadDrive in deadDrives)
|
||||
{
|
||||
this.SessionState.Drive.Remove(deadDrive.Name, true, "local");
|
||||
}
|
||||
|
||||
foreach (PSDriveInfo drive in drives)
|
||||
{
|
||||
if (drive.Name != string.Empty)
|
||||
{
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), this.Context.Forecolor);
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
//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(" ");
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -14,18 +14,19 @@
|
||||
//limitations under the License.
|
||||
//============================================================================ */
|
||||
//using System.Management.Automation;
|
||||
//using OpenStack.Objects;
|
||||
//using OpenStack.Objects.Domain;
|
||||
//using OpenStack;
|
||||
//using OpenStack.Client.Powershell.Providers.Storage;
|
||||
//using System;
|
||||
//using OpenStack.Objects.DataAccess.Storage;
|
||||
//using OpenStack.Client.Powershell.Providers.Common;
|
||||
//using System.IO;
|
||||
//using OpenStack.Client.Powershell.Utility;
|
||||
//using OpenStack.Storage;
|
||||
//using System.Net.Http;
|
||||
|
||||
//namespace OpenStack.Client.Powershell.Cmdlets.Common
|
||||
//{
|
||||
// [Cmdlet(VerbsCommon.Copy, "Item", SupportsShouldProcess = true)]
|
||||
// [RequiredServiceIdentifierAttribute(OpenStack.Objects.Domain.Admin.Services.ObjectStorage)]
|
||||
// //[RequiredServiceIdentifierAttribute(OpenStack.Objects.Domain.Admin.Services.ObjectStorage)]
|
||||
// public class CopyItemCmdlet : BasePSCmdlet
|
||||
// {
|
||||
// public const string cDelimiter = "/";
|
||||
@ -33,11 +34,11 @@
|
||||
// private string _sourcePath;
|
||||
// private string _targetPath;
|
||||
// private SwitchParameter _recursive;
|
||||
// private long _bytesCopied = 0;
|
||||
// private long _bytesCopied = 0;
|
||||
// private int _filesCopied = 0;
|
||||
// private long _totalBytesCopied = 0;
|
||||
// private int _totalFilesCopied = 0;
|
||||
|
||||
|
||||
// #region Ctors
|
||||
////=========================================================================================
|
||||
///// <summary>
|
||||
@ -106,11 +107,11 @@
|
||||
// {
|
||||
// get
|
||||
// {
|
||||
// if (((OSDriveInfo)this.Drive).SharePath == null)
|
||||
// return this.Context.ServiceCatalog.GetService("object-store").Url;
|
||||
// if (((ObjectStoragePSDriveInfo)this.Drive).SharePath == null)
|
||||
// return this.Context.ServiceCatalog.GetPublicEndpoint("Object Storage", String.Empty);
|
||||
// else
|
||||
// //return ((OSDriveInfo)this.Drive).SharePath;
|
||||
// return ((OSDriveInfo)this.Drive).SharePath.Replace(this.Drive.Name, string.Empty);
|
||||
// return ((ObjectStoragePSDriveInfo)this.Drive).SharePath.Replace(this.Drive.Name, string.Empty);
|
||||
// }
|
||||
// }
|
||||
// #endregion
|
||||
@ -191,24 +192,42 @@
|
||||
///// <param name="sender"></param>
|
||||
///// <param name="e"></param>
|
||||
////=========================================================================================
|
||||
// private void ListChanged(object sender, CopyOperationInfoEventArgs e)
|
||||
// //private void ListChanged(object sender, CopyOperationInfoEventArgs e)
|
||||
// //{
|
||||
// // //if (e.ExceptionMessage == null)
|
||||
// // //{
|
||||
// // // if (e.Filename != null || e.Filename != string.Empty)
|
||||
// // // {
|
||||
// // // Console.WriteLine("Copying file " + e.Filename);
|
||||
// // // _bytesCopied = _bytesCopied + e.BytesCopied;
|
||||
// // // ++_filesCopied;
|
||||
// // // _totalBytesCopied = _totalBytesCopied + e.BytesCopied;
|
||||
// // // ++_totalFilesCopied;
|
||||
// // // }
|
||||
// // //}
|
||||
// // //else
|
||||
// // //{
|
||||
// // // Console.ForegroundColor = ConsoleColor.Red;
|
||||
// // // Console.WriteLine("Error : " + e.ExceptionMessage);
|
||||
// // // Console.ForegroundColor = ConsoleColor.Green;
|
||||
// // //}
|
||||
// //}
|
||||
////================================================================================
|
||||
///// <summary>
|
||||
/////
|
||||
///// </summary>
|
||||
///// <param name="path"></param>
|
||||
///// <returns></returns>
|
||||
////================================================================================
|
||||
// private FileStream GetFileStream(StoragePath path)
|
||||
// {
|
||||
// if (e.ExceptionMessage == null)
|
||||
// if (!path.Volume.EndsWith(@"\") && !path.Path.StartsWith(@"\"))
|
||||
// {
|
||||
// if (e.Filename != null || e.Filename != string.Empty)
|
||||
// {
|
||||
// Console.WriteLine("Copying file " + e.Filename);
|
||||
// _bytesCopied = _bytesCopied + e.BytesCopied;
|
||||
// ++_filesCopied;
|
||||
// _totalBytesCopied = _totalBytesCopied + e.BytesCopied;
|
||||
// ++_totalFilesCopied;
|
||||
// }
|
||||
// return new FileStream(path.Volume + @"\" + path.Path, FileMode.Open);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Console.ForegroundColor = ConsoleColor.Red;
|
||||
// Console.WriteLine("Error : " + e.ExceptionMessage);
|
||||
// Console.ForegroundColor = ConsoleColor.Green;
|
||||
// return new FileStream(path.Volume + path.Path, FileMode.Open);
|
||||
// }
|
||||
// }
|
||||
////=================================================================================================
|
||||
@ -218,32 +237,44 @@
|
||||
////=================================================================================================
|
||||
// private void ProcessNonQueuedCopy()
|
||||
// {
|
||||
// StoragePath sourcePath = this.CreateStoragePath(this.SourcePath);
|
||||
// StoragePath targetPath = this.CreateValidTargetPath(sourcePath, this.TargetPath);
|
||||
// IStorageObjectRepository repository = this.RepositoryFactory.CreateStorageObjectRepository();
|
||||
// StoragePath sourcePath = this.CreateStoragePath(this.SourcePath);
|
||||
// StoragePath targetPath = this.CreateValidTargetPath(sourcePath, this.TargetPath);
|
||||
// IStorageServiceClient service = this.CoreClient.CreateServiceClient<IStorageServiceClient>();
|
||||
// string containerName = Path.GetFileNameWithoutExtension(this.SourcePath);
|
||||
|
||||
|
||||
// if (sourcePath.PathType == OpenStack.Common.PathType.Local && targetPath.PathType == OpenStack.Common.PathType.Remote)
|
||||
// {
|
||||
// long lastSegment = repository.GetLastSegmentId(targetPath);
|
||||
// if (lastSegment != 0)
|
||||
// {
|
||||
// Console.WriteLine("");
|
||||
// Console.WriteLine(" You've already uploaded a portion of this file.");
|
||||
// Console.WriteLine(" Would you like to resume your previous upload? [Y/N]");
|
||||
// ConsoleKeyInfo response = Console.ReadKey();
|
||||
// if (response.Key != ConsoleKey.Y)
|
||||
// {
|
||||
// repository.DeleteStorageObject(targetPath.AbsoluteURI + @"_temp\");
|
||||
// }
|
||||
// }
|
||||
// if (sourcePath.PathType == PathType.Local && targetPath.PathType == PathType.Remote) {
|
||||
// service.CreateStorageObject(containerName, targetPath.ResourcePath, null, this.GetFileStream(sourcePath));
|
||||
// }
|
||||
|
||||
// ((StorageObjectRepository)repository).Changed += new StorageObjectRepository.CopyOperationCompleteEventHandler(ListChanged);
|
||||
// Console.WriteLine("");
|
||||
// repository.Copy(sourcePath.AbsoluteURI, targetPath.AbsoluteURI, true);
|
||||
// this.PrintTotals();
|
||||
// ((StorageObjectRepository)repository).Changed -= new StorageObjectRepository.CopyOperationCompleteEventHandler(ListChanged);
|
||||
|
||||
|
||||
// //StoragePath sourcePath = this.CreateStoragePath(this.SourcePath);
|
||||
// //StoragePath targetPath = this.CreateValidTargetPath(sourcePath, this.TargetPath);
|
||||
// //IStorageObjectRepository repository = this.RepositoryFactory.CreateStorageObjectRepository();
|
||||
|
||||
|
||||
// //if (sourcePath.PathType == OpenStack.Common.PathType.Local && targetPath.PathType == OpenStack.Common.PathType.Remote)
|
||||
// //{
|
||||
// // long lastSegment = repository.GetLastSegmentId(targetPath);
|
||||
// // if (lastSegment != 0)
|
||||
// // {
|
||||
// // Console.WriteLine("");
|
||||
// // Console.WriteLine(" You've already uploaded a portion of this file.");
|
||||
// // Console.WriteLine(" Would you like to resume your previous upload? [Y/N]");
|
||||
// // ConsoleKeyInfo response = Console.ReadKey();
|
||||
// // if (response.Key != ConsoleKey.Y)
|
||||
// // {
|
||||
// // repository.DeleteStorageObject(targetPath.AbsoluteURI + @"_temp\");
|
||||
// // }
|
||||
// // }
|
||||
// //}
|
||||
|
||||
// //((StorageObjectRepository)repository).Changed += new StorageObjectRepository.CopyOperationCompleteEventHandler(ListChanged);
|
||||
// //Console.WriteLine("");
|
||||
// //repository.Copy(sourcePath.AbsoluteURI, targetPath.AbsoluteURI, true);
|
||||
// //this.PrintTotals();
|
||||
// //((StorageObjectRepository)repository).Changed -= new StorageObjectRepository.CopyOperationCompleteEventHandler(ListChanged);
|
||||
// }
|
||||
////=========================================================================================
|
||||
///// <summary>
|
||||
@ -252,7 +283,7 @@
|
||||
////=========================================================================================
|
||||
// protected override void ProcessRecord()
|
||||
// {
|
||||
// OSDriveInfo drive = this.SessionState.Drive.Current as OSDriveInfo;
|
||||
// ObjectStoragePSDriveInfo drive = this.SessionState.Drive.Current as ObjectStoragePSDriveInfo;
|
||||
// this.ProcessNonQueuedCopy();
|
||||
// }
|
||||
// #endregion
|
||||
|
@ -17,23 +17,13 @@ Echo ''
|
||||
$a.ForegroundColor = "gray"
|
||||
Echo '========================================================================================'
|
||||
$a.ForegroundColor = "yellow"
|
||||
Echo 'Welcome to the OpenStack Powershell Environment.'
|
||||
Echo 'Welcome to the OpenStack Powershell Environment.11'
|
||||
$a.ForegroundColor = "gray"
|
||||
Echo '========================================================================================'
|
||||
Echo ''
|
||||
$a.ForegroundColor = "green"
|
||||
echo ' ==> Registering Providers...'
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
# ACTION REQUIRED! ==> Substitute the example CD commands path below to match your setup. This should be the final output of the Solution as dictated by the
|
||||
# $(TargetDir) macro in the Post-Build Script.
|
||||
# -----------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#Save the current value in the $p variable.
|
||||
$p = [Environment]::GetEnvironmentVariable("PSModulePath")
|
||||
|
||||
@ -43,32 +33,9 @@ $p += ";C:\Users\tplummer\Documents\WindowsPowerShell\Modules\OpenStack\"
|
||||
#Add the paths in $p to the PSModulePath value.
|
||||
[Environment]::SetEnvironmentVariable("PSModulePath",$p)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#cd C:\Users\tplummer\Source\Repos\OpenStack-CLI\OpenStack.Client.Powershell\bin\Release
|
||||
#cd C:\Users\tplummer\Source\Repos\OpenStack-NewCLI\OpenStack.Client.Powershell\bin\Release
|
||||
#import-module .\CLIManifest.psd1 -DisableNameChecking
|
||||
|
||||
import-module OpenStack-Core -DisableNameChecking
|
||||
|
||||
import-module Openstack-Core -DisableNameChecking
|
||||
|
||||
cd Builds:
|
||||
cd 1-3-4-5
|
||||
|
||||
#set-sp Rackspace
|
||||
|
||||
|
||||
#cd OpenStack:
|
||||
#cd Networks
|
||||
#get-sp
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Let the User know what's going on..
|
||||
|
@ -9,7 +9,7 @@ PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FormatsToProcess="OpenStack.format.ps1xml"
|
||||
FileList='OpenStack.config'
|
||||
RequiredAssemblies = 'OpenStack.dll', 'OpenStack.Common.dll'
|
||||
RequiredAssemblies = 'OpenStack.dll'
|
||||
|
||||
}
|
||||
|
@ -1,22 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<Testing>
|
||||
<add key="TestServerName" value="TestServer" />
|
||||
<add key="TestNetworkName" value="TestNetwork" />
|
||||
<add key="TestPortName" value="TestPort" />
|
||||
<add key="TestRouterName" value="TestRouter" />
|
||||
<add key="TestSecurityGroupName" value="TestSecurityGroup" />
|
||||
<add key="TestSnapshotName" value="TestSnapshot" />
|
||||
<add key="TestStorageContainerName" value="TestContainer" />
|
||||
<add key="TestSubnetName" value="TestSubnet" />
|
||||
<add key="TestVolumeName" value="TestVolume" />
|
||||
<add key="TestFilePath" value="e:\Projects\Testing\Anothertest.txt" />
|
||||
<add key="TestStorageContainerSecondaryName" value="b10" />
|
||||
<add key="LocalTestDirectory" value="e:\Projects\Testing\" />
|
||||
<add key="TestImageId" value="5a1408cb-25f2-43a6-b1d9-931f5e47c871" />
|
||||
<add key="TestFlavorId" value="100" />
|
||||
</Testing>
|
||||
<StorageManagement>
|
||||
<add key="largeFileSize" value="314572800" />
|
||||
<add key="defSegmentNumber" value="16" />
|
||||
@ -27,29 +11,31 @@
|
||||
<add key="HttpTimeoutInterval" value="9200000" />
|
||||
<add key="PasteGetURIResultsToClipboard" value="true" />
|
||||
<add key="ReleaseNotesURI" value="https://region-a.geo-1.objects.hpcloudsvc.com/v1/AUTH_2485a207-71a4-4429-9e24-f7bf49e207fc/Builds/ReleaseManifest.xml" />
|
||||
<add key="NewReleaseFolder" value="e:\" />
|
||||
<SharedContainers></SharedContainers>
|
||||
<add key="NewReleaseFolder" value="e:\" />
|
||||
</StorageManagement>
|
||||
<IdentityServices>
|
||||
<ServiceProvider name="HP" isDefault = "true">
|
||||
<add key="AuthenticationServiceURI" value="" displayName="Authentication Service URI" helpText ="" isMandatory="True"/>
|
||||
<add key="Username" value="" displayName="User name" helpText ="" isMandatory="True"/>
|
||||
<add key="Password" value="" displayName="Password" helpText ="" isMandatory="True" />
|
||||
<add key="DefaultTenantId" value="" displayName="Default Tenant Id" helpText ="" isMandatory="True"/>
|
||||
</ServiceProvider>
|
||||
<ServiceProvider name="Rackspace" isDefault = "false">
|
||||
<add key="ConfigFilePath" value="C:\Users\tplummer\Source\Repos\OpenStack-NewCLI\Rackspace.Client.Powershell\Deployment\Rackspace.config" />
|
||||
</ServiceProvider>
|
||||
</IdentityServices>
|
||||
<ComputeServices>
|
||||
<add key="LogReadAttemptsMax" value="20" />
|
||||
<add key="LogReadAttemptIntervalInMilliSeconds" value="40000" />
|
||||
<add key="EnableCredentialTracking" value="true" />
|
||||
<add key="SSHClientPath" value="C:\Users\tplummer\Desktop\Utilities\Putty.exe" />
|
||||
</ComputeServices>
|
||||
<AvailabilityZones>
|
||||
<AvailabilityZone id="1" isDefault="True" name="region-a.geo-1" shellForegroundColor="Green" />
|
||||
<AvailabilityZone id="2" isDefault="False" name="region-b.geo-1" shellForegroundColor="Green" />
|
||||
</AvailabilityZones>
|
||||
<IdentityServices>
|
||||
<ServiceProvider name="" isDefault = "true">
|
||||
<add key="AuthenticationServiceURI" value="" displayName="Authentication Service URI" helpText ="" isMandatory="True"/>
|
||||
<add key="Username" value="" displayName="User name" helpText ="" isMandatory="True"/>
|
||||
<add key="Password" value="" displayName="Password" helpText ="" isMandatory="True" />
|
||||
<add key="DefaultTenantId" value="" displayName="Default Tenant Id" helpText ="" isMandatory="True"/>
|
||||
<AvailabilityZones>
|
||||
<AvailabilityZone id="1" isDefault="True" name="region-a.geo-1" shellForegroundColor="Green" />
|
||||
<AvailabilityZone id="2" isDefault="False" name="region-b.geo-1" shellForegroundColor="Green" />
|
||||
</AvailabilityZones>
|
||||
<ServiceMaps>
|
||||
<ServiceMap source="ObjectStorage" target="Object Storage"/>
|
||||
<ServiceMap source="ImageManagement" target="Image Management"/>
|
||||
<ServiceMap source="BlockStorage" target="Block Storage"/>
|
||||
<ServiceMap source="Compute" target="Compute"/>
|
||||
</ServiceMaps>
|
||||
</ServiceProvider>
|
||||
</IdentityServices>
|
||||
</appSettings>
|
||||
</configuration>
|
@ -21,7 +21,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\..\Documents\WindowsPowerShell\Modules\Openstack\Openstack-Core\</OutputPath>
|
||||
<OutputPath>..\..\..\..\..\Documents\WindowsPowerShell\Modules\Openstack\Openstack-Core\</OutputPath>
|
||||
<DefineConstants>DEBUG</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@ -64,7 +64,11 @@
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="OpenStack, Version=0.9.1.0, Culture=neutral, PublicKeyToken=baf191d8aca7391c, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\OpenStack-SDK-DotNet.0.9.1.0\lib\net40\OpenStack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
@ -75,7 +79,14 @@
|
||||
<Reference Include="System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
|
||||
<Reference Include="System.Net.Http.Primitives">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Primitives.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
<Reference Include="System.Security" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
@ -90,7 +101,6 @@
|
||||
<Reference Include="XamlBuildTask" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="BaseNavigationCmdletProvider.cs" />
|
||||
<Compile Include="Cmdlets\BasePSCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\BaseAuthenticationCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\BasePSCmdlet.cs" />
|
||||
@ -100,7 +110,13 @@
|
||||
<Compile Include="Cmdlets\Common\GetZoneCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\GetZonesCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\SetConfigCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\SetZoneCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\TokenTestCmdlet.cs" />
|
||||
<Compile Include="Providers\Common\BaseNavigationCmdletProvider.cs" />
|
||||
<Compile Include="Providers\Common\CommonDriveInfo.cs" />
|
||||
<Compile Include="Providers\Common\CommonDriveParameters.cs" />
|
||||
<Compile Include="Utility\AccountCapabilities.cs" />
|
||||
<Compile Include="Utility\AvailabilityZone.cs" />
|
||||
<Compile Include="Utility\CredentialElement.cs" />
|
||||
<Compile Include="Cmdlets\Common\GetServiceProvidersCmdlet.cs" />
|
||||
<Compile Include="Cmdlets\Common\NewServiceProviderCmdlet.cs" />
|
||||
@ -111,30 +127,36 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\StorageItemViewModel.cs" />
|
||||
<Compile Include="Utility\CredentialManager.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\HPOSDriveInfo.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\HPOSDriveParameters.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\HPOSNavigationProvider.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\ObjectStoragePSDriveInfo.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\ObjectStorageDriveParameters.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\ObjectStorageNavigationProvider.cs" />
|
||||
<Compile Include="Utility\Context.cs" />
|
||||
<Compile Include="Utility\Enums.cs" />
|
||||
<Compile Include="Utility\ExtensionManager.cs" />
|
||||
<Compile Include="Providers\ObjectStorage\ObjectStorageDriveConverter.cs" />
|
||||
<Compile Include="Utility\ExtensionMethods.cs" />
|
||||
<Compile Include="Utility\OpenstackCoreRegistrationManager.cs" />
|
||||
<Compile Include="Utility\RegistrationManager.cs" />
|
||||
<Compile Include="Utility\RegistrationResponse.cs" />
|
||||
<Compile Include="Utility\SecureStringHelper.cs" />
|
||||
<Compile Include="Utility\ServiceMap.cs" />
|
||||
<Compile Include="Utility\ServiceProvider.cs" />
|
||||
<Compile Include="Utility\ConfigurationManager.cs" />
|
||||
<Compile Include="Utility\ServiceProviderAttribute.cs" />
|
||||
<Compile Include="Utility\Settings.cs" />
|
||||
<Compile Include="Utility\StoragePath.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="app.config">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="Deployment\NavigationGraph.dgml" />
|
||||
<None Include="Deployment\Openstack.config">
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Deployment\DevProfile.ps1" />
|
||||
<None Include="Deployment\PostBuild.bat" />
|
||||
<None Include="Deployment\ScratchPad\app.config" />
|
||||
<None Include="Deployment\Openstack.config.example">
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
@ -148,12 +170,6 @@
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Deployment\PostBuild.example" />
|
||||
<None Include="Deployment\ScratchPad\PostBuild.targets">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="Deployment\ScratchPad\ProCLI.config">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
<Resource Include="Deployment\powershell.exe.config">
|
||||
<SubType>Designer</SubType>
|
||||
@ -171,7 +187,6 @@
|
||||
<Folder Include="Cmdlets\Security\" />
|
||||
<Folder Include="Migrations\" />
|
||||
<Folder Include="Providers\BlockStorage\" />
|
||||
<Folder Include="Providers\Common\" />
|
||||
<Folder Include="Providers\Compute\" />
|
||||
<Folder Include="Providers\Dbaas\" />
|
||||
<Folder Include="Providers\Networking\" />
|
||||
@ -181,13 +196,11 @@
|
||||
<Content Include="Deployment\Aliases.txt">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Deployment\ScratchPad\AnotherTest.txt">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Deployment\ApacheLicense.txt" />
|
||||
<Content Include="Deployment\CredentialList.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
<Content Include="Deployment\NavigationGraph.txt" />
|
||||
<Content Include="Deployment\Openstack.Client.Powershell.dll-Help.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
@ -202,7 +215,7 @@
|
||||
<Content Include="Deployment\ScratchPad\ServerData\Server1.xml" />
|
||||
<Content Include="Deployment\ScratchPad\ServerData\Servers.xml" />
|
||||
<Content Include="License.txt" />
|
||||
<None Include="Deployment\Openstack.psd1">
|
||||
<None Include="Deployment\Openstack-Core.psd1">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Deployment\ReleaseNotes.xml">
|
||||
@ -213,12 +226,6 @@
|
||||
<ItemGroup>
|
||||
<WCFMetadata Include="Service References\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\openstack-sdk-dotnet\Openstack\Openstack\Openstack.csproj">
|
||||
<Project>{b2c92371-b62b-45a2-adeb-edebefa3a75c}</Project>
|
||||
<Name>Openstack</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!--<PropertyGroup>
|
||||
<SlowCheetahTargets Condition=" '$(SlowCheetahTargets)'=='' ">$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\SlowCheetah.Transforms.targets</SlowCheetahTargets>
|
||||
@ -231,10 +238,36 @@
|
||||
Echo Executing Post-Build Scripts
|
||||
Echo =====================
|
||||
|
||||
md %25USERPROFILE%25\Documents\WindowsPowerShell
|
||||
md %25USERPROFILE%25\Documents\WindowsPowerShell\Modules
|
||||
md %25USERPROFILE%25\Documents\WindowsPowerShell\Modules\Openstack
|
||||
md %25USERPROFILE%25\Documents\WindowsPowerShell\Modules\Openstack\Openstack-Core
|
||||
md %25USERPROFILE%25\Documents\OS
|
||||
md $(ProjectDir)bin\debug
|
||||
|
||||
copy $(ProjectDir)\Deployment\*.* %25USERPROFILE%25\Documents\WindowsPowerShell\Modules\Openstack\Openstack-Core
|
||||
copy $(ProjectDir)\Deployment\DevProfile.ps1 %25USERPROFILE%25\Documents\WindowsPowerShell\Microsoft.Powershell_profile.ps1
|
||||
copy $(ProjectDir)\Deployment\Openstack.config %25USERPROFILE%25\Documents\OS\Openstack.config
|
||||
|
||||
|
||||
echo 'Proj Dir = ' + $(ProjectDir)
|
||||
echo 'userProfile = ' + %25USERPROFILE%25
|
||||
|
||||
|
||||
echo copy C:\Users\tplummer\Source\Repos\FixIt\openstack-cli-powershell\Openstack.Client.Powershell\Deployment\Openstack.config %25USERPROFILE%25\Documents\OS\Openstack.config
|
||||
|
||||
|
||||
Echo The statement below is causing symbol mismatches when attaching the debugger remotely. For now, you should point this projects output folder
|
||||
Echo to the correct runtime location. That is C:\Users\username\Documents\WindowsPowerShell\Modules\Openstack\Openstack-Core
|
||||
Echo ' copy $(ProjectDir)bin\debug\*.* %25USERPROFILE%25\Documents\WindowsPowershell\Modules\Openstack\openstack-core
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
copy C:\Users\tplummer\Source\Repos\openstack-cli-powershell\Openstack.Client.Powershell\Deployment\*.* C:\Users\tplummer\Documents\WindowsPowerShell\Modules\Openstack\Openstack-Core
|
||||
copy C:\Users\tplummer\Source\Repos\openstack-cli-powershell\Openstack.Client.Powershell\Deployment\DevProfile.ps1 C:\Users\tplummer\Documents\WindowsPowerShell\Microsoft.Powershell_profile.ps1
|
||||
copy C:\Users\tplummer\Source\Repos\openstack-cli-powershell\Openstack.Client.Powershell\Deployment\Openstack.config C:\Users\tplummer\Documents\OS\Openstack.config
|
||||
|
||||
|
||||
|
||||
@ -250,4 +283,9 @@ copy C:\Users\tplummer\Source\Repos\openstack-cli-powershell\Openstack.Client.Po
|
||||
<PreBuildEvent>
|
||||
</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
|
||||
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
|
||||
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
|
||||
<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
|
||||
</Target>
|
||||
</Project>
|
@ -1,4 +1,5 @@
|
||||
/* ============================================================================
|
||||
|
||||
/* ============================================================================
|
||||
Copyright 2014 Hewlett Packard
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -16,40 +17,30 @@ limitations under the License.
|
||||
using System;
|
||||
using System.Management.Automation;
|
||||
using System.Management.Automation.Provider;
|
||||
using Openstack.Objects.DataAccess;
|
||||
using Openstack.Common.Properties;
|
||||
using System.Xml.Serialization;
|
||||
using System.Xml;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Runtime.Serialization.Json;
|
||||
using Openstack.Client.Powershell.Providers.Storage;
|
||||
using Openstack.Objects.Utility;
|
||||
using Openstack.Objects.Domain.Admin;
|
||||
using Openstack.Objects.DataAccess.Security;
|
||||
using System.Reflection;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using System.Linq;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace Openstack.Client.Powershell.Providers.Common
|
||||
namespace OpenStack.Client.Powershell.Providers.Common
|
||||
{
|
||||
public class BaseNavigationCmdletProvider : NavigationCmdletProvider
|
||||
{
|
||||
static BaseRepositoryFactory _repositoryFactory;
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
protected BaseRepositoryFactory RepositoryFactory
|
||||
protected OpenStackClient CoreClient
|
||||
{
|
||||
get
|
||||
{
|
||||
return (BaseRepositoryFactory)this.SessionState.PSVariable.Get("BaseRepositoryFactory").Value;
|
||||
return (OpenStackClient)this.SessionState.PSVariable.Get("CoreClient").Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.SessionState.PSVariable.Set(new PSVariable("BaseRepositoryFactory", value));
|
||||
this.SessionState.PSVariable.Set(new PSVariable("CoreClient", value));
|
||||
}
|
||||
}
|
||||
//=========================================================================================
|
||||
@ -109,7 +100,7 @@ namespace Openstack.Client.Powershell.Providers.Common
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"OS\CLI.config";
|
||||
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"OS\OpenStack.config";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -118,14 +109,29 @@ namespace Openstack.Client.Powershell.Providers.Common
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private void SetZoneColor()
|
||||
private void SetZoneColor(ServiceProvider provider)
|
||||
{
|
||||
string configFilePath = this.ConfigFilePath;
|
||||
XDocument doc = XDocument.Load(configFilePath);
|
||||
XElement defaultZoneNode = doc.XPathSelectElement("//AvailabilityZone[@isDefault='True']");
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), defaultZoneNode.Attribute("shellForegroundColor").Value);
|
||||
this.Host.UI.RawUI.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), defaultZoneNode.Attribute("shellForegroundColor").Value);
|
||||
this.Context.Forecolor = defaultZoneNode.Attribute("shellForegroundColor").Value;
|
||||
// We don't throw a critical exception if this operation fails..
|
||||
|
||||
AvailabilityZone defZone = provider.AvailabilityZones.Where(z => z.IsDefault == true).DefaultIfEmpty(null).FirstOrDefault();
|
||||
if (defZone == null) return;
|
||||
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), defZone.ShellForegroundColor);
|
||||
this.Host.UI.RawUI.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), defZone.ShellForegroundColor);
|
||||
this.Context.Forecolor = defZone.ShellForegroundColor;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="service"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected T CreateServiceClient<T>(CoreServices service) where T : IOpenStackServiceClient
|
||||
{
|
||||
ServiceProvider provider = this.Context.CurrentServiceProvider;
|
||||
return this.CoreClient.CreateServiceClientByName<T>(provider.ServiceMaps.TranslateServiceName(service));
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
@ -134,35 +140,28 @@ namespace Openstack.Client.Powershell.Providers.Common
|
||||
//==================================================================================================
|
||||
protected void InitializeSession()
|
||||
{
|
||||
if (!IsContextInitialized())
|
||||
ConfigurationManager configManager = new ConfigurationManager();
|
||||
ExtensionManager extensionManager = new ExtensionManager(this.SessionState, this.Context);
|
||||
configManager.Load();
|
||||
|
||||
ServiceProvider provider = configManager.GetDefaultServiceProvider();
|
||||
|
||||
if (provider.Name == String.Empty && provider.IsDefault == true)
|
||||
{
|
||||
Context context = new Context();
|
||||
CredentialManager manager = new CredentialManager(false);
|
||||
AuthenticationRequest request = manager.BuildAuthenticationRequest();
|
||||
// Technically Core is already loaded (you're in it :) but this signs in for you to the ServiceProvider selected..
|
||||
// This is just used in the case where it's the Users first time loading the CLI..
|
||||
|
||||
if (request != null)
|
||||
{
|
||||
KeystoneAuthProvider authProvider = new KeystoneAuthProvider();
|
||||
AuthenticationResponse response = authProvider.Authenticate(request);
|
||||
|
||||
context.ServiceCatalog = response.ServiceCatalog;
|
||||
context.Settings = Settings.Default;
|
||||
|
||||
context.AccessToken = response.Token;
|
||||
context.ProductName = "Openstack-WinCLI";
|
||||
context.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
|
||||
this.SessionState.PSVariable.Set(new PSVariable("Context", context));
|
||||
this.SessionState.PSVariable.Set(new PSVariable("BaseRepositoryFactory", new BaseRepositoryFactory(context)));
|
||||
this.SetZoneColor();
|
||||
|
||||
string currentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
//string currentVersion = "1.4.0.0";
|
||||
UpdateManager updateManager = new UpdateManager(this.Context, currentVersion, this.RepositoryFactory);
|
||||
updateManager.ProcessUpdateCheck();
|
||||
}
|
||||
extensionManager.LoadCore(provider);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Load any extensions that were supplied by the ServiceProvider...
|
||||
|
||||
extensionManager.LoadExtension(provider);
|
||||
}
|
||||
|
||||
this.SetZoneColor(provider);
|
||||
}
|
||||
#region Implementation of DriveCmdletProvider
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
@ -176,57 +175,6 @@ namespace Openstack.Client.Powershell.Providers.Common
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="graph"></param>
|
||||
/// <param name="path"></param>
|
||||
//==================================================================================================
|
||||
protected void WriteJSON<T> (T graph, string path)
|
||||
{
|
||||
MemoryStream stream = new MemoryStream();
|
||||
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
|
||||
ser.WriteObject(stream, graph);
|
||||
|
||||
string retValue = Encoding.Default.GetString(stream.ToArray());
|
||||
WriteItemObject(retValue, path, false);
|
||||
WriteItemObject("", path, false);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Writes out the files represented as StorageObjects for the supplied path.
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
protected void WriteXML<T>(T graph, string path)
|
||||
{
|
||||
XmlTextWriter xtw = null;
|
||||
MemoryStream stream = new MemoryStream();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
XmlDocument document = new XmlDocument();
|
||||
StringWriter writer = null;
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(T));
|
||||
|
||||
try
|
||||
{
|
||||
serializer.Serialize(stream, graph);
|
||||
stream.Position = 0;
|
||||
document.Load(stream);
|
||||
|
||||
writer = new StringWriter(builder);
|
||||
xtw = new XmlTextWriter(writer);
|
||||
xtw.Formatting = Formatting.Indented;
|
||||
|
||||
document.WriteTo(xtw);
|
||||
}
|
||||
finally
|
||||
{
|
||||
xtw.Close();
|
||||
}
|
||||
WriteItemObject(builder.ToString(), path, false);
|
||||
WriteItemObject("", path, false);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Called when the user decides to delete a KVSDrive.
|
||||
/// </summary>
|
||||
/// <param name="drive"></param>
|
||||
@ -274,30 +222,7 @@ namespace Openstack.Client.Powershell.Providers.Common
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endregion
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
protected ResponseFormat ResponseFormat
|
||||
{
|
||||
get
|
||||
{
|
||||
try
|
||||
{
|
||||
return (ResponseFormat)this.SessionState.PSVariable.Get("ResponseFormat").Value;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
PSVariable variable = new PSVariable("ResponseFormat");
|
||||
variable.Value = ResponseFormat.data;
|
||||
|
||||
this.SessionState.PSVariable.Set(variable);
|
||||
return ResponseFormat.data;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// This test should not verify the existance of the item at the path.
|
||||
|
@ -16,8 +16,6 @@ limitations under the License.
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Management.Automation;
|
||||
using Openstack.Objects.DataAccess;
|
||||
using Openstack.Common.DataAccess;
|
||||
using Openstack.Client.Powershell.Providers.Common;
|
||||
|
||||
namespace Openstack.Client.Powershell.Providers.Common
|
||||
@ -25,61 +23,62 @@ namespace Openstack.Client.Powershell.Providers.Common
|
||||
public class CommonDriveInfo : PSDriveInfo
|
||||
{
|
||||
private CommonDriveParameters _parameters = null;
|
||||
private BaseUIContainer _currentContainer = null;
|
||||
//private BaseUIContainer _currentContainer = null;
|
||||
|
||||
#region Ctors
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="driveInfo"></param>
|
||||
//==================================================================================================
|
||||
public CommonDriveInfo(PSDriveInfo driveInfo, CommonDriveParameters parameters) : base (driveInfo)
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="driveInfo"></param>
|
||||
//==================================================================================================
|
||||
public CommonDriveInfo(PSDriveInfo driveInfo, CommonDriveParameters parameters)
|
||||
: base(driveInfo)
|
||||
{
|
||||
_parameters = parameters;
|
||||
}
|
||||
#endregion
|
||||
#region Methods
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
public Hashtable GetParameters()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
#endregion
|
||||
#region Properties
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
public BaseUIContainer CurrentTenant
|
||||
{
|
||||
get { return _currentContainer; }
|
||||
set
|
||||
{
|
||||
_currentContainer = value;
|
||||
this.CurrentLocation = _currentContainer.Path;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
public BaseUIContainer CurrentContainer
|
||||
{
|
||||
get { return _currentContainer; }
|
||||
set
|
||||
{
|
||||
_currentContainer = value;
|
||||
this.CurrentLocation = _currentContainer.Path;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
//public BaseUIContainer CurrentTenant
|
||||
//{
|
||||
// get { return _currentContainer; }
|
||||
// set
|
||||
// {
|
||||
// _currentContainer = value;
|
||||
// this.CurrentLocation = _currentContainer.Path;
|
||||
// }
|
||||
//}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
//public BaseUIContainer CurrentContainer
|
||||
//{
|
||||
// get { return _currentContainer; }
|
||||
// set
|
||||
// {
|
||||
// _currentContainer = value;
|
||||
// this.CurrentLocation = _currentContainer.Path;
|
||||
// }
|
||||
//}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,159 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Management.Automation;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
using OpenStack;
|
||||
using OpenStack.Client.Powershell.Providers.Storage;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using OpenStack.Storage;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Providers.Storage
|
||||
{
|
||||
/// <summary>
|
||||
/// This class is responsible for Converting the Users current set of Storage Containers into PSDrives..
|
||||
/// </summary>
|
||||
public class ObjectStorageDriveConverter
|
||||
{
|
||||
private Context _context;
|
||||
private ProviderInfo _providerInfo;
|
||||
private IOpenStackClient _client;
|
||||
private SessionState _sessionState;
|
||||
|
||||
#region Properties
|
||||
private SessionState SessionState
|
||||
{
|
||||
get { return _sessionState; }
|
||||
set { _sessionState = value; }
|
||||
}
|
||||
private IOpenStackClient CoreClient
|
||||
{
|
||||
get { return _client; }
|
||||
set { _client = value; }
|
||||
}
|
||||
|
||||
private Context Context
|
||||
{
|
||||
get { return _context; }
|
||||
}
|
||||
|
||||
private ProviderInfo ProviderInfo
|
||||
{
|
||||
get { return _providerInfo; }
|
||||
set { _providerInfo = value; }
|
||||
}
|
||||
#endregion
|
||||
#region Ctors
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="providerInfo"></param>
|
||||
/// <param name="client"></param>
|
||||
//==================================================================================================
|
||||
public ObjectStorageDriveConverter(Context context, ProviderInfo providerInfo, IOpenStackClient client)
|
||||
{
|
||||
_context = context;
|
||||
_providerInfo = providerInfo;
|
||||
_client = client;
|
||||
}
|
||||
#endregion
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="service"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected T CreateServiceClient<T>(CoreServices service) where T : IOpenStackServiceClient
|
||||
{
|
||||
ServiceProvider provider = this.Context.CurrentServiceProvider;
|
||||
return this.CoreClient.CreateServiceClientByName<T>(provider.ServiceMaps.TranslateServiceName(service));
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
public System.Collections.ObjectModel.Collection<PSDriveInfo> ConvertContainers()
|
||||
{
|
||||
IEnumerable<StorageContainer> storageContainers = null;
|
||||
var parameters = new ObjectStorageDriveParameters();
|
||||
|
||||
if (this.Context != null && this.Context.Settings != null) {
|
||||
parameters.Settings = this.Context.Settings;
|
||||
}
|
||||
else {
|
||||
throw new NullReferenceException("Context and/or Settings");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
this.CoreClient.SetRegion(this.Context.CurrentRegion);
|
||||
Task<StorageAccount> getAccountTask = this.CreateServiceClient<IStorageServiceClient>(CoreServices.ObjectStorage).GetStorageAccount();
|
||||
getAccountTask.Wait();
|
||||
storageContainers = getAccountTask.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 serviceName = this.Context.CurrentServiceProvider.ServiceMaps.TranslateServiceName(CoreServices.ObjectStorage);
|
||||
string publicStoreUrl = this.Context.ServiceCatalog.GetPublicEndpoint(serviceName, this.Context.CurrentRegion).ToString();
|
||||
|
||||
if (storageContainers.Count() > 0)
|
||||
{
|
||||
foreach (StorageContainer storageContainer in storageContainers)
|
||||
{
|
||||
PSDriveInfo driveInfo = new PSDriveInfo(storageContainer.Name, this.ProviderInfo, "/", "Root folder for your storageContainer", null);
|
||||
ObjectStoragePSDriveInfo kvsDriveInfo = new ObjectStoragePSDriveInfo(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 ObjectStoragePSDriveInfo(driveInfo, parameters, this.Context, publicStoreUrl)
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {}
|
||||
|
||||
return drives;
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/* ============================================================================
|
||||
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 OpenStack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Providers.Storage
|
||||
{
|
||||
public class ObjectStorageDriveParameters
|
||||
{
|
||||
private Settings _settings;
|
||||
|
||||
public Settings Settings
|
||||
{
|
||||
get { return _settings; }
|
||||
set { _settings = value; }
|
||||
}
|
||||
#region Ctors
|
||||
//=================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="settings"></param>
|
||||
//=================================================================================
|
||||
public ObjectStorageDriveParameters()
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -0,0 +1,745 @@
|
||||
/* ============================================================================
|
||||
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.Management.Automation;
|
||||
using System.Management.Automation.Provider;
|
||||
using System.Collections.ObjectModel;
|
||||
using OpenStack.Storage;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using OpenStack.Client.Powershell.Providers.Common;
|
||||
using System.Management.Automation.Runspaces;
|
||||
using OpenStack;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using OpenStack.Client.Powershell.Providers.ObjectStorage;
|
||||
using System.Diagnostics.Contracts;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Providers.Storage
|
||||
{
|
||||
[CmdletProvider("Object Storage", ProviderCapabilities.ExpandWildcards)]
|
||||
public class ObjectStorageNavigationProvider : BaseNavigationCmdletProvider
|
||||
{
|
||||
const string cDelimiter = @"\";
|
||||
const string cFolderMarker = "folder.txt";
|
||||
|
||||
private class FolderStatistics
|
||||
{
|
||||
public long TotalFilesFound = 0;
|
||||
public long TotalBytes = 0;
|
||||
public long TotalFoldersFound = 0;
|
||||
}
|
||||
private IStorageServiceClient _storageClient;
|
||||
|
||||
#region Implementation of DriveCmdletProvider
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Removes an Item from the store..
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
//==================================================================================================
|
||||
protected override void ClearItem(string path)
|
||||
{
|
||||
base.ClearItem(path);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private string StorageServiceURL
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.Drive == null || this.Drive.SharePath == null) {
|
||||
string serviceName = this.Context.CurrentServiceProvider.ServiceMaps.TranslateServiceName(CoreServices.ObjectStorage);
|
||||
return this.Context.ServiceCatalog.GetPublicEndpoint(serviceName, this.Context.CurrentRegion).ToString();
|
||||
}
|
||||
else
|
||||
return this.Drive.SharePath;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
public System.Collections.ObjectModel.Collection<PSDriveInfo> GetAvailableDrives(Settings settings, ProviderInfo providerInfo)
|
||||
{
|
||||
Contract.Assert(settings != null);
|
||||
|
||||
IEnumerable<StorageContainer> storageContainers = null;
|
||||
ObjectStorageDriveParameters parameters = new ObjectStorageDriveParameters();
|
||||
|
||||
if (this.Settings != null) {
|
||||
parameters.Settings = this.Settings;
|
||||
}
|
||||
else {
|
||||
parameters.Settings = settings;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Get a list of Storage Containers...
|
||||
|
||||
Task<IEnumerable<StorageContainer>> getContainersTask = this.CreateServiceClient<IStorageServiceClient>(CoreServices.ObjectStorage).ListStorageContainers();
|
||||
getContainersTask.Wait();
|
||||
storageContainers = getContainersTask.Result;
|
||||
}
|
||||
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
|
||||
{
|
||||
if (storageContainers.Count() > 0)
|
||||
{
|
||||
foreach (StorageContainer storageContainer in storageContainers)
|
||||
{
|
||||
PSDriveInfo driveInfo = new PSDriveInfo(storageContainer.Name, providerInfo, "/", "Root folder for your storageContainer", null);
|
||||
parameters.Settings = this.Settings;
|
||||
ObjectStoragePSDriveInfo kvsDriveInfo = new ObjectStoragePSDriveInfo(driveInfo, parameters, this.Context, this.StorageServiceURL);
|
||||
//kvsDriveInfo.SharePath = storageContainer.SharePath;
|
||||
drives.Add(kvsDriveInfo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.ProviderInfo, "/", "Root folder for your storageContainer", null);
|
||||
return new Collection<PSDriveInfo>
|
||||
{
|
||||
new ObjectStoragePSDriveInfo(driveInfo, parameters, this.Context, this.StorageServiceURL)
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return drives;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private void SetDefaultDrive()
|
||||
{
|
||||
Runspace runSpace = Runspace.DefaultRunspace;
|
||||
runSpace.Open();
|
||||
Pipeline pipeline = runSpace.CreatePipeline();
|
||||
Command setDefaultDriveCmd = new Command("Set-Location OS-Init:");
|
||||
pipeline.Commands.Add(setDefaultDriveCmd);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private Collection<PSDriveInfo> CreateDefaultDrive(ObjectStorageDriveParameters parameters)
|
||||
{
|
||||
WriteDebug("No Storage Containers found, initializing defaults.");
|
||||
PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.ProviderInfo, "/", "Root folder for your Container", null);
|
||||
|
||||
return new Collection<PSDriveInfo>
|
||||
{
|
||||
new ObjectStoragePSDriveInfo(driveInfo, parameters, this.Context, this.StorageServiceURL)
|
||||
};
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// This is called when the CLIManifest.psd1 is registered with the Import-Module cmdlet.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override System.Collections.ObjectModel.Collection<PSDriveInfo> InitializeDefaultDrives()
|
||||
{
|
||||
Thread.Sleep(new TimeSpan(0, 0, 0, 5, 0));
|
||||
|
||||
this.InitializeSession();
|
||||
|
||||
if (this.Context.ServiceCatalog.Exists(this.ProviderInfo.Name))
|
||||
{
|
||||
IEnumerable<StorageContainer> storageContainers = null;
|
||||
ObjectStorageDriveParameters parameters = new ObjectStorageDriveParameters();
|
||||
var storageServiceClient = this.CreateServiceClient<IStorageServiceClient>(CoreServices.ObjectStorage);
|
||||
Task<StorageAccount> accountTask = storageServiceClient.GetStorageAccount();
|
||||
|
||||
accountTask.Wait();
|
||||
StorageAccount account = accountTask.Result;
|
||||
storageContainers = account.Containers;
|
||||
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
|
||||
{
|
||||
if (storageContainers != null)
|
||||
{
|
||||
if (storageContainers.Count() == 1 && storageContainers.First().Name == string.Empty)
|
||||
{
|
||||
return this.CreateDefaultDrive(parameters);
|
||||
}
|
||||
parameters.Settings = this.Settings;
|
||||
|
||||
foreach (StorageContainer storageContainer in storageContainers)
|
||||
{
|
||||
PSDriveInfo driveInfo = new PSDriveInfo(storageContainer.Name, this.ProviderInfo, "/", "Root folder for your storageContainer", null);
|
||||
ObjectStoragePSDriveInfo kvsDriveInfo = new ObjectStoragePSDriveInfo(driveInfo, parameters, this.Context, this.StorageServiceURL);
|
||||
//kvsDriveInfo.SharePath = storageContainer.SharePath;
|
||||
drives.Add(kvsDriveInfo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return this.CreateDefaultDrive(parameters);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteDebug("Exception : HPOSNavigationProvider.InitializeDefaultDrives");
|
||||
WriteDebug(ex.Message);
|
||||
this.WriteError(new ErrorRecord(ex, "1", ErrorCategory.InvalidArgument, this));
|
||||
}
|
||||
return drives;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=======================================================================================================
|
||||
public bool ContainsWildcard(string path)
|
||||
{
|
||||
if (path.Contains("?") || path.Contains("*") || path.Contains("[") || path.Contains("]"))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//=======================================================================================================
|
||||
private string GetContainerName(string path)
|
||||
{
|
||||
return this.Drive.Name;
|
||||
|
||||
if (path == "//")
|
||||
{
|
||||
return this.Drive.Name;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Retrieves a StorageObject with a fully qualified path from the User.
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private IEnumerable<StorageItemViewModel> GetStorageObjects(string path)
|
||||
{
|
||||
List<StorageItemViewModel> modelViewItems = new List<StorageItemViewModel>();
|
||||
Task<StorageFolder> listStorageObjectTask;
|
||||
string folderName = null;
|
||||
|
||||
if (path != @"\" && !path.EndsWith(@"\"))
|
||||
path = path + @"\";
|
||||
|
||||
StoragePath storagePath = this.CreateStoragePath(path);
|
||||
var client = this.CreateServiceClient<IStorageServiceClient>(CoreServices.ObjectStorage);
|
||||
|
||||
if (path == "\\") {
|
||||
folderName = "/";
|
||||
}
|
||||
else {
|
||||
folderName = path.Replace(@"\", "/").TrimStart('/');
|
||||
}
|
||||
|
||||
listStorageObjectTask = client.GetStorageFolder(this.GetContainerName(path), folderName);
|
||||
listStorageObjectTask.Wait();
|
||||
foreach (StorageItem item in listStorageObjectTask.Result.Objects.Union<StorageItem>(listStorageObjectTask.Result.Folders))
|
||||
{
|
||||
StorageItemViewModel modelView = new StorageItemViewModel(item);
|
||||
modelViewItems.Add(modelView);
|
||||
}
|
||||
return modelViewItems;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private void WriteData(IEnumerable<StorageItemViewModel> storageItemViewModel, string path, WildcardPattern pattern = null)
|
||||
{
|
||||
FolderStatistics statistics = new FolderStatistics();
|
||||
bool doesExist = false;
|
||||
|
||||
if (storageItemViewModel.Count() > 0 || storageItemViewModel == null)
|
||||
{
|
||||
// Write out any files that we find within this particular folder..
|
||||
|
||||
statistics = this.WriteFiles(storageItemViewModel, path);
|
||||
doesExist = true;
|
||||
}
|
||||
|
||||
//List<StorageItem> folders = storageObjects.Where(so => so.Name.EndsWith(@"\")).ToList<StorageItem>();
|
||||
|
||||
List<StorageItemViewModel> folders = storageItemViewModel.Where(so => so.Type == "Folder").ToList<StorageItemViewModel>();
|
||||
|
||||
// List<StorageObject> folders = storageObjects.Where(so => so.StorageObjectType == StorageObjectType.Folder).ToList<StorageObject>();
|
||||
|
||||
if (folders != null)
|
||||
{
|
||||
// Now we'll write out any decendant folders found within the current directory..
|
||||
|
||||
this.WriteFolders(folders, ref statistics);
|
||||
doesExist = true;
|
||||
}
|
||||
|
||||
// Finally write out the summary folder stats section of the command..
|
||||
|
||||
if (doesExist)
|
||||
{
|
||||
this.WriteFolderStatistics(statistics);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("No files or folders found.");
|
||||
Console.WriteLine("");
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Writes out the files represented as StorageObjects for the supplied path.
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private FolderStatistics WriteFiles(IEnumerable<StorageItemViewModel> storageObjects, string path)
|
||||
{
|
||||
FolderStatistics statistics = new FolderStatistics();
|
||||
|
||||
if (storageObjects != null && storageObjects.ToList() != null)
|
||||
{
|
||||
storageObjects.ToList().ForEach(item =>
|
||||
{
|
||||
if (item.Type == "File")
|
||||
{
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), this.Context.Forecolor);
|
||||
WriteItemObject(item, item.Name, false);
|
||||
statistics.TotalFilesFound++;
|
||||
//statistics.TotalBytes = statistics.TotalBytes + item.Length;
|
||||
}
|
||||
});
|
||||
}
|
||||
return statistics;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Writes out a list of supplied Folders and returns stats on them as well.
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private void WriteFolders(List<StorageItemViewModel> folders, ref FolderStatistics statistics)
|
||||
{
|
||||
if (folders != null)
|
||||
{
|
||||
// Write out each folder we find in the current directory..
|
||||
|
||||
foreach (StorageItemViewModel obj in folders)
|
||||
{
|
||||
string fixedString = obj.Name.TrimEnd('/');
|
||||
string[] folderNames = fixedString.Split('/');
|
||||
string folderName = folderNames[folderNames.Count() - 1];
|
||||
//obj.Name = folderName;
|
||||
|
||||
if (folderName != "")
|
||||
{
|
||||
WriteItemObject(obj, folderName, false);
|
||||
statistics.TotalFoldersFound++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
statistics.TotalFoldersFound = 0;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Writes out summary information on a given folder.
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private void WriteFolderStatistics(FolderStatistics statistics)
|
||||
{
|
||||
if (statistics.TotalFoldersFound > 0 || statistics.TotalFilesFound > 0)
|
||||
WriteItemObject ("----------------------------------------------------------------------------------------------", cDelimiter, false);
|
||||
WriteItemObject(" ", cDelimiter, false);
|
||||
WriteItemObject("Total # Folders found : " + Convert.ToString(statistics.TotalFoldersFound) , cDelimiter, false);
|
||||
WriteItemObject("Total # Items Found : " + Convert.ToString(statistics.TotalFilesFound) , cDelimiter, false);
|
||||
WriteItemObject("Total # Bytes in Folder : " + Convert.ToString(statistics.TotalBytes), cDelimiter, false);
|
||||
// WriteItemObject("Total Cost of Folder : " + "$" + Convert.ToString(statistics.TotalBytes * 2), cDelimiter, false);
|
||||
WriteItemObject(" ", cDelimiter, false);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Writes out header information to be used during listing operations.
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private void WriteHeader()
|
||||
{
|
||||
// Write out the commands header information first..
|
||||
|
||||
WriteItemObject(" ", cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
WriteItemObject("==============================================================================================", cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||
WriteItemObject("Storage Container : " + this.Drive.Name, cDelimiter, false);
|
||||
WriteItemObject("Directory of : " + this.Drive.Name + " " + cDelimiter + this.Drive.CurrentLocation, cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
WriteItemObject("==============================================================================================", cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
WriteItemObject(" ", cDelimiter, false);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private bool CheckDefaultDrive(bool suppressMsg)
|
||||
{
|
||||
if (this.Drive.Name == "OS-Init")
|
||||
{
|
||||
if (!suppressMsg)
|
||||
{
|
||||
Console.WriteLine(" ", cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
Console.WriteLine("==============================================================================================", cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.WriteLine("You are currently connected to the default Container. This drive is used to boot-strap the");
|
||||
Console.WriteLine("Container creation prcoess. The only valid command that you can issue from here is the");
|
||||
Console.WriteLine("New-Container command. After the Container is created successfully, issue CD yourcontainer:");
|
||||
Console.WriteLine("This will bind to that container exposing the full functionality of OpenStack Object Storage. ");
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
Console.WriteLine("==============================================================================================", cDelimiter, false);
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
Console.WriteLine(" ", cDelimiter, false);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected override object GetItemDynamicParameters(string path)
|
||||
{
|
||||
return base.GetItemDynamicParameters(path);
|
||||
}
|
||||
|
||||
protected override void SetItem(string path, object value)
|
||||
{
|
||||
base.SetItem(path, value);
|
||||
}
|
||||
protected override string[] ExpandPath(string path)
|
||||
{
|
||||
return base.ExpandPath(path);
|
||||
}
|
||||
protected override string GetParentPath(string path, string root)
|
||||
{
|
||||
return base.GetParentPath(path, root);
|
||||
}
|
||||
protected override object GetChildNamesDynamicParameters(string path)
|
||||
{
|
||||
return base.GetChildNamesDynamicParameters(path);
|
||||
}
|
||||
protected override object GetChildItemsDynamicParameters(string path, bool recurse)
|
||||
{
|
||||
return base.GetChildItemsDynamicParameters(path, recurse);
|
||||
}
|
||||
protected override object ClearItemDynamicParameters(string path)
|
||||
{
|
||||
return base.ClearItemDynamicParameters(path);
|
||||
}
|
||||
protected override string NormalizeRelativePath(string path, string basePath)
|
||||
{
|
||||
return base.NormalizeRelativePath(path, basePath);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override bool IsItemContainer(string path)
|
||||
{
|
||||
if (path == @"\")
|
||||
{
|
||||
if (this.CheckDefaultDrive(false)) return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
StoragePath storagePath = null;
|
||||
|
||||
if (path.Contains(":"))
|
||||
{
|
||||
storagePath = new StoragePath(this.StorageServiceURL + path);
|
||||
}
|
||||
else
|
||||
{
|
||||
storagePath = new StoragePath(this.StorageServiceURL, this.Drive.Name, path.Substring(1) + "/");
|
||||
}
|
||||
|
||||
IStorageServiceClient storageService = this.CoreClient.CreateServiceClient<IStorageServiceClient>();
|
||||
Task<StorageObject> getStorageObjectTask = storageService.GetStorageObject(storagePath.Volume, storagePath.ResourcePath); //(storagePath.AbsoluteURI);
|
||||
getStorageObjectTask.Wait();
|
||||
StorageObject sObject = getStorageObjectTask.Result;
|
||||
|
||||
if (sObject != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Displays all StorageObjects for a given folder..
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="recurse"></param>
|
||||
//==================================================================================================
|
||||
protected override void GetChildItems(string path, bool recurse)
|
||||
{
|
||||
// Write out the commands header information first..
|
||||
|
||||
if (this.CheckDefaultDrive(true)) return;
|
||||
|
||||
this.WriteHeader();
|
||||
this.WriteData(this.GetStorageObjects(path).ToList<StorageItemViewModel>(), path);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Called when the user decides to delete a KVSDrive.
|
||||
/// </summary>
|
||||
/// <param name="drive"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
|
||||
{
|
||||
if (drive == null)
|
||||
{
|
||||
WriteError(new ErrorRecord(new ArgumentNullException("drive"), "NullDrive", ErrorCategory.InvalidArgument, drive));
|
||||
return null;
|
||||
}
|
||||
return drive;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Called by the PS runtime when a NewDrive is required..
|
||||
/// </summary>
|
||||
/// <param name="drive"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override PSDriveInfo NewDrive(PSDriveInfo drive)
|
||||
{
|
||||
if (drive == null) {
|
||||
WriteError(new ErrorRecord(new ArgumentNullException("drive"), "NullDrive", ErrorCategory.InvalidArgument, drive));
|
||||
return null;
|
||||
}
|
||||
|
||||
if (drive.Root == null) {
|
||||
WriteError(new ErrorRecord(new ArgumentNullException("drive.Root"), "NullRoot", ErrorCategory.InvalidArgument, drive));
|
||||
return null;
|
||||
}
|
||||
|
||||
if (drive is ObjectStoragePSDriveInfo) {
|
||||
return drive;
|
||||
}
|
||||
|
||||
var driveParams = this.DynamicParameters as ObjectStorageDriveParameters;
|
||||
return new ObjectStoragePSDriveInfo(drive, driveParams, this.Context, this.StorageServiceURL);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// Called by the PS runtime when
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override object NewDriveDynamicParameters()
|
||||
{
|
||||
// The KVSDriveParameters instance will pull its values from the config file when created..
|
||||
|
||||
return new ObjectStorageDriveParameters();
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private string GetLeafFolder(string path)
|
||||
{
|
||||
string[] elements = path.Replace(@"\", "/").Split('/');
|
||||
return elements[elements.Count() - 2];
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="itemTypeName"></param>
|
||||
/// <param name="newItemValue"></param>
|
||||
//==================================================================================================
|
||||
protected override void NewItem(string path, string itemTypeName, object newItemValue)
|
||||
{
|
||||
//// Validate the folder name first..
|
||||
|
||||
//if (path.Contains("%") || path.Contains("."))
|
||||
//{
|
||||
// Console.WriteLine("");
|
||||
// Console.WriteLine("Folder names cannot contain % or . characters" );
|
||||
// Console.WriteLine("");
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// if (!path.EndsWith("/"))
|
||||
// {
|
||||
// path = path + "/";
|
||||
// }
|
||||
|
||||
// StoragePath newFolderPath = this.CreateStoragePath(path);
|
||||
// this.RepositoryFactory.CreateStorageObjectRepository().MakeFolder(newFolderPath.AbsoluteURI);
|
||||
//}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private string ExtractPattern(string path)
|
||||
{
|
||||
string[] elements = path.Split('\\');
|
||||
return elements[elements.Length - 1];
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
//==================================================================================================
|
||||
protected override void GetItem(string path)
|
||||
{
|
||||
// Write out the commands header information first..
|
||||
|
||||
if (this.CheckDefaultDrive(true)) return;
|
||||
this.WriteHeader();
|
||||
IEnumerable<StorageItemViewModel> storageObjects = this.GetStorageObjects(path);
|
||||
|
||||
|
||||
|
||||
this.WriteData(storageObjects.ToList<StorageItemViewModel>(), path);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override bool ItemExists(string path)
|
||||
{
|
||||
if (path == "//")
|
||||
{
|
||||
if (this.CheckDefaultDrive(true))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return base.ItemExists(path);
|
||||
}
|
||||
}
|
||||
return base.ItemExists(path);
|
||||
}
|
||||
#endregion
|
||||
#region Properties
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private ObjectStoragePSDriveInfo Drive
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.PSDriveInfo as ObjectStoragePSDriveInfo;
|
||||
}
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
//=========================================================================================
|
||||
private StoragePath CreateStoragePath(string path)
|
||||
{
|
||||
return this.Drive.CreateStoragePath(path);
|
||||
}
|
||||
#endregion
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
/// This test should not verify the existance of the item at the path.
|
||||
/// It should only perform syntactic and semantic validation of the
|
||||
/// path. For instance, for the file system provider, that path should
|
||||
/// be canonicalized, syntactically verified, and ensure that the path
|
||||
/// does not refer to a device.
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
protected override bool IsValidPath(string path)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,369 @@
|
||||
/* ============================================================================
|
||||
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.Collections.Generic;
|
||||
using System.Management.Automation;
|
||||
using System.Collections;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using OpenStack.Storage;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
|
||||
namespace OpenStack.Client.Powershell.Providers.Storage
|
||||
{
|
||||
public class ObjectStoragePSDriveInfo : PSDriveInfo
|
||||
{
|
||||
public const string cDelimiter = "/";
|
||||
|
||||
private ObjectStorageDriveParameters _parameters = null;
|
||||
private IStorageServiceClient _storageClient;
|
||||
private List<string> _pathCache = new List<string>();
|
||||
private bool _isQueueOn = false;
|
||||
private Settings _settings = null;
|
||||
private Context _context;
|
||||
private string _sharePath;
|
||||
private string _storageServiceUrl;
|
||||
|
||||
#region Ctors
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="driveInfo"></param>
|
||||
//==================================================================================================
|
||||
public ObjectStoragePSDriveInfo(PSDriveInfo driveInfo, ObjectStorageDriveParameters parameters, Context context , string storageServiceUrl): base(driveInfo)
|
||||
{
|
||||
_parameters = parameters;
|
||||
_context = context;
|
||||
_storageServiceUrl = storageServiceUrl;
|
||||
|
||||
if (parameters != null)
|
||||
_settings = parameters.Settings;
|
||||
}
|
||||
#endregion
|
||||
#region Methods
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//=======================================================================================================
|
||||
private string GetFirstPathElement(string path)
|
||||
{
|
||||
int delimeterPosition;
|
||||
|
||||
if (path.StartsWith(@"\"))
|
||||
{
|
||||
delimeterPosition = path.IndexOf(@"\", 1, StringComparison.Ordinal);
|
||||
if (delimeterPosition != -1)
|
||||
return path.Substring(0, delimeterPosition);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
delimeterPosition = path.IndexOf("/", 0, StringComparison.Ordinal);
|
||||
if (delimeterPosition != -1)
|
||||
return path.Substring(0, delimeterPosition);
|
||||
else
|
||||
{
|
||||
delimeterPosition = path.IndexOf(@"\", 0, StringComparison.Ordinal);
|
||||
if (delimeterPosition != -1)
|
||||
return path.Substring(0, delimeterPosition);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//=======================================================================================================
|
||||
private bool IsOpenStackDrive(string name)
|
||||
{
|
||||
if (name != null)
|
||||
{
|
||||
if (name.Contains(":"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
|
||||
public string SharePath
|
||||
{
|
||||
get { return _sharePath; }
|
||||
set { _sharePath = value; }
|
||||
}
|
||||
private IStorageServiceClient StorageClient
|
||||
{
|
||||
get { return _storageClient; }
|
||||
set { _storageClient = value; }
|
||||
}
|
||||
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//=======================================================================================================
|
||||
private bool ContainsHPOSDrive(string name)
|
||||
{
|
||||
foreach (PSDriveInfo drive in this.Provider.Drives)
|
||||
{
|
||||
if (drive.Provider.Name == "Object Storage" && drive.Name.Contains(name))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
////=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//=========================================================================================
|
||||
private bool IsLocalPath(string path)
|
||||
{
|
||||
// Temporaily reverse the delimiter for this check...
|
||||
|
||||
string temp = path.Replace(@"/", @"\");
|
||||
List<DriveInfo> drives = DriveInfo.GetDrives().ToList<DriveInfo>();
|
||||
|
||||
drives.DefaultIfEmpty(null);
|
||||
if (drives.Where(d => temp.ToUpper().Contains(d.Name)).FirstOrDefault() == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private bool IsFullyQualifiedPath (string path)
|
||||
{
|
||||
string firstPathElement = GetFirstPathElement(path);
|
||||
|
||||
if (IsOpenStackDrive(firstPathElement))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (IsLocalPath(path))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private string FormatPath (string path)
|
||||
{
|
||||
string currentLocation = null;
|
||||
|
||||
// Strip out any leading or trailing delimiters..
|
||||
|
||||
if (path.StartsWith(@"\") || path.StartsWith("/"))
|
||||
{
|
||||
path = path.Substring(1);
|
||||
}
|
||||
|
||||
// Reverse the delimiter and strip out the current location. We do this because some paths will come from the provider
|
||||
// in which PS has already supplied the fully qualified path, yet some paths will come from cmdlets (like CopyItem)
|
||||
// that receive paths from the user. These paths may or may not contain the current location so we strip it out reguardless
|
||||
// then read it back...
|
||||
|
||||
path = path.Replace(@"\", "/");
|
||||
currentLocation = this.CurrentLocation.Replace(@"\", "/");
|
||||
|
||||
if (currentLocation != "")
|
||||
{
|
||||
path = path.Replace(currentLocation + "/", string.Empty);
|
||||
}
|
||||
path = path.Replace(this.Name + "/", string.Empty);
|
||||
return path;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private StoragePath ProcessRootPath(string path)
|
||||
{
|
||||
path = this.FormatPath(path);
|
||||
|
||||
if (this.IsLocalPath(path))
|
||||
{
|
||||
// Nothing to do to a pure local path. Just return it wrapped up..
|
||||
|
||||
return new StoragePath(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
string firstElement = this.GetFirstPathElement(path);
|
||||
|
||||
if (this.IsOpenStackDrive(firstElement))
|
||||
{
|
||||
// If the path supplied already contains a storageContainer name, strip it out and pass it in as the volume name..
|
||||
|
||||
path = path.Replace(firstElement, string.Empty);
|
||||
|
||||
return new StoragePath(this.StorageServiceUrl);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the path supplied lacks a storageContainer name, take the current one..
|
||||
|
||||
return new StoragePath(this.StorageServiceUrl, this.Name, path.Replace(@"\", "/"));
|
||||
}
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private StoragePath ProcessNonRootPath (string path)
|
||||
{
|
||||
string publicURL = this.StorageServiceUrl;
|
||||
|
||||
if (this.IsFullyQualifiedPath(path) == true)
|
||||
{
|
||||
return new StoragePath(this.StorageServiceUrl + "/" + path.Replace(@"\", "/").Replace(":", "/"));
|
||||
}
|
||||
else
|
||||
{
|
||||
path = this.FormatPath(path);
|
||||
|
||||
if (path.EndsWith(cDelimiter))
|
||||
{
|
||||
// We're dealing with a folder path here..
|
||||
|
||||
return new StoragePath(publicURL, this.Name, this.CurrentLocation.Replace(@"\", "/") + cDelimiter + path);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// We're dealing with an object path here..
|
||||
|
||||
path = (publicURL + cDelimiter + this.Name + cDelimiter + this.CurrentLocation.Replace(@"\", "/") + cDelimiter + path);
|
||||
return new StoragePath(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="sourcePath"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
public StoragePath CreateStoragePath(string path)
|
||||
{
|
||||
if (this.IsLocalPath(path))
|
||||
{
|
||||
return new StoragePath(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check for a root path supplied first..
|
||||
|
||||
if (this.CurrentLocation == string.Empty)
|
||||
{
|
||||
return this.ProcessRootPath(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
return this.ProcessNonRootPath(path);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
public Hashtable GetParameters()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
#endregion
|
||||
#region Properties
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private string StorageServiceUrl
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.SharePath == null)
|
||||
{
|
||||
string serviceName = this._context.CurrentServiceProvider.ServiceMaps.TranslateServiceName(CoreServices.ObjectStorage);
|
||||
return this._context.ServiceCatalog.GetPublicEndpoint(serviceName, _context.CurrentRegion).ToString();
|
||||
|
||||
}
|
||||
else
|
||||
return this.SharePath;
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
public List<string> PathCache
|
||||
{
|
||||
get { return _pathCache; }
|
||||
set { _pathCache = value; }
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -1,225 +1,211 @@
|
||||
//using System;
|
||||
//using System.Collections.Generic;
|
||||
//using System.Linq;
|
||||
//using System.Management.Automation;
|
||||
//using System.Text;
|
||||
//using System.Threading.Tasks;
|
||||
//using OpenStack.Client.Powershell.Providers.Storage;
|
||||
//using OpenStack.Identity;
|
||||
//using OpenStack.Storage;
|
||||
/* ============================================================================
|
||||
Copyright 2014 Hewlett Packard
|
||||
|
||||
//namespace OpenStack.Client.Powershell.Utility
|
||||
//{
|
||||
// public class AccountCapabilities
|
||||
// {
|
||||
// private SessionState _session;
|
||||
// private Context _context;
|
||||
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
|
||||
|
||||
// #region Properties
|
||||
// public Context Context
|
||||
// {
|
||||
// get { return _context; }
|
||||
// set { _context = value; }
|
||||
// }
|
||||
// public SessionState Session
|
||||
// {
|
||||
// get { return _session; }
|
||||
// set { _session = value; }
|
||||
// }
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// public AccountCapabilities(SessionState session, Context context)
|
||||
// {
|
||||
// _session = session;
|
||||
// _context = context;
|
||||
// }
|
||||
// //=======================================================================================================
|
||||
// /// <summary>
|
||||
// ///
|
||||
// /// </summary>
|
||||
// //=======================================================================================================
|
||||
// public void WriteServices()
|
||||
// {
|
||||
// this.Session.InvokeCommand.InvokeScript("Hey");
|
||||
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.Collections.ObjectModel;
|
||||
using System.Management.Automation;
|
||||
using OpenStack.Client.Powershell.Providers.Storage;
|
||||
using OpenStack.Identity;
|
||||
|
||||
// //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(" ");
|
||||
namespace OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
public class AccountCapabilities
|
||||
{
|
||||
private SessionState _session;
|
||||
private Context _context;
|
||||
private IOpenStackClient _coreClient;
|
||||
private Cmdlet _cmdlet;
|
||||
|
||||
#region Properties
|
||||
|
||||
// //foreach (OpenstackServiceDefinition service in this.Context.ServiceCatalog)
|
||||
// //{
|
||||
// // WriteObject(service);
|
||||
// //}
|
||||
// //WriteObject("");
|
||||
// }
|
||||
// //==================================================================================================
|
||||
// /// <summary>
|
||||
// ///
|
||||
// /// </summary>
|
||||
// /// <returns></returns>
|
||||
// //==================================================================================================
|
||||
// private System.Collections.ObjectModel.Collection<PSDriveInfo> GetAvailableDrives(Settings settings, ProviderInfo providerInfo) //, string configFilePath)
|
||||
// {
|
||||
// List<StorageContainer> storageContainers = null;
|
||||
// OSDriveParameters parameters = new OSDriveParameters();
|
||||
public Cmdlet Cmdlet
|
||||
{
|
||||
get { return _cmdlet; }
|
||||
set { _cmdlet = value; }
|
||||
}
|
||||
|
||||
// if (this.Context.Settings != null)
|
||||
// {
|
||||
// parameters.Settings = this.Context.Settings;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// parameters.Settings = settings;
|
||||
// }
|
||||
public IOpenStackClient CoreClient
|
||||
{
|
||||
get { return _coreClient; }
|
||||
set { _coreClient = value; }
|
||||
}
|
||||
|
||||
private Context Context
|
||||
{
|
||||
get { return _context; }
|
||||
set { _context = value; }
|
||||
}
|
||||
private SessionState SessionState
|
||||
{
|
||||
get { return _session; }
|
||||
set { _session = value; }
|
||||
}
|
||||
#endregion
|
||||
#region Methods
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="session"></param>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="coreClient"></param>
|
||||
/// <param name="cmd"></param>
|
||||
//=======================================================================================================
|
||||
public AccountCapabilities(SessionState session, Context context, IOpenStackClient coreClient, Cmdlet cmd)
|
||||
{
|
||||
_session = session;
|
||||
_context = context;
|
||||
_coreClient = coreClient;
|
||||
_cmdlet = cmd;
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
private void WriteHeader(string message)
|
||||
{
|
||||
// Write out the commands header information first..
|
||||
|
||||
// try
|
||||
// {
|
||||
// Task<IEnumerable<StorageContainer>> getContainersTask = this.CoreClient.CreateServiceClient<IStorageServiceClient>().ListStorageContainers();
|
||||
// getContainersTask.Wait();
|
||||
// storageContainers = getContainersTask.Result.ToList<StorageContainer>();
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine(ex);
|
||||
// }
|
||||
WriteObject("");
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
WriteObject("===================================================================");
|
||||
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||
WriteObject(message);
|
||||
Console.ForegroundColor = ConsoleColor.DarkGray;
|
||||
WriteObject("===================================================================");
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
WriteObject(" ");
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
public void WriteContainers()
|
||||
{
|
||||
var invalidDriveNames = new List<string>();
|
||||
var parameters = new ObjectStorageDriveParameters();
|
||||
var provider = new ObjectStorageNavigationProvider();
|
||||
var converter = new ObjectStorageDriveConverter(this.Context, _session.Drive.Current.Provider, this.CoreClient);
|
||||
var drives = converter.ConvertContainers();
|
||||
|
||||
if (drives != null)
|
||||
{
|
||||
this.WriteHeader("Storage Containers available in this AZ include");
|
||||
|
||||
// Collection<PSDriveInfo> drives = new Collection<PSDriveInfo>();
|
||||
// Remove the old Users drives first..
|
||||
|
||||
// // For every storageContainer that the User has access to, create a Drive that he can mount within Powershell..
|
||||
Collection<PSDriveInfo> deadDrives = this.SessionState.Drive.GetAllForProvider("Object Storage");
|
||||
foreach (PSDriveInfo deadDrive in deadDrives)
|
||||
{
|
||||
this.SessionState.Drive.Remove(deadDrive.Name, true, "local");
|
||||
}
|
||||
|
||||
// try
|
||||
// {
|
||||
// string publicStoreUrl = this.Context.ServiceCatalog.GetPublicEndpoint("Object Storage", "region-a.geo-1").ToString();
|
||||
foreach (PSDriveInfo drive in drives)
|
||||
{
|
||||
if (drive.Name != string.Empty)
|
||||
{
|
||||
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), this.Context.Forecolor);
|
||||
WriteObject("Storage Container : [" + drive.Name + "] now available.");
|
||||
}
|
||||
|
||||
// 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;
|
||||
// }
|
||||
try
|
||||
{
|
||||
this.SessionState.Drive.New(drive, "local");
|
||||
}
|
||||
catch (PSArgumentException ex)
|
||||
{
|
||||
if (drive.Name != string.Empty)
|
||||
invalidDriveNames.Add(drive.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No storageContainers exist for the new credentials so make some up...
|
||||
|
||||
// return drives;
|
||||
// }
|
||||
// //=======================================================================================================
|
||||
// /// <summary>
|
||||
// /// Removes all currently registered drives..
|
||||
// /// </summary>
|
||||
// //=======================================================================================================
|
||||
// private void RemoveDrives()
|
||||
// {
|
||||
// // Remove the old Users drives first..
|
||||
//PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.SessionState.Drive.Current.Provider, "/", "Root folder for your storageContainer", null);
|
||||
//this.SessionState.Drive.New(new ObjectStoragePSDriveInfo(driveInfo, parameters, this.Context, this.Context.ServiceCatalog.GetPublicEndpoint("object-store", this.Context.CurrentRegion)), "local");
|
||||
}
|
||||
|
||||
// Collection<PSDriveInfo> deadDrives = this.SessionState.Drive.GetAllForProvider("Object Storage");
|
||||
// foreach (PSDriveInfo deadDrive in deadDrives)
|
||||
// {
|
||||
// this.SessionState.Drive.Remove(deadDrive.Name, true, "local");
|
||||
// }
|
||||
// }
|
||||
// //=======================================================================================================
|
||||
// /// <summary>
|
||||
// ///
|
||||
// /// </summary>
|
||||
// //=======================================================================================================
|
||||
// public void WriteContainers(string configFilePath)
|
||||
// {
|
||||
// List<string> invalidDriveNames = new List<string>();
|
||||
// OSDriveParameters parameters = new OSDriveParameters();
|
||||
if (invalidDriveNames.Count > 0) {
|
||||
ShowNameConflictError(invalidDriveNames);
|
||||
}
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="invalidDriveNames"></param>
|
||||
//=======================================================================================================
|
||||
private void ShowNameConflictError(List<string> invalidDriveNames)
|
||||
{
|
||||
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(" ");
|
||||
|
||||
// // Write out the commands header information first..
|
||||
foreach (string name in invalidDriveNames)
|
||||
{
|
||||
WriteObject(name);
|
||||
WriteObject(" ");
|
||||
}
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
//=======================================================================================================
|
||||
private void WriteObject(string text)
|
||||
{
|
||||
this.Cmdlet.WriteObject(text);
|
||||
}
|
||||
//=======================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=======================================================================================================
|
||||
public 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(" ");
|
||||
|
||||
// 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(" ");
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
// #endregion
|
||||
foreach (OpenStackServiceDefinition service in this.Context.ServiceCatalog.GetServicesInAvailabilityZone(this.Context.CurrentRegion))
|
||||
{
|
||||
this.Cmdlet.WriteObject(service);
|
||||
}
|
||||
WriteObject("");
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
56
Openstack.Client.Powershell/Utility/AvailabilityZone.cs
Normal file
56
Openstack.Client.Powershell/Utility/AvailabilityZone.cs
Normal file
@ -0,0 +1,56 @@
|
||||
/* ============================================================================
|
||||
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.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Openstack.Client.Powershell.Utility
|
||||
{
|
||||
public class AvailabilityZone
|
||||
{
|
||||
private string _name;
|
||||
private bool _isDefault = false;
|
||||
private string _shellForegroundColor = "Green";
|
||||
private string _id;
|
||||
|
||||
public string Id
|
||||
{
|
||||
get { return _id; }
|
||||
set { _id = value; }
|
||||
}
|
||||
|
||||
public string ShellForegroundColor
|
||||
{
|
||||
get { return _shellForegroundColor; }
|
||||
set { _shellForegroundColor = value; }
|
||||
}
|
||||
|
||||
public bool IsDefault
|
||||
{
|
||||
get { return _isDefault; }
|
||||
set { _isDefault = value; }
|
||||
}
|
||||
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return _name; }
|
||||
set { _name = value; }
|
||||
}
|
||||
}
|
||||
}
|
@ -20,9 +20,31 @@ using System.Xml.Linq;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Xml.XPath;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
using System.Xml.Schema;
|
||||
using System.Xml;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
public class ValidationResult
|
||||
{
|
||||
private bool _hasErrors = false;
|
||||
private List<string> _errorList = new List<string>();
|
||||
|
||||
public List<string> Errors
|
||||
{
|
||||
get { return _errorList; }
|
||||
set { _errorList = value; }
|
||||
}
|
||||
|
||||
public bool HasErrors
|
||||
{
|
||||
get { return _hasErrors; }
|
||||
set { _hasErrors = value; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class ConfigurationManager
|
||||
{
|
||||
private bool _isLoaded = false;
|
||||
@ -114,7 +136,7 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
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();
|
||||
XElement serviceProviderNode = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("isDefault").Value == "true").FirstOrDefault();
|
||||
return this.GetServiceProvider(serviceProviderNode.Attribute("name").Value);
|
||||
}
|
||||
//=========================================================================================
|
||||
@ -122,10 +144,102 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
public void Load()
|
||||
private ValidationResult ValidateDocument(XDocument document)
|
||||
{
|
||||
ValidationResult result = new ValidationResult();
|
||||
|
||||
// First we check the structural integrity of the document via XSD..
|
||||
|
||||
//string xsdMarkup = this.GetSchema();
|
||||
//XmlSchemaSet schemas = new XmlSchemaSet();
|
||||
//schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
|
||||
|
||||
//document.Validate(schemas, (o, e) =>
|
||||
//{
|
||||
// result.Errors.Add(e.Message);
|
||||
// result.HasErrors = true;
|
||||
//});
|
||||
|
||||
// Next, ensure that a default Service Provider exist..
|
||||
|
||||
var serviceProviders = this.Document.Descendants("ServiceProvider");
|
||||
bool hasDefaultServiceProvider = serviceProviders.Where(sp => sp.Attributes("isDefault").Single().Value.ToUpper() == "TRUE").Any();
|
||||
if (!hasDefaultServiceProvider) {
|
||||
result.HasErrors = true;
|
||||
result.Errors.Add("No Default Service Provider found.");
|
||||
}
|
||||
|
||||
// Now check that each Service Provider has at least one default AZ.
|
||||
|
||||
foreach (XElement provider in serviceProviders) {
|
||||
if (!provider.Descendants("AvailabilityZones").Descendants().Where(d => d.Attributes("isDefault").Single().Value.ToUpper() == "TRUE").Any()) {
|
||||
result.HasErrors = true;
|
||||
result.Errors.Add("The Service Provider " + provider.Attributes("name").Single().Value + " doesn not have a default Availability Zone/Region");
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure that we only have 1 default Service Provider....
|
||||
|
||||
if (serviceProviders.Where(d => d.Attributes("isDefault").Single().Value.ToUpper() == "TRUE").Count() > 1) {
|
||||
result.HasErrors = true;
|
||||
result.Errors.Add("Only one Service Provider can be marked as the default.");
|
||||
}
|
||||
|
||||
// Check that each Service Provider has a unique Name. (how can we get linqs Distinct to work with XElement when we can't
|
||||
// force that type to implement IComparable<T> ????
|
||||
|
||||
var table = new Hashtable();
|
||||
foreach (XElement provider in serviceProviders)
|
||||
{
|
||||
string name = provider.Attributes("name").Single().Value;
|
||||
try {
|
||||
table.Add(name, String.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result.HasErrors = true;
|
||||
result.Errors.Add("Please ensure that all Service Providers have a unique name assigned to them.");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//=========================================================================================
|
||||
private InvalidDataException CreateLoadException(ValidationResult result)
|
||||
{
|
||||
int count = 0;
|
||||
string msg = "The config file is invalid for the following reasons => ";
|
||||
|
||||
foreach (string message in result.Errors) {
|
||||
msg = msg + message;
|
||||
}
|
||||
return new InvalidDataException(msg);
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//=========================================================================================
|
||||
public void Load(bool requiresValidation = true)
|
||||
{
|
||||
_document = new XDocument(); ;
|
||||
_document = XDocument.Load(this.GetFullConfigPath());
|
||||
ValidationResult result = null;
|
||||
_document = new XDocument(); ;
|
||||
_document = XDocument.Load(this.GetFullConfigPath());
|
||||
|
||||
if (requiresValidation)
|
||||
{
|
||||
result = this.ValidateDocument(_document);
|
||||
|
||||
if (result.HasErrors) {
|
||||
throw this.CreateLoadException(result);
|
||||
}
|
||||
}
|
||||
_isLoaded = true;
|
||||
}
|
||||
//=========================================================================================
|
||||
@ -134,10 +248,21 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
/// </summary>
|
||||
/// <param name="configFilePath"></param>
|
||||
//=========================================================================================
|
||||
public void Load(string configFilePath)
|
||||
{
|
||||
_document = new XDocument();
|
||||
_document = XDocument.Load(configFilePath);
|
||||
public void Load(string configFilePath, bool requiresValidation = true)
|
||||
{
|
||||
ValidationResult result = null;
|
||||
_document = new XDocument();
|
||||
_document = XDocument.Load(configFilePath);
|
||||
|
||||
if (requiresValidation)
|
||||
{
|
||||
result = this.ValidateDocument(_document);
|
||||
|
||||
if (result.HasErrors){
|
||||
throw this.CreateLoadException(result);
|
||||
}
|
||||
}
|
||||
|
||||
_isLoaded = true;
|
||||
}
|
||||
//=========================================================================================
|
||||
@ -161,6 +286,36 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
throw new InvalidOperationException("Unable to locate OpenStack.config file.");
|
||||
}
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="serviceProviderNode"></param>
|
||||
/// <returns></returns>
|
||||
//=========================================================================================
|
||||
private IEnumerable<AvailabilityZone> GetAvailabilityZones(XElement serviceProviderNode)
|
||||
{
|
||||
List<AvailabilityZone> zones = new List<AvailabilityZone>();
|
||||
|
||||
if (serviceProviderNode.HasElements && serviceProviderNode.Element("AvailabilityZones") != null && serviceProviderNode.Element("AvailabilityZones").Descendants().Count() > 0)
|
||||
{
|
||||
foreach (XElement az in serviceProviderNode.Element("AvailabilityZones").Descendants()) {
|
||||
|
||||
AvailabilityZone zone = new AvailabilityZone();
|
||||
zone.Name = az.Attribute("name").Value;
|
||||
zone.ShellForegroundColor = az.Attribute("shellForegroundColor").Value;
|
||||
zone.IsDefault = Convert.ToBoolean(az.Attribute("isDefault").Value);
|
||||
zone.Id = az.Attribute("id").Value;
|
||||
zones.Add(zone);
|
||||
}
|
||||
|
||||
return zones;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
@ -176,45 +331,73 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
var provider = new ServiceProvider();
|
||||
provider.Name = serviceProviderNode.Attribute("name").Value;
|
||||
provider.IsDefault = Convert.ToBoolean(serviceProviderNode.Attribute("isDefault").Value);
|
||||
provider.AvailabilityZones = this.GetAvailabilityZones(serviceProviderNode);
|
||||
provider.ServiceMaps = this.GetServiceMaps(serviceProviderNode);
|
||||
|
||||
// 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
|
||||
{
|
||||
if (xElement.Name == "add")
|
||||
{
|
||||
element.IsMandatory = Convert.ToBoolean(xElement.Attribute("isMandatory").Value);
|
||||
element.DisplayName = xElement.Attribute("displayName").Value;
|
||||
//element.HelpText = xElement.Attribute("helpText").Value;
|
||||
}
|
||||
catch (Exception) { }
|
||||
CredentialElement element = new CredentialElement();
|
||||
element.Key = xElement.Attribute("key").Value;
|
||||
element.Value = xElement.Attribute("value").Value;
|
||||
|
||||
if (element.Key == "ConfigFilePath")
|
||||
{
|
||||
provider.CredentialElements.Add(element);
|
||||
ServiceProvider resolvedProvider = this.ResolveServiceProviderCredentials(provider);
|
||||
resolvedProvider.ConfigFilePath = element.Value;
|
||||
return resolvedProvider;
|
||||
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);
|
||||
}
|
||||
else
|
||||
provider.CredentialElements.Add(element);
|
||||
}
|
||||
}
|
||||
|
||||
return provider;
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="serviceProviderNode"></param>
|
||||
/// <returns></returns>
|
||||
//=========================================================================================
|
||||
private ServiceMaps GetServiceMaps(XElement serviceProviderNode)
|
||||
{
|
||||
ServiceMaps serviceMaps = new ServiceMaps();
|
||||
var serviceMapsDoc = serviceProviderNode.Descendants("ServiceMaps").Descendants("ServiceMap");
|
||||
|
||||
foreach (XElement map in serviceMapsDoc) {
|
||||
|
||||
ServiceMap newMap = new ServiceMap();
|
||||
newMap.Source = map.Attributes("source").Single().Value;
|
||||
newMap.Target = map.Attributes("target").Single().Value;
|
||||
|
||||
serviceMaps.Add(newMap);
|
||||
}
|
||||
return serviceMaps;
|
||||
}
|
||||
//=========================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//=========================================================================================
|
||||
public IEnumerable<ServiceProvider> GetServiceProviders()
|
||||
@ -268,22 +451,40 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
//=========================================================================================
|
||||
public void WriteServiceProvider(ServiceProvider serviceProvider, bool removeInitialServiceProvider = false)
|
||||
{
|
||||
XElement oldServiceProvider = null;
|
||||
|
||||
if (serviceProvider.ConfigFilePath != null)
|
||||
this.Load(serviceProvider.ConfigFilePath);
|
||||
else
|
||||
this.Load();
|
||||
|
||||
XElement availabilityZones = null;
|
||||
XElement serviceMaps = null;
|
||||
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 (this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == serviceProvider.Name).Count() > 0) {
|
||||
oldServiceProvider = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == serviceProvider.Name).Single();
|
||||
}
|
||||
else {
|
||||
oldServiceProvider = this.Document.Descendants("ServiceProvider").Where(sp => sp.Attribute("name").Value == String.Empty).Single();
|
||||
}
|
||||
|
||||
// Preserve contained elements so we can place them back with the new provider..
|
||||
|
||||
availabilityZones = oldServiceProvider.Element("AvailabilityZones");
|
||||
serviceMaps = oldServiceProvider.Element("ServiceMaps");
|
||||
|
||||
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) {
|
||||
@ -291,7 +492,11 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
}
|
||||
|
||||
// Create CredentialElement instances for all Key\Value (Add elements)..
|
||||
|
||||
|
||||
spElement.Add(availabilityZones);
|
||||
spElement.Add(serviceMaps);
|
||||
|
||||
|
||||
foreach (CredentialElement element in serviceProvider.CredentialElements) {
|
||||
spElement.Add(this.CreateAddElement(element));
|
||||
}
|
||||
@ -299,8 +504,107 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
if (removeInitialServiceProvider == true)
|
||||
this.RemoveInitialServiceProvider(ref _document);
|
||||
|
||||
this.Document.XPathSelectElement("configuration/appSettings/IdentityServices").Add(spElement);
|
||||
this.Document.Save(this.GetFullConfigPath());
|
||||
}
|
||||
if (this.Document != null)
|
||||
{
|
||||
this.Document.XPathSelectElement("configuration/appSettings/IdentityServices").Add(spElement);
|
||||
if (serviceProvider.ConfigFilePath == null)
|
||||
this.Document.Save(this.GetFullConfigPath());
|
||||
else
|
||||
this.Document.Save(serviceProvider.ConfigFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetSchema()
|
||||
{
|
||||
return @"<?xml version='1.0' encoding='utf-8'?>
|
||||
<xs:schema attributeFormDefault='unqualified' elementFormDefault='qualified' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
|
||||
<xs:element name='configuration'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name='appSettings'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name='Testing'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element maxOccurs='unbounded' name='add'>
|
||||
<xs:complexType>
|
||||
<xs:attribute name='key' type='xs:string' use='required' />
|
||||
<xs:attribute name='value' type='xs:string' use='required' />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='StorageManagement'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element maxOccurs='unbounded' name='add'>
|
||||
<xs:complexType>
|
||||
<xs:attribute name='key' type='xs:string' use='required' />
|
||||
<xs:attribute name='value' type='xs:string' use='required' />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='IdentityServices'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name='ServiceProvider'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element minOccurs='1' maxOccurs='unbounded' name='add'>
|
||||
<xs:complexType>
|
||||
<xs:attribute name='key' type='xs:string' use='required' />
|
||||
<xs:attribute name='value' type='xs:string' use='required' />
|
||||
<xs:attribute name='displayName' type='xs:string' use='required' />
|
||||
<xs:attribute name='helpText' type='xs:string' use='required' />
|
||||
<xs:attribute name='isMandatory' type='xs:string' use='required' />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='AvailabilityZones'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element minOccurs ='1' maxOccurs='unbounded' name='AvailabilityZone'>
|
||||
<xs:complexType>
|
||||
<xs:attribute name='id' type='xs:unsignedByte' use='required' />
|
||||
<xs:attribute name='isDefault' type='xs:string' use='required' />
|
||||
<xs:attribute name='name' type='xs:string' use='required' />
|
||||
<xs:attribute name='shellForegroundColor' type='xs:string' use='required' />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute name='name' type='xs:string' use='required' />
|
||||
<xs:attribute name='isDefault' type='xs:boolean' use='required' />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='ComputeServices'>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element maxOccurs='unbounded' name='add'>
|
||||
<xs:complexType>
|
||||
<xs:attribute name='key' type='xs:string' use='required' />
|
||||
<xs:attribute name='value' type='xs:string' use='required' />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>";
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,10 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
private string _productName = "OpenstackDotNetAPI";
|
||||
private string _version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
private string _forecolor = "Green";
|
||||
|
||||
private string _currentRegion;
|
||||
private ServiceProvider _currentServiceProvider;
|
||||
|
||||
|
||||
#region Ctors
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
@ -47,6 +50,26 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
public ServiceProvider CurrentServiceProvider
|
||||
{
|
||||
get { return _currentServiceProvider; }
|
||||
set { _currentServiceProvider = value; }
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
public string CurrentRegion
|
||||
{
|
||||
get { return _currentRegion; }
|
||||
set { _currentRegion = value; }
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
public string Version
|
||||
{
|
||||
get { return _version; }
|
||||
|
@ -19,15 +19,16 @@ using OpenStack.Client.Powershell.Utility;
|
||||
using System.Linq;
|
||||
using OpenStack.Identity;
|
||||
using System.Threading;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
public class ExtensionManager
|
||||
{
|
||||
private SessionState _session;
|
||||
private Context _context;
|
||||
private Context _context;
|
||||
|
||||
#region Properties
|
||||
#region Properties
|
||||
public Context Context
|
||||
{
|
||||
get { return _context; }
|
||||
@ -38,19 +39,19 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
get { return _session; }
|
||||
set { _session = value; }
|
||||
}
|
||||
#endregion
|
||||
//==================================================================================================
|
||||
#endregion
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="session"></param>
|
||||
/// <param name="context"></param>
|
||||
//==================================================================================================
|
||||
public ExtensionManager(SessionState session, Context context)
|
||||
{
|
||||
_session = session;
|
||||
_context = context;
|
||||
}
|
||||
public ExtensionManager(SessionState session, Context context)
|
||||
{
|
||||
_session = session;
|
||||
_context = context;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
@ -58,16 +59,18 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
/// <param name="provider"></param>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private Settings GetSettings(ServiceProvider provider)
|
||||
{
|
||||
if (provider.ConfigFilePath == null) {
|
||||
Settings.Default.Reset();
|
||||
return Settings.Default;
|
||||
}
|
||||
else {
|
||||
return Settings.LoadConfig(provider.ConfigFilePath);
|
||||
}
|
||||
}
|
||||
private Settings GetSettings(ServiceProvider provider)
|
||||
{
|
||||
if (provider.ConfigFilePath == null)
|
||||
{
|
||||
Settings.Default.Reset();
|
||||
return Settings.Default;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Settings.LoadConfig(provider.ConfigFilePath);
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
@ -76,42 +79,87 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
/// <param name="context"></param>
|
||||
/// <param name="client"></param>
|
||||
//==================================================================================================
|
||||
private void SetSessionState(IOpenStackCredential credential, IOpenStackClient client, ServiceProvider provider)
|
||||
{
|
||||
// Setup the environment based on what came back from Auth..
|
||||
private void SetSessionState(IOpenStackCredential credential, IOpenStackClient client, ServiceProvider provider)
|
||||
{
|
||||
// Setup the environment based on what came back from Auth..
|
||||
|
||||
Context context = new Context();
|
||||
context.ServiceCatalog = credential.ServiceCatalog;
|
||||
context.Settings = this.GetSettings(provider);
|
||||
context.ProductName = "OpenStack-WinCLI";
|
||||
context.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
Context context = new Context();
|
||||
context.ServiceCatalog = credential.ServiceCatalog;
|
||||
context.Settings = this.GetSettings(provider);
|
||||
context.ProductName = "OpenStack-WinCLI";
|
||||
context.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
context.CurrentServiceProvider = provider;
|
||||
context.CurrentRegion = provider.AvailabilityZones.Where(z => z.IsDefault == true).Single().Name;
|
||||
|
||||
this.Session.PSVariable.Set(new PSVariable("Context", context));
|
||||
this.Session.PSVariable.Set(new PSVariable("CoreClient", client));
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
//==================================================================================================
|
||||
private RegistrationManager GetRegistrationManager(string serviceProviderName)
|
||||
{
|
||||
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||
|
||||
this.Session.PSVariable.Set(new PSVariable("Context", context));
|
||||
this.Session.PSVariable.Set(new PSVariable("CoreClient", client));
|
||||
}
|
||||
// Iterate through all Assemblies in Current AppDomain that contain a RegistrationManager class..
|
||||
|
||||
foreach (Assembly assembly in assemblies)
|
||||
{
|
||||
Type[] types = assembly.GetTypes().Where(b => b != null && b.BaseType != null && b.BaseType.UnderlyingSystemType.FullName == "OpenStack.Client.Powershell.Utility.RegistrationManager").ToArray<Type>();
|
||||
|
||||
// Now that we found one, make sure that it's the one we're looking for..
|
||||
|
||||
foreach (Type type in types)
|
||||
{
|
||||
MemberInfo info = type;
|
||||
foreach (object attribute in info.GetCustomAttributes(true))
|
||||
{
|
||||
ServiceProviderAttribute identifier = attribute as ServiceProviderAttribute;
|
||||
|
||||
if (identifier != null && identifier.Name == serviceProviderName)
|
||||
{
|
||||
var result = (RegistrationManager)Activator.CreateInstance(type, null);
|
||||
if (result == null) {
|
||||
throw new NullReferenceException("Could not create a valid RegistrationManager instance for " + type.FullName);
|
||||
}
|
||||
else
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return new OpenstackCoreRegistrationManager();
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
public void LoadCore(ServiceProvider provider)
|
||||
{
|
||||
OpenstackCoreRegistrationManager manager = new OpenstackCoreRegistrationManager();
|
||||
RegistrationResponse response = manager.Register(provider);
|
||||
|
||||
// Connect to the Service Provider..
|
||||
public void LoadCore(ServiceProvider provider)
|
||||
{
|
||||
OpenstackCoreRegistrationManager manager = new OpenstackCoreRegistrationManager();
|
||||
RegistrationResponse response = manager.Register(provider);
|
||||
|
||||
|
||||
var client = OpenStackClientFactory.CreateClient<OpenStackClient>(response.Credentials, CancellationToken.None, null);
|
||||
var connectTask = client.Connect();
|
||||
connectTask.Wait();
|
||||
// Setup our shared Cancellation Token Source so that Cmdlets \ Users can abort long running operations..
|
||||
|
||||
this.SetSessionState(response.Credentials, client, provider);
|
||||
CancellationTokenSource source = new CancellationTokenSource();
|
||||
CancellationToken token = source.Token;
|
||||
this.Session.PSVariable.Set(new PSVariable("CancellationTokenSource", source));
|
||||
|
||||
ConfigurationManager configManager = new ConfigurationManager();
|
||||
configManager.WriteServiceProvider(response.Provider, true);
|
||||
}
|
||||
// Connect to the Service Provider..
|
||||
|
||||
var client = OpenStackClientFactory.CreateClient<OpenStackClient>(response.Credentials, token, String.Empty);
|
||||
var connectTask = client.Connect();
|
||||
connectTask.Wait();
|
||||
|
||||
this.SetSessionState(response.Credentials, client, provider);
|
||||
|
||||
ConfigurationManager configManager = new ConfigurationManager();
|
||||
configManager.WriteServiceProvider(response.Provider, true);
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
@ -119,45 +167,47 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
//==================================================================================================
|
||||
public void LoadExtension(ServiceProvider targetProvider)
|
||||
{
|
||||
string moduleName = targetProvider.Name;
|
||||
AppDomain currentDomain = AppDomain.CurrentDomain;
|
||||
Evidence asEvidence = currentDomain.Evidence;
|
||||
|
||||
string moduleName = targetProvider.Name;
|
||||
AppDomain currentDomain = AppDomain.CurrentDomain;
|
||||
Evidence asEvidence = currentDomain.Evidence;
|
||||
IOpenStackClient client = null;
|
||||
IOpenStackCredential credential = null;
|
||||
|
||||
// Load up the default config file..
|
||||
|
||||
ConfigurationManager configManager = new ConfigurationManager();
|
||||
configManager.Load();
|
||||
configManager.Load(false);
|
||||
|
||||
// Load the specified module. We take a before and after snapshot of assemblies loaded in the current AppDomain.
|
||||
// The targetList represents only what's been added...
|
||||
// Load the specified module into the Current AppDomain...
|
||||
|
||||
Assembly[] originalList = currentDomain.GetAssemblies();
|
||||
this.Session.InvokeCommand.InvokeScript("Import-Module " + moduleName + " -DisableNameChecking");
|
||||
Assembly[] modifiedList = currentDomain.GetAssemblies();
|
||||
var targetList = modifiedList.Except(originalList);
|
||||
|
||||
foreach (Assembly assembly in targetList)
|
||||
{
|
||||
// Grab a Type instance for the first occurrence of a subtyped RegistrationManager. Create a new instance from that System.Type so that we can
|
||||
// let them supply the IOpenStackCredential instance...
|
||||
// Register the Module if it isn't already and grab the resulting credentials for Auth..
|
||||
|
||||
Type registrationManagerType = assembly.GetTypes().Where(b => b.BaseType.UnderlyingSystemType.FullName == "OpenStack.Client.Powershell.Utility.RegistrationManager").First();
|
||||
RegistrationManager manager = (RegistrationManager)Activator.CreateInstance(registrationManagerType, null);
|
||||
RegistrationResponse response = manager.Register(configManager.GetServiceProvider(moduleName));
|
||||
IOpenStackCredential credential = response.Credentials;
|
||||
|
||||
// Create our Extension Client and stash it....
|
||||
RegistrationManager manager = this.GetRegistrationManager(moduleName);
|
||||
RegistrationResponse response = manager.Register(configManager.GetServiceProvider(moduleName));
|
||||
credential = response.Credentials;
|
||||
|
||||
// Setup our shared Cancellation Token Source so that Cmdlets \ Users can abort long running operations..
|
||||
|
||||
var client = OpenStackClientFactory.CreateClient<OpenStackClient>(credential);
|
||||
var connectTask = client.Connect();
|
||||
connectTask.Wait();
|
||||
CancellationTokenSource source = new CancellationTokenSource();
|
||||
CancellationToken token = source.Token;
|
||||
this.Session.PSVariable.Set(new PSVariable("CancellationTokenSource", source));
|
||||
|
||||
// Save the credentials ..
|
||||
// Authenticate and create our Extension Client and stash it....
|
||||
|
||||
|
||||
configManager.WriteServiceProvider(response.Provider);
|
||||
client = OpenStackClientFactory.CreateClient<OpenStackClient>(credential, token, String.Empty);
|
||||
var connectTask = client.Connect();
|
||||
connectTask.Wait();
|
||||
|
||||
// Store Context and Client so that all PS-Providers and Cmdlets have access to it..
|
||||
// Save the credentials if there are any changes (The RegistrationManager may have prompted for missing Credentials)
|
||||
|
||||
configManager.WriteServiceProvider(response.Provider);
|
||||
|
||||
this.SetSessionState(credential, client, targetProvider);
|
||||
}
|
||||
// Store Context and Client so that all PS-Providers and Cmdlets have access to it..
|
||||
|
||||
this.SetSessionState(credential, client, targetProvider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,11 +19,13 @@ using System.Linq;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using OpenStack.Identity;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
{
|
||||
[ServiceProviderAttribute("Default")]
|
||||
public class OpenstackCoreRegistrationManager : RegistrationManager
|
||||
{
|
||||
public override RegistrationResponse Register(ServiceProvider serviceProvider)
|
||||
|
@ -64,13 +64,72 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private string ReadPassword()
|
||||
{
|
||||
string password = "";
|
||||
ConsoleKeyInfo info = Console.ReadKey(true);
|
||||
|
||||
while (info.Key != ConsoleKey.Enter)
|
||||
{
|
||||
if (info.Key != ConsoleKey.Backspace)
|
||||
{
|
||||
Console.Write("*");
|
||||
password += info.KeyChar;
|
||||
}
|
||||
|
||||
else if (info.Key == ConsoleKey.Backspace)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(password))
|
||||
{
|
||||
// remove one character from the list of password characters
|
||||
|
||||
password = password.Substring(0, password.Length - 1);
|
||||
|
||||
// get the location of the cursor
|
||||
|
||||
int pos = Console.CursorLeft;
|
||||
|
||||
// move the cursor to the left by one character
|
||||
|
||||
Console.SetCursorPosition(pos - 1, Console.CursorTop);
|
||||
|
||||
// replace it with space
|
||||
|
||||
Console.Write(" ");
|
||||
|
||||
// move the cursor to the left by one character again
|
||||
|
||||
Console.SetCursorPosition(pos - 1, Console.CursorTop);
|
||||
}
|
||||
}
|
||||
info = Console.ReadKey(true);
|
||||
}
|
||||
|
||||
// add a new line because user pressed enter at the end of their password
|
||||
|
||||
Console.WriteLine();
|
||||
return password;
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//==================================================================================================
|
||||
private string PromptForCredentialElement(CredentialElement element)
|
||||
{
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine(element.DisplayName + " :");
|
||||
Console.WriteLine("");
|
||||
return Console.ReadLine();
|
||||
if (element.DisplayName.ToLower() == "password")
|
||||
{
|
||||
return this.ReadPassword();
|
||||
}
|
||||
else
|
||||
{
|
||||
return Console.ReadLine();
|
||||
}
|
||||
}
|
||||
//==================================================================================================
|
||||
/// <summary>
|
||||
|
38
Openstack.Client.Powershell/Utility/ServiceMap.cs
Normal file
38
Openstack.Client.Powershell/Utility/ServiceMap.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Openstack.Client.Powershell.Utility
|
||||
{
|
||||
|
||||
public enum CoreServices
|
||||
{
|
||||
Identity,
|
||||
ObjectStorage,
|
||||
ImageManagement,
|
||||
BlockStorage,
|
||||
Compute
|
||||
}
|
||||
|
||||
|
||||
public class ServiceMap
|
||||
{
|
||||
private string _source;
|
||||
private string _target;
|
||||
|
||||
public string Target
|
||||
{
|
||||
get { return _target; }
|
||||
set { _target = value; }
|
||||
}
|
||||
|
||||
public string Source
|
||||
{
|
||||
get { return _source; }
|
||||
set { _source = value; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -18,9 +18,27 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
|
||||
namespace OpenStack.Client.Powershell.Utility
|
||||
{
|
||||
|
||||
|
||||
public class ServiceMaps : List<ServiceMap>
|
||||
{
|
||||
|
||||
//public string TranslateServiceName(string serviceContract)
|
||||
//{
|
||||
// return this.Where(n => n.Source == serviceContract).Single().Target;
|
||||
//}
|
||||
|
||||
public string TranslateServiceName(CoreServices service)
|
||||
{
|
||||
return this.Where(n => n.Source == service.ToString()).Single().Target;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class ServiceProvider
|
||||
{
|
||||
private string _name;
|
||||
@ -30,6 +48,20 @@ namespace OpenStack.Client.Powershell.Utility
|
||||
private bool _isDirty = false;
|
||||
private List<CredentialElement> _credentialElements = new List<CredentialElement>();
|
||||
private string _configFilePath;
|
||||
private IEnumerable<AvailabilityZone> _availabilityZones;
|
||||
private ServiceMaps _serviceMaps;
|
||||
|
||||
public ServiceMaps ServiceMaps
|
||||
{
|
||||
get { return _serviceMaps; }
|
||||
set { _serviceMaps = value; }
|
||||
}
|
||||
|
||||
public IEnumerable<AvailabilityZone> AvailabilityZones
|
||||
{
|
||||
get { return _availabilityZones; }
|
||||
set { _availabilityZones = value; }
|
||||
}
|
||||
|
||||
public string ConfigFilePath
|
||||
{
|
||||
|
@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Openstack.Client.Powershell.Utility
|
||||
{
|
||||
public class ServiceProviderAttribute : Attribute
|
||||
{
|
||||
private string _name;
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return _name; }
|
||||
set { _name = value; }
|
||||
}
|
||||
|
||||
public ServiceProviderAttribute(string name)
|
||||
{
|
||||
_name = name;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<section name="OpenStack.Client.Powershell.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
||||
<section name="OpenStack.Client.Powershell.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<userSettings>
|
||||
@ -12,4 +12,13 @@
|
||||
</setting>
|
||||
</OpenStack.Client.Powershell.Properties.Settings>
|
||||
</userSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
Binary file not shown.
@ -1,52 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<Testing>
|
||||
<add key="TestServerName" value="TestServer" />
|
||||
<add key="TestNetworkName" value="TestNetwork" />
|
||||
<add key="TestPortName" value="TestPort" />
|
||||
<add key="TestRouterName" value="TestRouter" />
|
||||
<add key="TestSecurityGroupName" value="TestSecurityGroup" />
|
||||
<add key="TestSnapshotName" value="TestSnapshot" />
|
||||
<add key="TestStorageContainerName" value="TestContainer" />
|
||||
<add key="TestSubnetName" value="TestSubnet" />
|
||||
<add key="TestVolumeName" value="TestVolume" />
|
||||
<add key="TestFilePath" value="e:\Projects\Testing\Anothertest.txt" />
|
||||
<add key="TestStorageContainerSecondaryName" value="b10" />
|
||||
<add key="LocalTestDirectory" value="e:\Projects\Testing\" />
|
||||
<add key="TestImageId" value="5a1408cb-25f2-43a6-b1d9-931f5e47c871" />
|
||||
<add key="TestFlavorId" value="100" />
|
||||
</Testing>
|
||||
<StorageManagement>
|
||||
<add key="largeFileSize" value="314572800" />
|
||||
<add key="defSegmentNumber" value="16" />
|
||||
<add key="MaxSegmentCopyRetries" value="3" />
|
||||
<add key="UseCleanLargeFileCopies" value="false" />
|
||||
<add key="delimiter" value="/" />
|
||||
<add key="max-keys" value="10000" />
|
||||
<add key="HttpTimeoutInterval" value="9200000" />
|
||||
<add key="PasteGetURIResultsToClipboard" value="true" />
|
||||
<add key="ReleaseNotesURI" value="https://region-a.geo-1.objects.hpcloudsvc.com/v1/AUTH_2485a207-71a4-4429-9e24-f7bf49e207fc/Builds/ReleaseManifest.xml" />
|
||||
<add key="NewReleaseFolder" value="e:\" />
|
||||
<SharedContainers>
|
||||
</SharedContainers>
|
||||
</StorageManagement>
|
||||
<IdentityServices>
|
||||
<!--Pro-->
|
||||
<add key="AuthenticationServiceURI" value="https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens" />
|
||||
<add key="Username" value="" />
|
||||
<add key="Password" value="" />
|
||||
<add key="DefaultTenantId" value="" />
|
||||
</IdentityServices>
|
||||
<ComputeServices>
|
||||
<add key="LogReadAttemptsMax" value="20" />
|
||||
<add key="LogReadAttemptIntervalInMilliSeconds" value="40000" />
|
||||
<add key="EnableCredentialTracking" value="true" />
|
||||
<add key="SSHClientPath" value="C:\Users\tplummer\Desktop\Utilities\Putty.exe" />
|
||||
</ComputeServices>
|
||||
<AvailabilityZones>
|
||||
<AvailabilityZone id="1" isDefault="True" name="region-a.geo-1" shellForegroundColor="Green" />
|
||||
<AvailabilityZone id="2" isDefault="False" name="region-b.geo-1" shellForegroundColor="Green" />
|
||||
</AvailabilityZones>
|
||||
</appSettings>
|
||||
</configuration>
|
@ -1,81 +0,0 @@
|
||||
# ---------------------------------------------------------------
|
||||
# Set up support methods first..
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
function is64bit() {
|
||||
return ([IntPtr]::Size -eq 8)
|
||||
}
|
||||
|
||||
function get-programfilesdir() {
|
||||
if (is64bit -eq $true) {
|
||||
(Get-Item "Env:ProgramFiles(x86)").Value
|
||||
}
|
||||
else {
|
||||
(Get-Item "Env:ProgramFiles").Value
|
||||
}
|
||||
}
|
||||
# ---------------------------------------------------------------
|
||||
# Set up the default windows size and color....
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
#$DebugPreference=$VerbosePreference="Continue"
|
||||
#$DebugPreference = "Continue"
|
||||
$a = (Get-Host).UI.RawUI
|
||||
$b = $a.WindowSize
|
||||
$b.Width = 109
|
||||
$b.Height = 61
|
||||
$a.WindowSize = $b
|
||||
$a.BackgroundColor = "black"
|
||||
$a.ForegroundColor = "green"
|
||||
|
||||
cls
|
||||
# ---------------------------------------------------------------
|
||||
# Register known providers, write out welcome and status messages..
|
||||
# -----------------------------------------------------------------
|
||||
|
||||
$a.BackgroundColor = "black"
|
||||
Echo ''
|
||||
$a.ForegroundColor = "gray"
|
||||
Echo '========================================================================================'
|
||||
$a.ForegroundColor = "yellow"
|
||||
Echo 'Welcome to the OpenStack Powershell Environment.'
|
||||
$a.ForegroundColor = "gray"
|
||||
Echo '========================================================================================'
|
||||
Echo ''
|
||||
$a.ForegroundColor = "green"
|
||||
echo ' ==> Registering Providers...'
|
||||
|
||||
$tempvar = get-programfilesdir
|
||||
$tempvar = $tempvar + "\Openstack\OpenStack-Powershell"
|
||||
cd $tempvar
|
||||
import-module .\CLIManifest.psd1 -DisableNameChecking
|
||||
|
||||
echo ' ==> Applying Command Aliases...'
|
||||
echo ' ==> Registering Views...'
|
||||
echo ''
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Reset Shell to default colors..
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
$a.ForegroundColor = "yellow"
|
||||
echo 'Ready..'
|
||||
$a.ForegroundColor = "green"
|
||||
echo ''
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,58 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<Testing>
|
||||
<add key="TestServerName" value="TestServer" />
|
||||
<add key="TestNetworkName" value="TestNetwork" />
|
||||
<add key="TestPortName" value="TestPort" />
|
||||
<add key="TestRouterName" value="TestRouter" />
|
||||
<add key="TestSecurityGroupName" value="TestSecurityGroup" />
|
||||
<add key="TestSnapshotName" value="TestSnapshot" />
|
||||
<add key="TestStorageContainerName" value="TestContainer" />
|
||||
<add key="TestSubnetName" value="TestSubnet" />
|
||||
<add key="TestVolumeName" value="TestVolume" />
|
||||
<add key="TestFilePath" value="e:\Projects\Testing\Anothertest.txt" />
|
||||
<add key="TestStorageContainerSecondaryName" value="b10" />
|
||||
<add key="LocalTestDirectory" value="e:\Projects\Testing\" />
|
||||
<add key="TestImageId" value="5a1408cb-25f2-43a6-b1d9-931f5e47c871" />
|
||||
<add key="TestFlavorId" value="100" />
|
||||
</Testing>
|
||||
<StorageManagement>
|
||||
<add key="largeFileSize" value="314572800" />
|
||||
<add key="defSegmentNumber" value="16" />
|
||||
<add key="MaxSegmentCopyRetries" value="3" />
|
||||
<add key="UseCleanLargeFileCopies" value="false" />
|
||||
<add key="delimiter" value="/" />
|
||||
<add key="max-keys" value="10000" />
|
||||
<add key="HttpTimeoutInterval" value="9200000" />
|
||||
<add key="PasteGetURIResultsToClipboard" value="true" />
|
||||
<add key="ReleaseNotesURI" value="https://region-a.geo-1.objects.hpcloudsvc.com/v1/AUTH_2485a207-71a4-4429-9e24-f7bf49e207fc/Builds/ReleaseManifest.xml" />
|
||||
<add key="NewReleaseFolder" value="e:\" />
|
||||
<SharedContainers></SharedContainers>
|
||||
</StorageManagement>
|
||||
<IdentityServices>
|
||||
<ServiceProvider name="HP" isDefault="True">
|
||||
<add key="AuthenticationServiceURI" value="https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens" />
|
||||
<add key="Username" value="Travis.Plummer@hp.com" />
|
||||
<add key="Password" value="NoRemorseGlock27" />
|
||||
<add key="DefaultTenantId" value="Travis.Plummer@hp.com" />
|
||||
</ServiceProvider>
|
||||
<ServiceProvider name="Rackspace" isDefault="False">
|
||||
<add key="AuthenticationServiceURI" value="https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens" />
|
||||
<add key="Username" value="Travis.Plummer@hp.com" />
|
||||
<add key="Password" value="NoRemorseGlock27" />
|
||||
<add key="DefaultTenantId" value="Travis.Plummer@hp.com" />
|
||||
</ServiceProvider>
|
||||
</IdentityServices>
|
||||
<ComputeServices>
|
||||
<add key="LogReadAttemptsMax" value="20" />
|
||||
<add key="LogReadAttemptIntervalInMilliSeconds" value="40000" />
|
||||
<add key="EnableCredentialTracking" value="true" />
|
||||
<add key="SSHClientPath" value="C:\Users\tplummer\Desktop\Utilities\Putty.exe" />
|
||||
</ComputeServices>
|
||||
<AvailabilityZones>
|
||||
<AvailabilityZone id="1" isDefault="True" name="region-a.geo-1" shellForegroundColor="Green" />
|
||||
<AvailabilityZone id="2" isDefault="False" name="region-b.geo-1" shellForegroundColor="Green" />
|
||||
</AvailabilityZones>
|
||||
</appSettings>
|
||||
</configuration>
|
@ -1,21 +0,0 @@
|
||||
@{
|
||||
ModuleToProcess = 'Openstack.Client.Powershell.dll'
|
||||
GUID="{847a28a4-6407-4aa6-8070-a4a51396db70}"
|
||||
Author="Travis Plummer"
|
||||
CompanyName="Hewlett-Packard Corporation"
|
||||
Copyright="© Hewlett-Packard. All rights reserved."
|
||||
ModuleVersion="1.0.0.0"
|
||||
PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FormatsToProcess="OpenstackShell.format.ps1xml"
|
||||
FileList='Openstack.config'
|
||||
RequiredAssemblies = 'Openstack.dll', 'Openstack.Common.dll'
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,47 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ReleaseManifest>
|
||||
<Release version="1.3.2.7" IsCurrentRelease="True" InstallPath="Builds:\1-3-2-7\WinCLI1.3.2.7.zip">
|
||||
<Notes>
|
||||
New Features
|
||||
* Easier Zone management with Set-Zone and Get-Zones
|
||||
</Notes>
|
||||
</Release>
|
||||
<Release version="1.3.0.2">
|
||||
<Notes>
|
||||
|
||||
New Features
|
||||
* Easier Zone management with Set-Zone and Get-Zones
|
||||
</Notes>
|
||||
</Release>
|
||||
<Release version="1.3.0.2">
|
||||
<Notes>
|
||||
|
||||
New Features
|
||||
* Easier Zone management with Set-Zone and Get-Zones
|
||||
</Notes>
|
||||
</Release>
|
||||
<Release version="1.3.0.1">
|
||||
<Notes>
|
||||
|
||||
New Features
|
||||
* Support for listing, adding, attaching, detaching and removing block volumes
|
||||
* Support for creating and removing block storage snapshots
|
||||
</Notes>
|
||||
</Release>
|
||||
<Release version="1.2.0.6">
|
||||
<Notes>
|
||||
|
||||
New Features
|
||||
* Migrate-Drive support for migrating full data sets from external sources
|
||||
</Notes>
|
||||
</Release>
|
||||
<Release version="1.2.0.1">
|
||||
<Notes>
|
||||
|
||||
New Features
|
||||
* Full access to the OpenStack compute infrastructure
|
||||
* CDN support
|
||||
</Notes>
|
||||
</Release>
|
||||
|
||||
</ReleaseManifest>
|
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
||||
@{
|
||||
ModuleToProcess = 'Openstack.Client.Powershell.dll'
|
||||
GUID="{847a28a4-6407-4aa6-8070-a4a51396db70}"
|
||||
Author="Travis Plummer"
|
||||
CompanyName="Hewlett-Packard Corporation"
|
||||
Copyright="© Hewlett-Packard. All rights reserved."
|
||||
ModuleVersion="1.0.0.0"
|
||||
PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FormatsToProcess="OpenstackShell.format.ps1xml"
|
||||
FileList='Openstack.config'
|
||||
RequiredAssemblies = 'Openstack.dll', 'Openstack.Common.dll'
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,51 +0,0 @@
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\Aliases.txt
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\ScratchPad\AnotherTest.txt
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\CLI.config
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\CLI.config.example
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\OpenstackShell.format.ps1xml
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\Microsoft.PowerShell_profile.ps1
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\CLIManifest.psd1
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Deployment\ReleaseNotes.xml
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Client.Powershell.dll.config
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Client.Powershell.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Client.Powershell.pdb
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\AWSSDK.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Common.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Objects.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\System.Net.Http.Formatting.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Newtonsoft.Json.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Common.pdb
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Openstack.Objects.pdb
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\AWSSDK.pdb
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\System.Net.Http.Formatting.xml
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.csprojResolveAssemblyReference.cache
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.g.resources
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.dll
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.pdb
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\BouncyCastle.Crypto.pdb
|
||||
C:\Users\tplummer\Source\Repos\OpenStack-CLI\Openstack.Client.Powershell\bin\Release\Newtonsoft.Json.xml
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.csprojResolveAssemblyReference.cache
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.g.resources
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\obj\Debug\Openstack.Client.Powershell.pdb
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\Aliases.txt
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\ScratchPad\AnotherTest.txt
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\CLI.config
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\CLI.config.example
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\OpenstackShell.format.ps1xml
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\Microsoft.PowerShell_profile.ps1
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\CLIManifest.psd1
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Deployment\ReleaseNotes.xml
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.Client.Powershell.dll.config
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.Client.Powershell.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.Client.Powershell.pdb
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\AWSSDK.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Newtonsoft.Json.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.Common.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\System.Net.Http.Formatting.dll
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.Common.pdb
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Openstack.pdb
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\AWSSDK.pdb
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\Newtonsoft.Json.xml
|
||||
C:\Users\tplummer\Source\Repos\Openstack-NewCLI\Openstack.Client.Powershell\bin\Release\System.Net.Http.Formatting.xml
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -2,5 +2,9 @@
|
||||
<packages>
|
||||
<package id="AWSSDK" version="2.0.11.0" targetFramework="net45" />
|
||||
<package id="BouncyCastle" version="1.7.0" targetFramework="net40" />
|
||||
<package id="Newtonsoft.Json" version="4.5.7" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl" version="1.1.9" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="6.0.2" targetFramework="net45" />
|
||||
<package id="OpenStack-SDK-DotNet" version="0.9.0.0" targetFramework="net45" />
|
||||
</packages>
|
@ -5,7 +5,7 @@
|
||||
<add key="TestServerName" value="TestServer" />
|
||||
<add key="TestNetworkName" value="TestNetwork" />
|
||||
<add key="TestPortName" value="TestPort" />
|
||||
<add key="TestRouterName" value="TestRouter" />
|
||||
<add key="TestRouterName" value="TestRouterOO" />
|
||||
<add key="TestSecurityGroupName" value="TestSecurityGroup" />
|
||||
<add key="TestSnapshotName" value="TestSnapshot" />
|
||||
<add key="TestStorageContainerName" value="TestContainer" />
|
||||
@ -32,10 +32,14 @@
|
||||
</StorageManagement>
|
||||
<IdentityServices>
|
||||
<ServiceProvider name="Rackspace" isDefault="true">
|
||||
<add key="AuthenticationServiceURI" value="https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens" displayName="Authentication Service URI" isMandatory="true" />
|
||||
<add key="Username" value="" displayName="User name" isMandatory="true" />
|
||||
<add key="Password" value="" displayName="Password" isMandatory="true" />
|
||||
<add key="DefaultTenantId" value="" displayName="Default Tenant Id" isMandatory="true" />
|
||||
<AvailabilityZones>
|
||||
<AvailabilityZone id="1" isDefault="True" name="Rregion-a.geo-1" shellForegroundColor="Green" />
|
||||
<AvailabilityZone id="2" isDefault="False" name="Rregion-b.geo-1" shellForegroundColor="Green" />
|
||||
</AvailabilityZones>
|
||||
<add key="AuthenticationServiceURI" value="" displayName="Authentication Service URI" isMandatory="true" />
|
||||
<add key="Username" value="" displayName="User name" isMandatory="true" />
|
||||
<add key="Password" value="" displayName="Password" isMandatory="true" />
|
||||
<add key="DefaultTenantId" value="" displayName="Default Tenant Id" isMandatory="true" />
|
||||
</ServiceProvider>
|
||||
</IdentityServices>
|
||||
<ComputeServices>
|
||||
@ -44,9 +48,9 @@
|
||||
<add key="EnableCredentialTracking" value="true" />
|
||||
<add key="SSHClientPath" value="C:\Users\tplummer\Desktop\Utilities\Putty.exe" />
|
||||
</ComputeServices>
|
||||
<AvailabilityZones>
|
||||
<!--<AvailabilityZones>
|
||||
<AvailabilityZone id="1" isDefault="True" name="region-a.geo-1" shellForegroundColor="Green" />
|
||||
<AvailabilityZone id="2" isDefault="False" name="region-b.geo-1" shellForegroundColor="Green" />
|
||||
</AvailabilityZones>
|
||||
</AvailabilityZones>-->
|
||||
</appSettings>
|
||||
</configuration>
|
@ -8,7 +8,7 @@ ModuleVersion="1.0.0.0"
|
||||
PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FileList=''
|
||||
RequiredAssemblies = 'OpenStack.dll', 'OpenStack.Common.dll'
|
||||
RequiredAssemblies = 'OpenStack.dll'
|
||||
}
|
||||
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\..\Documents\WindowsPowerShell\Modules\Openstack\Rackspace\</OutputPath>
|
||||
<OutputPath>..\..\..\..\..\Documents\WindowsPowerShell\Modules\Openstack\Rackspace\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@ -32,6 +32,14 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="OpenStack, Version=0.9.1.0, Culture=neutral, PublicKeyToken=baf191d8aca7391c, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\OpenStack-SDK-DotNet.0.9.1.0\lib\net40\OpenStack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Management" />
|
||||
@ -39,6 +47,14 @@
|
||||
<Private>True</Private>
|
||||
<HintPath>..\packages\System.Management.Automation.6.1.7601.17515\lib\net45\System.Management.Automation.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Primitives">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Primitives.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
@ -51,6 +67,7 @@
|
||||
<Compile Include="Utility\RackspaceRegistrationManager.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="Deployment\Rackspace.config">
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
@ -61,10 +78,6 @@
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\openstack-sdk-dotnet\Openstack\Openstack\Openstack.csproj">
|
||||
<Project>{b2c92371-b62b-45a2-adeb-edebefa3a75c}</Project>
|
||||
<Name>Openstack</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Openstack.Client.Powershell\Openstack.Client.Powershell.csproj">
|
||||
<Project>{32bac168-2ec8-4074-9e6d-8c13460dcfad}</Project>
|
||||
<Name>Openstack.Client.Powershell</Name>
|
||||
@ -73,8 +86,13 @@
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy .\Deployment\Rackspace.psd1 C:\Users\tplummer\Documents\WindowsPowerShell\Modules\Openstack\Rackspace</PostBuildEvent>
|
||||
<PostBuildEvent>copy .\Deployment\Rackspace.psd1 C:\Users\tplummer\Documents\WindowsPowerShell\Modules\Openstack\Rackspace\Rackspace.psd1</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
|
||||
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
|
||||
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
|
||||
<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
|
||||
</Target>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
|
@ -4,12 +4,13 @@ using System.Linq;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Openstack.Client.Powershell.Utility;
|
||||
using OpenStack.Client.Powershell.Utility;
|
||||
using OpenStack.Identity;
|
||||
|
||||
namespace Rackspace.Client.Powershell.Utility
|
||||
{
|
||||
|
||||
[ServiceProviderAttribute("Rackspace")]
|
||||
public class RackspaceRegistrationManager : RegistrationManager
|
||||
{
|
||||
public override RegistrationResponse Register(ServiceProvider serviceProvider)
|
||||
|
@ -1,20 +0,0 @@
|
||||
@{
|
||||
ModuleToProcess = 'Rackspace.Openstack.Client.Powershell.dll'
|
||||
GUID="{847a28a4-6407-4aa6-8070-a4a51396db70}"
|
||||
Author="Sam"
|
||||
CompanyName="Rackspace Corporation"
|
||||
Copyright="© Rackspace. All rights reserved."
|
||||
ModuleVersion="1.0.0.0"
|
||||
PowerShellVersion="2.0"
|
||||
CLRVersion="4.0.30319"
|
||||
FormatsToProcess=""
|
||||
FileList=''
|
||||
RequiredAssemblies = 'Openstack.dll', 'Openstack.Common.dll'
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
8
Rackspace.Client.Powershell/packages.config
Normal file
8
Rackspace.Client.Powershell/packages.config
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Bcl" version="1.1.9" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="6.0.2" targetFramework="net45" />
|
||||
<package id="OpenStack-SDK-DotNet" version="0.9.0.0" targetFramework="net45" />
|
||||
</packages>
|
Loading…
Reference in New Issue
Block a user