diff --git a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/GetAzureResourceGroupCommandTests.cs b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/GetAzureResourceGroupCommandTests.cs index fdc58feea7f7..7a522d7644b8 100644 --- a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/GetAzureResourceGroupCommandTests.cs +++ b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/GetAzureResourceGroupCommandTests.cs @@ -31,6 +31,7 @@ public class GetAzureResourceGroupCommandTests : RMTestBase private Mock commandRuntimeMock; private string resourceGroupName = "myResourceGroup"; + private string resourceGroupId = "/subscriptions/subId/resourceGroups/myResourceGroup"; private string resourceGroupLocation = "West US"; @@ -57,7 +58,7 @@ public void GetsResourcesGroups() Resources = new List() { new PSResource() { Name = "resource1" } } }; result.Add(expected); - resourcesClientMock.Setup(f => f.FilterResourceGroups(resourceGroupName, null, true)).Returns(result); + resourcesClientMock.Setup(f => f.FilterResourceGroups(resourceGroupName, null, false, null)).Returns(result); cmdlet.Name = resourceGroupName; @@ -70,5 +71,29 @@ public void GetsResourcesGroups() commandRuntimeMock.Verify(f => f.WriteObject(result, true), Times.Once()); } + + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + public void GetsResourcesGroupsById() + { + List result = new List(); + PSResourceGroup expected = new PSResourceGroup() + { + Location = resourceGroupLocation, + ResourceGroupName = resourceGroupName, + Resources = new List() { new PSResource() { Name = "resource1" } } + }; + result.Add(expected); + resourcesClientMock.Setup(f => f.FilterResourceGroups(null, null, true, null)).Returns(result); + + cmdlet.Id = resourceGroupId; + + cmdlet.ExecuteCmdlet(); + + Assert.Equal(1, result.Count); + Assert.Equal(resourceGroupName, result[0].ResourceGroupName); + Assert.Equal(resourceGroupLocation, result[0].Location); + Assert.Equal(1, result[0].Resources.Count); + } } } diff --git a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/NewAzureResourceGroupCommandTests.cs b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/NewAzureResourceGroupCommandTests.cs index b3962439e97c..41099c509210 100644 --- a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/NewAzureResourceGroupCommandTests.cs +++ b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/NewAzureResourceGroupCommandTests.cs @@ -65,7 +65,7 @@ public NewAzureResourceGroupCommandTests() [Fact] [Trait(Category.AcceptanceType, Category.CheckIn)] - public void CreatesNewPSResourceGroupWithUserTemplate() + public void CreatesNewPSResourceGroup() { CreatePSResourceGroupParameters expectedParameters = new CreatePSResourceGroupParameters() { @@ -89,17 +89,12 @@ public void CreatesNewPSResourceGroupWithUserTemplate() cmdlet.Name = expectedParameters.ResourceGroupName; cmdlet.Location = expectedParameters.Location; - cmdlet.TemplateFile = expectedParameters.TemplateFile; - cmdlet.DeploymentName = expectedParameters.DeploymentName; cmdlet.Tag = expectedParameters.Tag; cmdlet.ExecuteCmdlet(); Assert.Equal(expectedParameters.ResourceGroupName, actualParameters.ResourceGroupName); Assert.Equal(expectedParameters.Location, actualParameters.Location); - Assert.Equal(expectedParameters.DeploymentName, actualParameters.DeploymentName); - Assert.Equal(expectedParameters.TemplateFile, actualParameters.TemplateFile); - Assert.NotNull(actualParameters.TemplateParameterObject); Assert.Equal(expectedParameters.Tag, actualParameters.Tag); commandRuntimeMock.Verify(f => f.WriteObject(expected), Times.Once()); diff --git a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/RemoveAzureResourceGroupCommandTests.cs b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/RemoveAzureResourceGroupCommandTests.cs index de711c9046b6..ba0f04cf44c5 100644 --- a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/RemoveAzureResourceGroupCommandTests.cs +++ b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/RemoveAzureResourceGroupCommandTests.cs @@ -30,6 +30,7 @@ public class RemoveAzureResourceGroupCommandTests : RMTestBase private Mock commandRuntimeMock; private string resourceGroupName = "myResourceGroup"; + private string resourceGroupId = "/subscriptions/subId/resourceGroups/myResourceGroup"; public RemoveAzureResourceGroupCommandTests() { @@ -50,13 +51,26 @@ public void RemovesResourceGroup() resourcesClientMock.Setup(f => f.DeleteResourceGroup(resourceGroupName)); cmdlet.Name = resourceGroupName; - cmdlet.PassThru = true; cmdlet.Force = true; cmdlet.ExecuteCmdlet(); resourcesClientMock.Verify(f => f.DeleteResourceGroup(resourceGroupName), Times.Once()); - commandRuntimeMock.Verify(f => f.WriteObject(true), Times.Once()); + } + + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + public void RemovesResourceGroupFromId() + { + commandRuntimeMock.Setup(f => f.ShouldProcess(It.IsAny(), It.IsAny())).Returns(true); + resourcesClientMock.Setup(f => f.DeleteResourceGroup(resourceGroupName)); + + cmdlet.Id = resourceGroupId; + cmdlet.Force = true; + + cmdlet.ExecuteCmdlet(); + + resourcesClientMock.Verify(f => f.DeleteResourceGroup(resourceGroupName), Times.Once()); } } } diff --git a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/SetAzureResourceGroupCommandTests.cs b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/SetAzureResourceGroupCommandTests.cs index 4eb5efaf8155..8ef39f1571be 100644 --- a/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/SetAzureResourceGroupCommandTests.cs +++ b/src/ResourceManager/Resources/Commands.Resources.Test/ResourceGroups/SetAzureResourceGroupCommandTests.cs @@ -33,6 +33,7 @@ public class SetAzureResourceGroupCommandTests : RMTestBase private Mock commandRuntimeMock; private string resourceGroupName = "myResourceGroup"; + private string resourceGroupId = "/subscriptions/subId/resourceGroups/myResourceGroup"; private List tags; @@ -83,5 +84,36 @@ public void UpdatesSetPSResourceGroupWithTag() commandRuntimeMock.Verify(f => f.WriteObject(expected), Times.Once()); } + + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + public void UpdatesSetPSResourceGroupWithTagFromId() + { + UpdatePSResourceGroupParameters expectedParameters = new UpdatePSResourceGroupParameters() + { + ResourceGroupName = resourceGroupName, + Tag = tags.ToArray() + }; + UpdatePSResourceGroupParameters actualParameters = new UpdatePSResourceGroupParameters(); + PSResourceGroup expected = new PSResourceGroup() + { + ResourceGroupName = expectedParameters.ResourceGroupName, + Resources = new List() { new PSResource() { Name = "resource1" } }, + Tags = expectedParameters.Tag + }; + resourcesClientMock.Setup(f => f.UpdatePSResourceGroup(It.IsAny())) + .Returns(expected) + .Callback((UpdatePSResourceGroupParameters p) => { actualParameters = p; }); + + cmdlet.Id = resourceGroupId; + cmdlet.Tag = expectedParameters.Tag; + + cmdlet.ExecuteCmdlet(); + + Assert.Equal(expectedParameters.ResourceGroupName, actualParameters.ResourceGroupName); + Assert.Equal(expectedParameters.Tag, actualParameters.Tag); + + commandRuntimeMock.Verify(f => f.WriteObject(expected), Times.Once()); + } } } diff --git a/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.cs b/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.cs index 2876ea2dcae2..01a31cf1f822 100644 --- a/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.cs +++ b/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.cs @@ -75,12 +75,6 @@ public void TestNewDeploymentAndProviderRegistration() ResourcesController.NewInstance.RunPsTest("Test-NewDeploymentAndProviderRegistration"); } - [Fact] - public void TestNewResourceGroupWithTemplate() - { - ResourcesController.NewInstance.RunPsTest("Test-NewResourceGroupWithTemplateThenGetWithAndWithoutDetails"); - } - [Fact] public void TestRemoveDeployment() { diff --git a/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.ps1 b/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.ps1 index 842660bbc4e7..f05034b6a958 100644 --- a/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.ps1 +++ b/src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceGroupTests.ps1 @@ -251,42 +251,4 @@ function Test-RemoveDeployment # Cleanup Clean-ResourceGroup $rgName } -} - -function Test-NewResourceGroupWithTemplateThenGetWithAndWithoutDetails -{ - # Setup - $rgname = Get-ResourceGroupName - $websiteName = Get-ResourceName - $location = Get-ProviderLocation ResourceManagement - $templateFile = "Resources\EmptyWebsiteTemplate.json" - - try - { - # Test - $actual = New-AzureRmResourceGroup -Name $rgname -Location $location -TemplateFile $templateFile ` - -siteName $websiteName -hostingPlanName "test" -siteLocation "West US" ` - -Tag @{ Name = "testtag"; Value = "testval" } - - $expected1 = Get-AzureRmResourceGroup -Name $rgname - # Assert - Assert-AreEqual $expected1.ResourceGroupName $actual.ResourceGroupName - Assert-AreEqual $expected1.Tags[0]["Name"] $actual.Tags[0]["Name"] - Assert-AreEqual $expected1.Resources.Count 2 - - $expected2 = Get-AzureRmResourceGroup - # Assert - Assert-AreEqual $expected2[0].Resources.Count 0 - - $expected3 = Get-AzureRmResourceGroup -Detailed - $names = $expected3 | Select-Object -ExpandProperty ResourceGroupName - $index = [Array]::IndexOf($names, $expected1.ResourceGroupName) - # Assert - Assert-AreEqual $expected3[$index].Resources.Count 2 - } - finally - { - # Cleanup - Clean-ResourceGroup $rgname - } } \ No newline at end of file diff --git a/src/ResourceManager/Resources/Commands.Resources/Models.ResourceGroups/ResourceClient.ResourceManager.cs b/src/ResourceManager/Resources/Commands.Resources/Models.ResourceGroups/ResourceClient.ResourceManager.cs index 98d8fe40b98f..f63c0b304c29 100644 --- a/src/ResourceManager/Resources/Commands.Resources/Models.ResourceGroups/ResourceClient.ResourceManager.cs +++ b/src/ResourceManager/Resources/Commands.Resources/Models.ResourceGroups/ResourceClient.ResourceManager.cs @@ -342,10 +342,12 @@ private string GenerateDeploymentName(CreatePSResourceGroupDeploymentParameters /// The resource group name. /// The resource group tag. /// Whether the return is detailed or not. + /// The resource group location. /// The filtered resource groups - public virtual List FilterResourceGroups(string name, Hashtable tag, bool detailed) + public virtual List FilterResourceGroups(string name, Hashtable tag, bool detailed, string location = null) { List result = new List(); + if (string.IsNullOrEmpty(name)) { var response = ResourceManagementClient.ResourceGroups.List(null); @@ -356,6 +358,10 @@ public virtual List FilterResourceGroups(string name, Hashtable resourceGroups.AddRange(response.ResourceGroups); } + resourceGroups = !string.IsNullOrEmpty(location) + ? resourceGroups.Where(resourceGroup => this.NormalizeLetterOrDigitToUpperInvariant(resourceGroup.Location).Equals(this.NormalizeLetterOrDigitToUpperInvariant(location))).ToList() + : resourceGroups; + // TODO: Replace with server side filtering when available if (tag != null && tag.Count >= 1) { diff --git a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/GetAzureResourceGroupCommand.cs b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/GetAzureResourceGroupCommand.cs index cdc81d2c3708..f8d97f64d2d2 100644 --- a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/GetAzureResourceGroupCommand.cs +++ b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/GetAzureResourceGroupCommand.cs @@ -13,12 +13,13 @@ // ---------------------------------------------------------------------------------- using Microsoft.Azure.Commands.Resources.Models; -using System.Collections; using System.Collections.Generic; using System.Management.Automation; namespace Microsoft.Azure.Commands.Resources { + using System.Linq; + /// /// Filters resource groups. /// @@ -26,29 +27,29 @@ namespace Microsoft.Azure.Commands.Resources public class GetAzureResourceGroupCommand : ResourcesBaseCmdlet { [Alias("ResourceGroupName")] - [Parameter(Position = 0, Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = "GetSingle")] + [Parameter(Position = 0, Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = "GetSingle")] [ValidateNotNullOrEmpty] public string Name { get; set; } - [Parameter(Position = 0, Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = "GetMultiple")] - public Hashtable Tag { get; set; } + [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group location.")] + [ValidateNotNullOrEmpty] + public string Location { get; set; } - [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = "GetMultiple")] - public SwitchParameter Detailed { get; set; } + [Alias("ResourceGroupId", "ResourceId")] + [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group Id.")] + [ValidateNotNullOrEmpty] + public string Id { get; set; } protected override void ProcessRecord() { - if(this.Tag != null) - { - WriteWarning("The Tag parameter is being deprecated and will be removed in a future release."); - } - if(this.Detailed.IsPresent) - { - WriteWarning("The Detailed switch parameter is being deprecated and will be removed in a future release."); - } WriteWarning("The output object of this cmdlet will be modified in a future release."); - var detailed = Detailed.IsPresent || !string.IsNullOrEmpty(Name); - WriteObject(ResourcesClient.FilterResourceGroups(Name, Tag, detailed), true); + Name = string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Id) + ? Id.Split('/').Last() + : Name; + + this.WriteObject( + ResourcesClient.FilterResourceGroups(name: this.Name, tag: null, detailed: false, location: this.Location), + true); } } } \ No newline at end of file diff --git a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/NewAzureResourceGroupCommand.cs b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/NewAzureResourceGroupCommand.cs index 9308d87017ad..8cc2e1aa0c6e 100644 --- a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/NewAzureResourceGroupCommand.cs +++ b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/NewAzureResourceGroupCommand.cs @@ -15,15 +15,16 @@ using System.Collections; using System.Management.Automation; using Microsoft.Azure.Commands.Resources.Models; -using Microsoft.WindowsAzure.Commands.Utilities.Common; +using Microsoft.Azure.Commands.Resources.Models.ActiveDirectory; namespace Microsoft.Azure.Commands.Resources { + /// /// Creates a new resource group. /// - [Cmdlet(VerbsCommon.New, "AzureRmResourceGroup", DefaultParameterSetName = BaseParameterSetName), OutputType(typeof(PSResourceGroup))] - public class NewAzureResourceGroupCommand : ResourceWithParameterBaseCmdlet, IDynamicParameters + [Cmdlet(VerbsCommon.New, "AzureRmResourceGroup", DefaultParameterSetName = ParameterSet.Empty), OutputType(typeof(PSResourceGroup))] + public class NewAzureResourceGroupCommand : ResourcesBaseCmdlet { [Alias("ResourceGroupName")] [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group name.")] @@ -34,11 +35,6 @@ public class NewAzureResourceGroupCommand : ResourceWithParameterBaseCmdlet, IDy [ValidateNotNullOrEmpty] public string Location { get; set; } - [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, - HelpMessage = "The name of the deployment it's going to create. Only valid when a template is used. When a template is used, if the user doesn't specify a deployment name, use the current time, like \"20131223140835\".")] - [ValidateNotNullOrEmpty] - public string DeploymentName { get; set; } - [Alias("Tags")] [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "An array of hashtables which represents resource tags.")] public Hashtable[] Tag { get; set; } @@ -52,18 +48,11 @@ protected override void ProcessRecord() { ResourceGroupName = Name, Location = Location, - DeploymentName = DeploymentName, - TemplateFile = TemplateUri ?? this.TryResolvePath(TemplateFile), - TemplateParameterObject = GetTemplateParameterObject(TemplateParameterObject), Force = Force.IsPresent, Tag = Tag, ConfirmAction = ConfirmAction }; - if(!string.IsNullOrEmpty(DeploymentName) || !string.IsNullOrEmpty(TemplateFile) - || TemplateParameterObject != null) - { - WriteWarning("The deployment parameters in New-AzureRmResourceGroup cmdlet is being deprecated and will be removed in a future release. Please use New-AzureRmResourceGroupDeployment to submit deployments."); - } + WriteWarning("The output object of this cmdlet will be modified in a future release."); WriteObject(ResourcesClient.CreatePSResourceGroup(parameters)); } diff --git a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/RemoveAzureResourceGroupCommand.cs b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/RemoveAzureResourceGroupCommand.cs index 65f33d187489..465e3fc08359 100644 --- a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/RemoveAzureResourceGroupCommand.cs +++ b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/RemoveAzureResourceGroupCommand.cs @@ -18,6 +18,8 @@ namespace Microsoft.Azure.Commands.Resources { + using System.Linq; + /// /// Removes a new resource group. /// @@ -29,26 +31,26 @@ public class RemoveAzureResourceGroupCommand : ResourcesBaseCmdlet [ValidateNotNullOrEmpty] public string Name {get; set;} + [Alias("ResourceGroupId", "ResourceId")] + [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = false, HelpMessage = "The resource group Id.")] + [ValidateNotNullOrEmpty] + public string Id { get; set; } + [Parameter(Mandatory = false, HelpMessage = "Do not ask for confirmation.")] public SwitchParameter Force { get; set; } - - [Parameter(Mandatory = false)] - public SwitchParameter PassThru { get; set; } protected override void ProcessRecord() { + Name = string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Id) + ? Id.Split('/').Last() + : Name; + ConfirmAction( Force.IsPresent, string.Format(ProjectResources.RemovingResourceGroup, Name), ProjectResources.RemoveResourceGroupMessage, Name, () => ResourcesClient.DeleteResourceGroup(Name)); - - if (PassThru) - { - WriteWarning("The PassThru switch parameter is being deprecated and will be removed in a future release."); - WriteObject(true); - } } } } \ No newline at end of file diff --git a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/SetAzureResourceGroupCommand.cs b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/SetAzureResourceGroupCommand.cs index 40425b8c67be..dc76fb31a33b 100644 --- a/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/SetAzureResourceGroupCommand.cs +++ b/src/ResourceManager/Resources/Commands.Resources/ResourceGroups/SetAzureResourceGroupCommand.cs @@ -18,6 +18,8 @@ namespace Microsoft.Azure.Commands.Resources { + using System.Linq; + /// /// Updates an existing resource group. /// @@ -33,12 +35,19 @@ public class SetAzureResourceGroupCommand : ResourcesBaseCmdlet [Parameter(Mandatory = true, Position = 1, ValueFromPipelineByPropertyName = true, HelpMessage = "An array of hashtables which represents resource tags.")] public Hashtable[] Tag { get; set; } + [Alias("ResourceGroupId", "ResourceId")] + [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = false, HelpMessage = "The resource group Id.")] + [ValidateNotNullOrEmpty] + public string Id { get; set; } + protected override void ProcessRecord() { UpdatePSResourceGroupParameters parameters = new UpdatePSResourceGroupParameters { - ResourceGroupName = Name, - Tag = Tag + ResourceGroupName = string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Id) + ? Id.Split('/').Last() + : Name, + Tag = Tag, }; WriteWarning("The output object of this cmdlet will be modified in a future release."); WriteObject(ResourcesClient.UpdatePSResourceGroup(parameters));