Skip to content

Commit b4402cc

Browse files
author
Hovsep
committed
Merge pull request Azure#1395 from vivsriaus/FixSetResource
Fix set resource
2 parents 9ffca4d + e2619cf commit b4402cc

File tree

6 files changed

+716
-143
lines changed

6 files changed

+716
-143
lines changed

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Implementation/Resource/SetAzureResourceCmdlet.cs

Lines changed: 90 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,26 +135,20 @@ protected override void OnProcessRecord()
135135
/// </summary>
136136
private JToken GetResourceBody()
137137
{
138-
var getResult = this.GetResource().Result;
138+
if(this.ShouldUsePatchSemantics())
139+
{
140+
var resourceBody = this.GetPatchResourceBody();
139141

140-
JToken resourceBody;
141-
if (getResult.CanConvertTo<Resource<JToken>>())
142+
return resourceBody == null ? null : resourceBody.ToJToken();
143+
}
144+
else
142145
{
143-
if (this.ShouldUsePatchSemantics())
144-
{
145-
resourceBody = new Resource<JToken>()
146-
{
147-
Kind = this.Kind,
148-
Plan = this.Plan.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourcePlan>(),
149-
Sku = this.Sku.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourceSku>(),
150-
Tags = TagsHelper.GetTagsDictionary(this.Tag),
151-
Properties = this.Properties.ToResourcePropertiesBody(),
152-
}.ToJToken();
153-
}
154-
else
146+
var getResult = this.GetResource().Result;
147+
148+
if (getResult.CanConvertTo<Resource<JToken>>())
155149
{
156150
var resource = getResult.ToResource();
157-
resourceBody = new Resource<JToken>()
151+
return new Resource<JToken>()
158152
{
159153
Kind = this.Kind ?? resource.Kind,
160154
Plan = this.Plan.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourcePlan>() ?? resource.Plan,
@@ -164,11 +158,89 @@ private JToken GetResourceBody()
164158
Properties = this.Properties == null ? resource.Properties : this.Properties.ToResourcePropertiesBody(),
165159
}.ToJToken();
166160
}
161+
else
162+
{
163+
return this.Properties.ToJToken();
164+
}
167165
}
168-
else
166+
167+
}
168+
169+
/// <summary>
170+
/// Gets the resource body for PATCH calls
171+
/// </summary>
172+
private Resource<JToken> GetPatchResourceBody()
173+
{
174+
Resource<JToken> resourceBody = null;
175+
176+
if (this.Properties != null)
177+
{
178+
resourceBody = new Resource<JToken>()
179+
{
180+
Properties = this.Properties.ToResourcePropertiesBody()
181+
};
182+
}
183+
184+
if (this.Plan != null)
185+
{
186+
if(resourceBody != null)
187+
{
188+
resourceBody.Plan = this.Plan.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourcePlan>();
189+
}
190+
else
191+
{
192+
resourceBody = new Resource<JToken>()
193+
{
194+
Plan = this.Plan.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourcePlan>()
195+
};
196+
}
197+
}
198+
199+
if (this.Kind != null)
200+
{
201+
if(resourceBody != null)
202+
{
203+
resourceBody.Kind = this.Kind;
204+
}
205+
else
206+
{
207+
resourceBody = new Resource<JToken>()
208+
{
209+
Kind = this.Kind
210+
};
211+
}
212+
}
213+
214+
if (this.Sku != null)
215+
{
216+
if(resourceBody != null)
217+
{
218+
resourceBody.Sku = this.Sku.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourceSku>();
219+
}
220+
else
221+
{
222+
resourceBody = new Resource<JToken>()
223+
{
224+
Sku = this.Sku.ToDictionary(addValueLayer: false).ToJson().FromJson<ResourceSku>()
225+
};
226+
}
227+
}
228+
229+
if (this.Tag != null)
169230
{
170-
resourceBody = this.Properties.ToJToken();
231+
if(resourceBody != null)
232+
{
233+
resourceBody.Tags = TagsHelper.GetTagsDictionary(this.Tag);
234+
}
235+
else
236+
{
237+
resourceBody = new Resource<JToken>()
238+
{
239+
Tags = TagsHelper.GetTagsDictionary(this.Tag)
240+
};
241+
}
171242
}
243+
172244
return resourceBody;
173245
}
174246

src/ResourceManager/Resources/Commands.Resources.Test/Commands.Resources.Test.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,9 @@
510510
<None Include="SessionRecords\Microsoft.Azure.Commands.Resources.Test.ScenarioTests.ResourceTests\TestSetAResourceTest.json">
511511
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
512512
</None>
513+
<None Include="SessionRecords\Microsoft.Azure.Commands.Resources.Test.ScenarioTests.ResourceTests\TestSetAResourceWithPatchTest.json">
514+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
515+
</None>
513516
<None Include="SessionRecords\Microsoft.Azure.Commands.Resources.Test.ScenarioTests.RoleAssignmentTests\RaAuthorizationChangeLog.json">
514517
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
515518
</None>

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ public void TestSetAResourceTest()
9191
ResourcesController.NewInstance.RunPsTest("Test-SetAResource");
9292
}
9393

94+
[Fact]
95+
[Trait(Category.AcceptanceType, Category.CheckIn)]
96+
public void TestSetAResourceWithPatchTest()
97+
{
98+
ResourcesController.NewInstance.RunPsTest("Test-SetAResourceWithPatch");
99+
}
100+
94101
[Fact]
95102
[Trait(Category.AcceptanceType, Category.CheckIn)]
96103
public void TestFindAResourceTest()

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceTests.ps1

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,32 @@ function Test-SetAResource
271271
Assert-AreEqual $modifiedResource.Sku.Name "A1"
272272
}
273273

274+
<#
275+
.SYNOPSIS
276+
Tests setting a resource using patch.
277+
#>
278+
function Test-SetAResourceWithPatch
279+
{
280+
# Setup
281+
$rgname = Get-ResourceGroupName
282+
$rname = Get-ResourceName
283+
$rglocation = Get-ProviderLocation ResourceManagement
284+
$apiversion = "2014-04-01"
285+
$resourceType = "Providers.Test/statefulResources"
286+
287+
# Test
288+
New-AzureRmResourceGroup -Name $rgname -Location $rglocation
289+
$resource = New-AzureRmResource -Name $rname -Location $rglocation -Tags @{Name = "testtag"; Value = "testval"} -ResourceGroupName $rgname -ResourceType $resourceType -PropertyObject @{"key" = "value"} -SkuObject @{ Name = "A0" } -ApiVersion $apiversion -Force
290+
Set-AzureRmResource -ResourceGroupName $rgname -ResourceName $rname -ResourceType $resourceType -Properties @{"key2" = "value2"} -Force
291+
Set-AzureRmResource -ResourceGroupName $rgname -ResourceName $rname -ResourceType $resourceType -SkuObject @{ Name = "A1" } -UsePatchSemantics -Force
292+
293+
$modifiedResource = Get-AzureRmResource -ResourceGroupName $rgname -ResourceName $rname -ResourceType $resourceType
294+
295+
# Assert patch didn't overwrite existing properties
296+
Assert-AreEqual $modifiedResource.Properties.key2 "value2"
297+
Assert-AreEqual $modifiedResource.Sku.Name "A1"
298+
}
299+
274300
<#
275301
.SYNOPSIS
276302
Tests finding a resource.

0 commit comments

Comments
 (0)