Skip to content

Add typed objects for piping scenarios [breaking] #11184

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,11 @@ public class PolicyDefinitionProperties
/// </summary>
[JsonProperty(Required = Required.Default)]
public string Mode { get; set; }

/// <summary>
/// The policy type.
/// </summary>
[JsonProperty(Required = Required.Default)]
public PolicyType PolicyType { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,11 @@ public class PolicySetDefinitionProperties
/// </summary>
[JsonProperty(Required = Required.Default)]
public JArray PolicyDefinitionGroups { get; set; }

/// <summary>
/// The policy type.
/// </summary>
[JsonProperty(Required = Required.Default)]
public PolicyType PolicyType { get; set; }
}
}
37 changes: 37 additions & 0 deletions src/Resources/ResourceManager/Entities/Policy/PolicyType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// ----------------------------------------------------------------------------------
//
// Copyright Microsoft Corporation
// 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.
// ----------------------------------------------------------------------------------

namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Entities.Policy
{
/// <summary>
/// The policy assignment enforcement mode.
/// </summary>
public enum PolicyType
{
/// <summary>
/// The policy policy [set] definition is custom
/// </summary>
Custom,

/// <summary>
/// The policy policy [set] definition is built in
/// </summary>
BuiltIn,

/// <summary>
/// The policy policy definition is static
/// </summary>
Static
}
}
45 changes: 45 additions & 0 deletions src/Resources/ResourceManager/Extensions/JsonExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Extensions
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Management.Automation;

/// <summary>
/// <c>JSON</c> extensions
Expand Down Expand Up @@ -134,6 +135,50 @@ public static JToken ToJToken(this object obj)
return null;
}

if (obj is PSObject psObject)
{
var jObject = new JObject();
if (psObject.BaseObject is object[] psArray)
{
var jArray = new JArray();
foreach (var item in psArray)
{
jArray.Add(item.ToJToken());
}

return jArray;
}

foreach (var property in psObject.Properties)
{
jObject.Add(new JProperty(property.Name, property.Value.ToJToken()));
}

return jObject;
}

if (obj is PSMemberInfoCollection<PSPropertyInfo> psCollection)
{
var jObject = new JObject();
foreach (var member in psCollection)
{
jObject.Add(new JProperty(member.Name, member.Value.ToJToken()));
}

return jObject;
}

if (obj is object[] objArray)
{
var jArray = new JArray();
foreach (var item in objArray)
{
jArray.Add(item.ToJToken());
}

return jArray;
}

return JToken.FromObject(obj, JsonExtensions.JsonObjectTypeSerializer);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
/// <summary>
/// Gets the policy assignment.
/// </summary>
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyAssignment", DefaultParameterSetName = PolicyCmdletBase.DefaultParameterSet), OutputType(typeof(PSObject))]
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyAssignment", DefaultParameterSetName = PolicyCmdletBase.DefaultParameterSet), OutputType(typeof(PsPolicyAssignment))]
public class GetAzurePolicyAssignmentCmdlet : PolicyCmdletBase
{
/// <summary>
Expand Down Expand Up @@ -84,7 +84,7 @@ private void RunCmdlet()
getFirstPage: () => this.GetResources(),
getNextPage: nextLink => this.GetNextLink<JObject>(nextLink),
cancellationToken: this.CancellationToken,
action: resources => this.WriteObject(sendToPipeline: this.GetOutputObjects("PolicyAssignmentId", resources), enumerateCollection: true));
action: resources => this.WriteObject(sendToPipeline: this.GetOutputPolicyAssignments(resources), enumerateCollection: true));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
/// <summary>
/// Gets the policy definition.
/// </summary>
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet), OutputType(typeof(PSObject))]
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet), OutputType(typeof(PsPolicyDefinition))]
public class GetAzurePolicyDefinitionCmdlet : PolicyCmdletBase
{
/// <summary>
Expand Down Expand Up @@ -97,7 +97,7 @@ private void RunCmdlet()
getFirstPage: () => this.GetResources(listFilter),
getNextPage: nextLink => this.GetNextLink<JObject>(nextLink),
cancellationToken: this.CancellationToken,
action: resources => this.WriteObject(sendToPipeline: this.GetFilteredOutputObjects("PolicyDefinitionId", listFilter, resources), enumerateCollection: true));
action: resources => this.WriteObject(sendToPipeline: this.GetFilteredOutputPolicyDefinitions(listFilter, resources), enumerateCollection: true));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
/// <summary>
/// Gets the policy set definition.
/// </summary>
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicySetDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet), OutputType(typeof(PSObject))]
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicySetDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet), OutputType(typeof(PsPolicySetDefinition))]
public class GetAzurePolicySetDefinitionCmdlet : PolicyCmdletBase
{
/// <summary>
Expand Down Expand Up @@ -97,7 +97,7 @@ private void RunCmdlet()
getFirstPage: () => this.GetResources(listFilter),
getNextPage: nextLink => this.GetNextLink<JObject>(nextLink),
cancellationToken: this.CancellationToken,
action: resources => this.WriteObject(sendToPipeline: this.GetFilteredOutputObjects("PolicySetDefinitionId", listFilter, resources), enumerateCollection: true));
action: resources => this.WriteObject(sendToPipeline: this.GetFilteredOutputPolicySetDefinitions(listFilter, resources), enumerateCollection: true));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
/// <summary>
/// Creates a policy assignment.
/// </summary>
[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyAssignment", DefaultParameterSetName = PolicyCmdletBase.DefaultParameterSet), OutputType(typeof(PSObject))]
[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyAssignment", DefaultParameterSetName = PolicyCmdletBase.DefaultParameterSet), OutputType(typeof(PsPolicyAssignment))]
public class NewAzurePolicyAssignmentCmdlet : PolicyCmdletBase, IDynamicParameters
{
private readonly RuntimeDefinedParameterDictionary dynamicParameters = new RuntimeDefinedParameterDictionary();
Expand Down Expand Up @@ -76,7 +76,7 @@ public class NewAzurePolicyAssignmentCmdlet : PolicyCmdletBase, IDynamicParamete
[Parameter(ParameterSetName = PolicyCmdletBase.DefaultParameterSet, Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = PolicyHelpStrings.NewPolicyAssignmentPolicyDefinitionHelp)]
[Parameter(ParameterSetName = PolicyCmdletBase.PolicyParameterObjectParameterSet, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = PolicyHelpStrings.NewPolicyAssignmentPolicyDefinitionHelp)]
[Parameter(ParameterSetName = PolicyCmdletBase.PolicyParameterStringParameterSet, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = PolicyHelpStrings.NewPolicyAssignmentPolicyDefinitionHelp)]
public PSObject PolicyDefinition { get; set; }
public PsPolicyDefinition PolicyDefinition { get; set; }

/// <summary>
/// Gets or sets the policy assignment policy set definition parameter.
Expand All @@ -85,7 +85,7 @@ public class NewAzurePolicyAssignmentCmdlet : PolicyCmdletBase, IDynamicParamete
[Parameter(ParameterSetName = PolicyCmdletBase.DefaultParameterSet, Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = PolicyHelpStrings.NewPolicyAssignmentPolicySetDefinitionHelp)]
[Parameter(ParameterSetName = PolicyCmdletBase.PolicySetParameterObjectParameterSet, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = PolicyHelpStrings.NewPolicyAssignmentPolicySetDefinitionHelp)]
[Parameter(ParameterSetName = PolicyCmdletBase.PolicySetParameterStringParameterSet, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = PolicyHelpStrings.NewPolicyAssignmentPolicySetDefinitionHelp)]
public PSObject PolicySetDefinition { get; set; }
public PsPolicySetDefinition PolicySetDefinition { get; set; }

/// <summary>
/// Gets or sets the policy assignment policy parameter object.
Expand Down Expand Up @@ -140,12 +140,12 @@ protected override void OnProcessRecord()
throw new PSInvalidOperationException("Only one of PolicyDefinition or PolicySetDefinition can be specified, not both.");
}

if (this.PolicyDefinition != null && this.PolicyDefinition.Properties["policyDefinitionId"] == null)
if (this.PolicyDefinition != null && this.PolicyDefinition.PolicyDefinitionId == null)
{
throw new PSInvalidOperationException("The supplied PolicyDefinition object is invalid.");
}

if (this.PolicySetDefinition != null && this.PolicySetDefinition.Properties["policySetDefinitionId"] == null)
if (this.PolicySetDefinition != null && this.PolicySetDefinition.PolicySetDefinitionId == null)
{
throw new PSInvalidOperationException("The supplied PolicySetDefinition object is invalid.");
}
Expand Down Expand Up @@ -173,7 +173,7 @@ protected override void OnProcessRecord()
var result = this.GetLongRunningOperationTracker(activityName: activity, isResourceCreateOrUpdate: true)
.WaitOnOperation(operationResult: operationResult);

this.WriteObject(this.GetOutputObjects("PolicyAssignmentId", JObject.Parse(result)), enumerateCollection: true);
this.WriteObject(this.GetOutputPolicyAssignments(JObject.Parse(result)), enumerateCollection: true);
}

/// <summary>
Expand Down Expand Up @@ -208,11 +208,11 @@ private JToken GetResource()

if (this.PolicyDefinition != null)
{
policyassignmentObject.Properties.PolicyDefinitionId = this.PolicyDefinition.Properties["policyDefinitionId"].Value.ToString();
policyassignmentObject.Properties.PolicyDefinitionId = this.PolicyDefinition.PolicyDefinitionId;
}
else if (this.PolicySetDefinition != null)
{
policyassignmentObject.Properties.PolicyDefinitionId = this.PolicySetDefinition.Properties["policySetDefinitionId"].Value.ToString();
policyassignmentObject.Properties.PolicyDefinitionId = this.PolicySetDefinition.PolicySetDefinitionId;
}

return policyassignmentObject.ToJToken();
Expand All @@ -223,11 +223,11 @@ object IDynamicParameters.GetDynamicParameters()
PSObject parameters = null;
if (this.PolicyDefinition != null)
{
parameters = this.PolicyDefinition.GetPSObjectProperty("Properties.parameters") as PSObject;
parameters = this.PolicyDefinition.Properties.Parameters;
}
else if (this.PolicySetDefinition != null)
{
parameters = this.PolicySetDefinition.GetPSObjectProperty("Properties.parameters") as PSObject;
parameters = this.PolicySetDefinition.Properties.Parameters;
}

if (parameters != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
/// <summary>
/// Creates the new policy definition.
/// </summary>
[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet), OutputType(typeof(PSObject))]
[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicyDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet), OutputType(typeof(PsPolicyDefinition))]
public class NewAzurePolicyDefinitionCmdlet : PolicyCmdletBase
{
/// <summary>
Expand Down Expand Up @@ -121,8 +121,7 @@ protected override void OnProcessRecord()
var activity = string.Format("PUT {0}", managementUri.PathAndQuery);
var result = this.GetLongRunningOperationTracker(activityName: activity, isResourceCreateOrUpdate: true)
.WaitOnOperation(operationResult: operationResult);

this.WriteObject(this.GetOutputObjects("PolicyDefinitionId", JObject.Parse(result)), enumerateCollection: true);
this.WriteObject(this.GetOutputPolicyDefinitions(JObject.Parse(result)), enumerateCollection: true);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
/// <summary>
/// Creates the policy set definition.
/// </summary>
[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicySetDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet, SupportsShouldProcess = true), OutputType(typeof(PSObject))]
[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "PolicySetDefinition", DefaultParameterSetName = PolicyCmdletBase.NameParameterSet, SupportsShouldProcess = true), OutputType(typeof(PsPolicySetDefinition))]
public class NewAzurePolicySetDefinitionCmdlet : PolicyCmdletBase
{
/// <summary>
Expand Down Expand Up @@ -123,7 +123,7 @@ protected override void OnProcessRecord()
var result = this.GetLongRunningOperationTracker(activityName: activity, isResourceCreateOrUpdate: true)
.WaitOnOperation(operationResult: operationResult);

this.WriteObject(this.GetOutputObjects("PolicySetDefinitionId", JObject.Parse(result)), enumerateCollection: true);
this.WriteObject(this.GetOutputPolicySetDefinitions(JObject.Parse(result)), enumerateCollection: true);
}
}

Expand Down
Loading