Skip to content

Commit 7e3208b

Browse files
alexmgbuehler
andauthored
feat(crd generation): Treat IKubernetesObject types as x-kubernetes-embedded-resource (#162)
* Treat standard IKubernetesObject types as x-kubernetes-embedded-resource in CRD schema * Limit x-kubernetes-embedded-resource to IKubernetesObject concrete derived types Co-authored-by: Christoph Bühler <[email protected]>
1 parent db81ce1 commit 7e3208b

File tree

3 files changed

+45
-9
lines changed

3 files changed

+45
-9
lines changed

src/KubeOps/Operator/Entities/Extensions/EntityToCrdExtensions.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,7 @@ private static V1JSONSchemaProps MapProperty(
182182
// check if embedded resource is set
183183
if (info.GetCustomAttribute<EmbeddedResourceAttribute>() != null)
184184
{
185-
props.Type = Object;
186-
props.Properties = null;
187-
props.XKubernetesPreserveUnknownFields = true;
188-
props.XKubernetesEmbeddedResource = true;
185+
SetEmbeddedResourceProperties(props);
189186
}
190187

191188
// get additional printer column information
@@ -251,6 +248,13 @@ private static V1JSONSchemaProps MapType(
251248
{
252249
props.XKubernetesIntOrString = true;
253250
}
251+
else if (typeof(IKubernetesObject).IsAssignableFrom(type) &&
252+
!type.IsAbstract &&
253+
!type.IsInterface &&
254+
type.Assembly == typeof(IKubernetesObject).Assembly)
255+
{
256+
SetEmbeddedResourceProperties(props);
257+
}
254258
else if (!isSimpleType)
255259
{
256260
ProcessType(type, props, additionalColumns, jsonPath);
@@ -306,6 +310,14 @@ private static V1JSONSchemaProps MapType(
306310
return props;
307311
}
308312

313+
private static void SetEmbeddedResourceProperties(V1JSONSchemaProps props)
314+
{
315+
props.Type = Object;
316+
props.Properties = null;
317+
props.XKubernetesPreserveUnknownFields = true;
318+
props.XKubernetesEmbeddedResource = true;
319+
}
320+
309321
private static void ProcessType(
310322
Type type,
311323
V1JSONSchemaProps props,

tests/KubeOps.Test/Operator/Entities/CrdGeneration.Test.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -334,16 +334,35 @@ public void Should_Set_IntOrString()
334334
specProperties.Properties["intOrString"].XKubernetesIntOrString.Should().BeTrue();
335335
}
336336

337+
[Theory]
338+
[InlineData(nameof(TestSpecEntitySpec.KubernetesObject))]
339+
[InlineData(nameof(TestSpecEntitySpec.Pod))]
340+
public void Should_Map_Embedded_Resources(string property)
341+
{
342+
var crd = _testSpecEntity.CreateCrd();
343+
var propertyName = property.ToCamelCase();
344+
345+
var specProperties = crd.Spec.Versions.First().Schema.OpenAPIV3Schema.Properties["spec"];
346+
specProperties.Properties[propertyName].Type.Should().Be("object");
347+
specProperties.Properties[propertyName].Properties.Should().BeNull();
348+
specProperties.Properties[propertyName].XKubernetesPreserveUnknownFields.Should().BeTrue();
349+
specProperties.Properties[propertyName].XKubernetesEmbeddedResource.Should().BeTrue();
350+
}
351+
337352
[Fact]
338-
public void Should_Map_Embedded_Resources()
353+
public void Should_Map_List_Of_Embedded_Resource()
339354
{
340355
var crd = _testSpecEntity.CreateCrd();
356+
var propertyName = nameof(TestSpecEntitySpec.Pods).ToCamelCase();
341357

342358
var specProperties = crd.Spec.Versions.First().Schema.OpenAPIV3Schema.Properties["spec"];
343-
specProperties.Properties["kubernetesObject"].Type.Should().Be("object");
344-
specProperties.Properties["kubernetesObject"].Properties.Should().BeNull();
345-
specProperties.Properties["kubernetesObject"].XKubernetesPreserveUnknownFields.Should().BeTrue();
346-
specProperties.Properties["kubernetesObject"].XKubernetesEmbeddedResource.Should().BeTrue();
359+
var arrayProperty = specProperties.Properties[propertyName];
360+
arrayProperty.Type.Should().Be("array");
361+
362+
var items = arrayProperty.Items as V1JSONSchemaProps;
363+
items?.Type?.Should().Be("object");
364+
items?.XKubernetesPreserveUnknownFields.Should().BeTrue();
365+
items?.XKubernetesEmbeddedResource?.Should().BeTrue();
347366
}
348367

349368
[Fact]

tests/KubeOps.Test/TestEntities/TestSpecEntity.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Collections.ObjectModel;
55
using System.Linq;
6+
using k8s;
67
using k8s.Models;
78
using KubeOps.Operator.Entities;
89
using KubeOps.Operator.Entities.Annotations;
@@ -125,6 +126,10 @@ public class TestSpecEntitySpec
125126
[EmbeddedResource]
126127
public V1ConfigMap KubernetesObject { get; set; } = new V1ConfigMap();
127128

129+
public V1Pod Pod { get; set; } = new V1Pod();
130+
131+
public IList<V1Pod> Pods { get; set; } = Array.Empty<V1Pod>();
132+
128133
[JsonProperty(PropertyName = "NameFromAttribute")]
129134
public string PropertyWithJsonAttribute { get; set; } = string.Empty;
130135

0 commit comments

Comments
 (0)