mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
* feat: Add Schema Registry and Validation Framework This commit introduces a comprehensive schema registry and validation framework, providing schema-based validation of resources and policy effects. - Thread-safe, in-memory registry for schema storage and management - Global registry patterns for effects and resources - Concurrent access with proper error handling - Unicode schema names support - JSON Schema-compliant validation for all primitive types - Advanced constraint validation (patterns, ranges, length limits) - Discriminated union support with anyOf schemas - Detailed error reporting with nested validation paths - Discriminated subobject validation for polymorphic schemas - **Registry Tests**: All registry operations - **Effect Tests**: Policy effect validation - **Resource Tests**: Resource validation - **Validation Tests**: Core validation engine - Thread-safety, error handling, integration scenarios, edge cases - **Dependencies**: dashmap, once_cell, regex - **Thread Safety**: Minimal locking with Rc<Schema> sharing - **Error Types**: TypeMismatch, OutOfRange, PatternMismatch, etc. - Complete schema registry and validation subsystem - Comprehensive test coverage - Foundation for policy validation in Regorus Benchmarks: - Criterion benchmarks for basic types, effects and Azure resources - Performance range: 3.22ns (string) to 34.74µs (Azure VM resource schema validation) - String withs patterns validation: 30.2µs. Need to explore whether regex caching helps bring this down. - Azure policy effects: 188ns-1.4µs Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> * feat: Complete target system with C# bindings and resource inference - Add comprehensive target system with TargetRegistry and target-aware compilation - Implement resource type inference from policy equality expressions - Create modular C# bindings with separate wrapper classes for each concept - Add thread-safe CompiledPolicy with reference counting for safe disposal - Enhance FFI with detailed error propagation and target functionality - Create TargetExampleApp demonstrating Azure Policy integration - Add CI/CD pipeline testing for all C# applications - Support target definitions with schema validation and resource selectors - Implement PolicyModule struct and target-aware compilation methods - Add comprehensive test coverage for target functionality Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> --------- Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
142 lines
4.9 KiB
C#
142 lines
4.9 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using System.Collections.Generic;
|
|
using System.Text.Json.Serialization;
|
|
|
|
#nullable enable
|
|
namespace Regorus
|
|
{
|
|
/// <summary>
|
|
/// Information about a compiled policy, including metadata about modules,
|
|
/// target configuration, and resource types that the policy can evaluate.
|
|
/// </summary>
|
|
public class PolicyInfo
|
|
{
|
|
/// <summary>
|
|
/// List of module identifiers that were compiled into this policy.
|
|
/// Each module ID represents a unique policy module that contributes
|
|
/// rules, functions, or data to the compiled policy.
|
|
/// </summary>
|
|
[JsonPropertyName("module_ids")]
|
|
public List<string> ModuleIds { get; set; } = new List<string>();
|
|
|
|
/// <summary>
|
|
/// Name of the target configuration used during compilation, if any.
|
|
/// This indicates which target schema and validation rules were applied.
|
|
/// </summary>
|
|
[JsonPropertyName("target_name")]
|
|
public string? TargetName { get; set; }
|
|
|
|
/// <summary>
|
|
/// List of resource types that this policy can evaluate.
|
|
/// For target-aware policies, this contains the inferred or configured
|
|
/// resource types. For general policies, this may be empty.
|
|
/// </summary>
|
|
[JsonPropertyName("applicable_resource_types")]
|
|
public List<string> ApplicableResourceTypes { get; set; } = new List<string>();
|
|
|
|
/// <summary>
|
|
/// The primary rule or entrypoint that this policy evaluates.
|
|
/// This is the rule path that will be executed when the policy runs.
|
|
/// </summary>
|
|
[JsonPropertyName("entrypoint_rule")]
|
|
public string EntrypointRule { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// The effect rule name for target-aware policies, if applicable.
|
|
/// This is the specific effect rule (e.g., "effect", "allow", "deny")
|
|
/// that determines the policy decision for target evaluation.
|
|
/// </summary>
|
|
[JsonPropertyName("effect_rule")]
|
|
public string? EffectRule { get; set; }
|
|
|
|
/// <summary>
|
|
/// Parameters that can be configured for this policy.
|
|
/// Contains parameter names and their expected types or default values.
|
|
/// Used for parameterized policies that accept configuration at evaluation time.
|
|
/// Each element represents parameters from a different module.
|
|
/// </summary>
|
|
[JsonPropertyName("parameters")]
|
|
public List<PolicyParameters> Parameters { get; set; } = new List<PolicyParameters>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Parameters that can be configured for a policy.
|
|
/// </summary>
|
|
public class PolicyParameters
|
|
{
|
|
/// <summary>
|
|
/// Source file where the parameters are defined.
|
|
/// </summary>
|
|
[JsonPropertyName("source_file")]
|
|
public string SourceFile { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// List of parameter definitions.
|
|
/// </summary>
|
|
[JsonPropertyName("parameters")]
|
|
public List<PolicyParameter> Parameters { get; set; } = new List<PolicyParameter>();
|
|
|
|
/// <summary>
|
|
/// List of parameter modifiers.
|
|
/// </summary>
|
|
[JsonPropertyName("modifiers")]
|
|
public List<PolicyParameterModifier> Modifiers { get; set; } = new List<PolicyParameterModifier>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// A single parameter definition.
|
|
/// </summary>
|
|
public class PolicyParameter
|
|
{
|
|
/// <summary>
|
|
/// Name of the parameter.
|
|
/// </summary>
|
|
[JsonPropertyName("name")]
|
|
public string Name { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Type of the parameter.
|
|
/// </summary>
|
|
[JsonPropertyName("type")]
|
|
public string Type { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Default value of the parameter, if any.
|
|
/// </summary>
|
|
[JsonPropertyName("default")]
|
|
public object? Default { get; set; }
|
|
|
|
/// <summary>
|
|
/// Description of the parameter.
|
|
/// </summary>
|
|
[JsonPropertyName("description")]
|
|
public string? Description { get; set; }
|
|
|
|
/// <summary>
|
|
/// Allowed values for the parameter, if constrained.
|
|
/// </summary>
|
|
[JsonPropertyName("allowed_values")]
|
|
public List<object>? AllowedValues { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// A parameter modifier that affects parameter behavior.
|
|
/// </summary>
|
|
public class PolicyParameterModifier
|
|
{
|
|
/// <summary>
|
|
/// Name of the modifier.
|
|
/// </summary>
|
|
[JsonPropertyName("name")]
|
|
public string Name { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Value of the modifier.
|
|
/// </summary>
|
|
[JsonPropertyName("value")]
|
|
public object? Value { get; set; }
|
|
}
|
|
}
|