Skip to content

Commit

Permalink
Implemented set-azuresubscription, updated AzureRT tests that needed it
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Tavares committed Sep 26, 2013
1 parent 296480e commit b07e44b
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 150 deletions.
Expand Up @@ -18,6 +18,13 @@ namespace Microsoft.WindowsAzure.Commands.ServiceManagement.Test.FunctionalTests

public class SelectAzureSubscriptionCmdletInfo : CmdletsInfo
{
public SelectAzureSubscriptionCmdletInfo(string subscriptionName)
{
cmdletName = "Select-AzureSubscription";
cmdletParams.Add(new CmdletParam("SubscriptionName", subscriptionName));
cmdletParams.Add(new CmdletParam("Default"));
}

public SelectAzureSubscriptionCmdletInfo(string subscriptionName, bool clear, string subscriptionDataFile)
{
cmdletName = "Select-AzureSubscription";
Expand Down
Expand Up @@ -690,8 +690,8 @@ public SubscriptionData SetAzureSubscription(string subscriptionName, string cur

public SubscriptionData SetDefaultAzureSubscription(string subscriptionName)
{
SetAzureSubscriptionCmdletInfo setAzureSubscriptionCmdlet = new SetAzureSubscriptionCmdletInfo(subscriptionName);
WindowsAzurePowershellCmdlet azurePowershellCmdlet = new WindowsAzurePowershellCmdlet(setAzureSubscriptionCmdlet);
SelectAzureSubscriptionCmdletInfo selectAzureSubscriptionCmdlet = new SelectAzureSubscriptionCmdletInfo(subscriptionName);
WindowsAzurePowershellCmdlet azurePowershellCmdlet = new WindowsAzurePowershellCmdlet(selectAzureSubscriptionCmdlet);
azurePowershellCmdlet.Run();

Collection<SubscriptionData> subscriptions = GetAzureSubscription();
Expand Down Expand Up @@ -1272,8 +1272,7 @@ public void RemoveAzureSubscriptions()
// Check if all subscriptions are removed.
try
{
GetAzureSubscription();
Assert.Fail("Subscription was not removed!");
Assert.AreEqual(0, GetAzureSubscription().Count, "Subscription was not removed");
}
catch (Exception e)
{
Expand Down
Expand Up @@ -200,6 +200,24 @@ public WindowsAzureSubscription DefaultSubscription
get { return subscriptions.FirstOrDefault(s => s.IsDefault); }
}

public void AddSubscription(WindowsAzureSubscription s)
{
if (subscriptions.Contains(s) ||
subscriptions.Any(es => string.Compare(s.Name, s.Name, StringComparison.OrdinalIgnoreCase) == 0))
{
throw new ArgumentException(
string.Format(Resources.SubscriptionAlreadyExists, s.Name));
}

subscriptions.Add(s);
if (s.IsDefault)
{
UpdateDefaultSubscription(s);
}

Save();
}

public void RemoveSubscription(WindowsAzureSubscription s)
{
if (s == currentSubscription)
Expand Down Expand Up @@ -228,15 +246,20 @@ public void UpdateSubscription(WindowsAzureSubscription s)

if (s.IsDefault)
{
foreach (var subs in subscriptions.Where(s2 => s2 != s))
{
subs.IsDefault = false;
}
UpdateDefaultSubscription(s);
}

Save();
}

private void UpdateDefaultSubscription(WindowsAzureSubscription newDefault)
{
foreach (var subs in subscriptions.Where(s => s != newDefault))
{
subs.IsDefault = false;
}
}

public void ImportPublishSettings(string fileName)
{
using (var s = new FileStream(fileName, FileMode.Open, FileAccess.Read))
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Expand Up @@ -1328,4 +1328,7 @@ Please follow these steps in the portal:
<data name="InvalidManagementClientType" xml:space="preserve">
<value>Cannot create instance of management client type {0}. It does not have the expected constructor.</value>
</data>
<data name="SubscriptionAlreadyExists" xml:space="preserve">
<value>The subscription named {0} already exists.</value>
</data>
</root>
203 changes: 62 additions & 141 deletions WindowsAzurePowershell/src/Commands/Subscription/SetAzureSubscription.cs
Expand Up @@ -15,17 +15,16 @@
namespace Microsoft.WindowsAzure.Commands.Subscription
{
using System;
using System.IO;
using System.Linq;
using System.Management.Automation;
using System.Security.Cryptography.X509Certificates;
using Commands.Utilities.Common;
using Microsoft.WindowsAzure.Commands.Utilities.Properties;
using Utilities.Common;

/// <summary>
/// Sets an azure subscription.
/// </summary>
[Cmdlet(VerbsCommon.Set, "AzureSubscription", DefaultParameterSetName = "CommonSettings"), OutputType(typeof(bool))]
public class SetAzureSubscriptionCommand : PSCmdlet
public class SetAzureSubscriptionCommand : CmdletWithSubscriptionBase
{
[Parameter(Position = 0, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "Name of the subscription.", ParameterSetName = "CommonSettings")]
[Parameter(Position = 0, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "Name of the subscription.", ParameterSetName = "ResetCurrentStorageAccount")]
Expand All @@ -45,16 +44,6 @@ public class SetAzureSubscriptionCommand : PSCmdlet
[ValidateNotNullOrEmpty]
public string CurrentStorageAccount { get; set; }

[Parameter(Mandatory = true, HelpMessage = "Default subscription name.", ParameterSetName = "DefaultSubscription")]
public string DefaultSubscription { get; set; }

[Parameter(Mandatory = true, HelpMessage = "Reset the current default subscription setting.", ParameterSetName = "ResetDefaultSubscription")]
public SwitchParameter NoDefaultSubscription { get; set; }

[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "Subscription data file.")]
[ValidateNotNullOrEmpty]
public string SubscriptionDataFile { get; set; }

[Parameter(Mandatory = false)]
public SwitchParameter PassThru { get; set; }

Expand All @@ -64,150 +53,82 @@ protected virtual void WriteMessage(string message)
}

/// <summary>
/// Sets the default subscription properties based on the cmdlet parameters.
/// Executes the set subscription cmdlet operation.
/// </summary>
/// <param name="subscription">The subscription where to set the properties.</param>
/// <param name="subscriptionId">The subscription's identifier.</param>
/// <param name="certificate">The subscription's certificate.</param>
/// <param name="serviceEndpoint">The subscription's service endpoint</param>
/// <param name="currentStorageAccount">The current storage account.</param>
private void SetCommonSettingsProcess(SubscriptionData subscription, string subscriptionId, X509Certificate2 certificate, string serviceEndpoint, string currentStorageAccount)
internal void SetSubscriptionProcess()
{
if (subscriptionId != null)
WindowsAzureSubscription subscription = Profile.Subscriptions.FirstOrDefault(s => s.Name == SubscriptionName);
if (subscription == null)
{
subscription.SubscriptionId = subscriptionId;
CreateNewSubscription();
}

if (certificate != null)
else
{
subscription.Certificate = certificate;
UpdateExistingSubscription(subscription);
}
}

private void CreateNewSubscription()
{
var subscription = new WindowsAzureSubscription
{
Name = SubscriptionName,
SubscriptionId = SubscriptionId,
Certificate = Certificate,
CurrentStorageAccountName = CurrentStorageAccount
};

if (serviceEndpoint != null)
if (string.IsNullOrEmpty(ServiceEndpoint))
{
subscription.ServiceEndpoint = serviceEndpoint;
subscription.ServiceEndpoint = new Uri(Profile.CurrentEnvironment.ServiceEndpoint);
}

if (currentStorageAccount != null)
else
{
subscription.NullCurrentStorageAccount(); // next time it is retrieved get the right account info.
subscription.CurrentStorageAccount = currentStorageAccount;
subscription.ServiceEndpoint = new Uri(ServiceEndpoint);
}

Profile.AddSubscription(subscription);
}

/// <summary>
/// Executes the set subscription cmdlet operation.
/// </summary>
/// <param name="parameterSetName">The type of set operation to perform.</param>
/// <param name="subscriptionName">The existing or new subscription name.</param>
/// <param name="subscriptionId">The subscription identifier for the existing or new subscription.</param>
/// <param name="certificate">The certificate for the existing or new subscription.</param>
/// <param name="serviceEndpoint">The service endpoint for the existing or new subscription.</param>
/// <param name="defaultSubscription">The subscription name for the new subscription.</param>
/// <param name="currentStorageAccount">The current storage account.</param>
/// <param name="subscriptionDataFile">The input/output subscription data file to use.</param>
internal void SetSubscriptionProcess(string parameterSetName, string subscriptionName, string subscriptionId, X509Certificate2 certificate, string serviceEndpoint, string defaultSubscription, string currentStorageAccount, string subscriptionDataFile)
private void UpdateExistingSubscription(WindowsAzureSubscription subscription)
{
//SubscriptionData currentSubscription = this.GetCurrentSubscription();
//if (currentSubscription != null &&
// !string.IsNullOrEmpty(currentSubscription.ServiceEndpoint) &&
// string.IsNullOrEmpty(serviceEndpoint))
//{
// // If the current subscription already has a service endpoint do not overwrite if not specified
// serviceEndpoint = currentSubscription.ServiceEndpoint;
//}
//else if (string.IsNullOrEmpty(serviceEndpoint))
//{
// // No current subscription and nothing specified initialize with the default
// serviceEndpoint = ConfigurationConstants.ServiceManagementEndpoint;
//}

//if (parameterSetName == "DefaultSubscription")
//{
// // Set a new default subscription
// this.SetDefaultSubscription(defaultSubscription, subscriptionDataFile);
// this.SetCurrentSubscription(defaultSubscription, subscriptionDataFile);
//}
//else if (parameterSetName == "ResetDefaultSubscription")
//{
// // Reset default subscription
// this.SetDefaultSubscription(null, subscriptionDataFile);
//}
//else
//{
// // Update or create a new subscription
// GlobalSettingsManager globalSettingsManager;
// try
// {
// globalSettingsManager = GlobalSettingsManager.Load(GlobalPathInfo.GlobalSettingsDirectory, subscriptionDataFile);
// }
// catch (FileNotFoundException)
// {
// // assume that import has never been ran and just create it.
// globalSettingsManager = GlobalSettingsManager.Create(GlobalPathInfo.GlobalSettingsDirectory,
// subscriptionDataFile,
// certificate,
// serviceEndpoint);
// }

// SubscriptionData subscription = globalSettingsManager.Subscriptions.ContainsKey(subscriptionName)
// ? globalSettingsManager.Subscriptions[subscriptionName]
// : new SubscriptionData { SubscriptionName = subscriptionName, IsDefault = (globalSettingsManager.Subscriptions.Count == 0) };

// if (parameterSetName == "CommonSettings")
// {
// SetCommonSettingsProcess(subscription, subscriptionId, certificate, serviceEndpoint, currentStorageAccount);
// }

// // Create or update
// globalSettingsManager.Subscriptions[subscription.SubscriptionName] = subscription;
// globalSettingsManager.SaveSubscriptions(subscriptionDataFile);

// currentSubscription = this.GetCurrentSubscription();
// if (currentSubscription == null || string.Compare(currentSubscription.SubscriptionName, subscription.SubscriptionName, StringComparison.OrdinalIgnoreCase) == 0)
// {
// // If the user modifies a subscription using Set-AzureSubscription, but doesn't call Select-AzureSubscription
// // it is not immediately reflected in the code. This takes into account if they modify the current subscription
// // that they shouldn't have to call Select-AzureSubscription once again to have the values updated in session.
// this.SetCurrentSubscription(subscription.SubscriptionName, subscriptionDataFile);

// if (currentSubscription != null)
// {
// WriteMessage(string.Format(
// Resources.UpdatedSettings,
// subscriptionName,
// currentSubscription.SubscriptionName));
// }
// }
//}
if (!string.IsNullOrEmpty(SubscriptionId))
{
subscription.SubscriptionId = SubscriptionId;
}

if (Certificate != null)
{
subscription.Certificate = Certificate;
}

if (ServiceEndpoint != null)
{
subscription.ServiceEndpoint = new Uri(ServiceEndpoint);
}

if (CurrentStorageAccount != null)
{
subscription.CurrentStorageAccountName = CurrentStorageAccount;
}

Profile.UpdateSubscription(subscription);
}

protected override void ProcessRecord()
public override void ExecuteCmdlet()
{
throw new NotImplementedException("Working on it, this cmdlet is currently broken");

//try
//{
// base.ProcessRecord();
// SetSubscriptionProcess(
// ParameterSetName,
// SubscriptionName,
// SubscriptionId,
// Certificate,
// ServiceEndpoint,
// DefaultSubscription,
// CurrentStorageAccount,
// this.TryResolvePath(SubscriptionDataFile));

// if (PassThru.IsPresent)
// {
// WriteObject(true);
// }
//}
//catch (Exception ex)
//{
// WriteError(new ErrorRecord(ex, string.Empty, ErrorCategory.InvalidData, null));
//}
try
{
SetSubscriptionProcess();
if (PassThru.IsPresent)
{
WriteObject(true);
}
}
catch (Exception ex)
{
WriteError(new ErrorRecord(ex, string.Empty, ErrorCategory.InvalidData, null));
}
}
}
}

0 comments on commit b07e44b

Please sign in to comment.