Skip to content

Commit

Permalink
feat(webhook-generator): only use operations that are overwritten.
Browse files Browse the repository at this point in the history
  • Loading branch information
buehler committed Oct 13, 2023
1 parent 807ec8c commit 7841fe9
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 12 deletions.
17 changes: 8 additions & 9 deletions src/KubeOps.Cli/Commands/Generator/WebhookOperatorGenerator.cs
Expand Up @@ -183,30 +183,29 @@ internal static async Task Handler(IAnsiConsole console, InvocationContext ctx)

foreach (var entity in validatedEntities)
{
var (metadata, _) = parser.ToEntityMetadata(entity);
validatorConfig.Webhooks.Add(new V1ValidatingWebhook
{
Name = $"validate.{metadata.SingularName}.{metadata.Group}.{metadata.Version}",
Name = $"validate.{entity.Metadata.SingularName}.{entity.Metadata.Group}.{entity.Metadata.Version}",
MatchPolicy = "Exact",
AdmissionReviewVersions = new[] { "v1" },
SideEffects = "None",
Rules = new[]
{
new V1RuleWithOperations
{
Operations = new[] { "CREATE", "UPDATE", "DELETE" },
Resources = new[] { metadata.PluralName },
ApiGroups = new[] { metadata.Group },
ApiVersions = new[] { metadata.Version },
Operations = entity.GetOperations(),
Resources = new[] { entity.Metadata.PluralName },
ApiGroups = new[] { entity.Metadata.Group },
ApiVersions = new[] { entity.Metadata.Version },
},
},
ClientConfig = new Admissionregistrationv1WebhookClientConfig
{
CaBundle = Encoding.ASCII.GetBytes(Convert.ToBase64String(Encoding.ASCII.GetBytes(caCert.ToPem()))),
CaBundle =
Encoding.ASCII.GetBytes(Convert.ToBase64String(Encoding.ASCII.GetBytes(caCert.ToPem()))),
Service = new Admissionregistrationv1ServiceReference
{
Name = "operator",
Path = $"/validate/{entity.Name.ToLowerInvariant()}",
Name = "operator", Path = entity.ValidatorPath,
},
},
});
Expand Down
7 changes: 4 additions & 3 deletions src/KubeOps.Cli/Transpilation/AssemblyLoader.cs
Expand Up @@ -165,12 +165,13 @@ public static IEnumerable<CustomAttributeData> GetRbacAttributes(this MetadataLo
}
}

public static IEnumerable<Type> GetValidatedEntities(this MetadataLoadContext context) => context.GetAssemblies()
public static IEnumerable<ValidatedEntity> GetValidatedEntities(this MetadataLoadContext context) => context
.GetAssemblies()
.SelectMany(a => a.DefinedTypes)
.Where(t => t.BaseType?.Name == typeof(ValidationWebhook<>).Name &&
t.BaseType?.Namespace == typeof(ValidationWebhook<>).Namespace)
.Select(t => t.BaseType!.GenericTypeArguments[0])
.Distinct();
.Distinct()
.Select(t => new ValidatedEntity(t, context.ToEntityMetadata(t.BaseType!.GenericTypeArguments[0]).Metadata));

[GeneratedRegex(".*")]
private static partial Regex DefaultRegex();
Expand Down
20 changes: 20 additions & 0 deletions src/KubeOps.Cli/Transpilation/ValidatedEntity.cs
@@ -0,0 +1,20 @@
using System.Reflection;

using KubeOps.Abstractions.Entities;

namespace KubeOps.Cli.Transpilation;

internal record ValidatedEntity(TypeInfo Validator, EntityMetadata Metadata)
{
private bool HasCreate => Validator.DeclaredMembers.Any(m => m.Name.StartsWith("Create"));

private bool HasUpdate => Validator.DeclaredMembers.Any(m => m.Name.StartsWith("Update"));

private bool HasDelete => Validator.DeclaredMembers.Any(m => m.Name.StartsWith("Delete"));

public string ValidatorPath => $"/validate/{Validator.BaseType!.GenericTypeArguments[0].Name.ToLowerInvariant()}";

public string[] GetOperations() =>
new[] { HasCreate ? "CREATE" : null, HasUpdate ? "UPDATE" : null, HasDelete ? "DELETE" : null, }
.Where(o => o is not null).ToArray()!;
}

0 comments on commit 7841fe9

Please sign in to comment.