internal static V1CustomResourceDefinition CreateCrd(this Type entityType) { var entityDefinition = entityType.CreateResourceDefinition(); var crd = new V1CustomResourceDefinition( new V1CustomResourceDefinitionSpec(), $"{V1CustomResourceDefinition.KubeGroup}/{V1CustomResourceDefinition.KubeApiVersion}", V1CustomResourceDefinition.KubeKind, new V1ObjectMeta { Name = $"{entityDefinition.Plural}.{entityDefinition.Group}" }); var spec = crd.Spec; spec.Group = entityDefinition.Group; spec.Names = new V1CustomResourceDefinitionNames { Kind = entityDefinition.Kind, ListKind = entityDefinition.ListKind, Singular = entityDefinition.Singular, Plural = entityDefinition.Plural, }; spec.Scope = entityDefinition.Scope.ToString(); var version = new V1CustomResourceDefinitionVersion(); spec.Versions = new[] { version }; version.Name = entityDefinition.Version; version.Served = true; version.Storage = true; if (entityType.GetProperty("Status") != null || entityType.GetProperty("status") != null) { version.Subresources = new V1CustomResourceSubresources(null, new object()); } var columns = new List <V1CustomResourceColumnDefinition>(); version.Schema = new V1CustomResourceValidation(MapType(entityType, columns, string.Empty)); version.AdditionalPrinterColumns = entityType .GetCustomAttributes <GenericAdditionalPrinterColumnAttribute>(true) .Select(a => a.ToAdditionalPrinterColumn()) .Concat(columns) .ToList(); if (version.AdditionalPrinterColumns.Count == 0) { version.AdditionalPrinterColumns = null; } return(crd); }
public V1CustomResourceDefinitionVersion BuildVersion(ApiVersion apiVersion, Type type) { JsonSchemaGenerator schemaGenerator = new JsonSchemaGenerator(); var schema = schemaGenerator.Generate(type); schema.Properties = new Dictionary <string, JsonSchema>(schema.Properties.Where(kvp => kvp.Key == "spec" || kvp.Key == "status")); var version = new V1CustomResourceDefinitionVersion(apiVersion.Version, true, true); version.Schema = new V1CustomResourceValidation(); version.Schema.OpenAPIV3Schema = MapSchemaToKubernetesModels(schema); if (type.Implements <IStatusEnabledCustomResource>()) { version.Subresources = new V1CustomResourceSubresources(status: new object()); } return(version); }
internal static V1CustomResourceDefinition CreateCrd(Type entityType) { var entityDefinition = CustomEntityDefinitionExtensions.CreateResourceDefinition(entityType); var crd = new V1CustomResourceDefinition( new V1CustomResourceDefinitionSpec(), $"{V1CustomResourceDefinition.KubeGroup}/{V1CustomResourceDefinition.KubeApiVersion}", V1CustomResourceDefinition.KubeKind, new V1ObjectMeta { Name = $"{entityDefinition.Plural}.{entityDefinition.Group}" }); var spec = crd.Spec; spec.Group = entityDefinition.Group; spec.Names = new V1CustomResourceDefinitionNames { Kind = entityDefinition.Kind, ListKind = entityDefinition.ListKind, Singular = entityDefinition.Singular, Plural = entityDefinition.Plural, }; spec.Scope = entityDefinition.Scope.ToString(); var version = new V1CustomResourceDefinitionVersion(); spec.Versions = new[] { version }; // TODO: versions? version.Name = entityDefinition.Version; version.Served = true; version.Storage = true; if (entityType.GetProperty("Status") != null || entityType.GetProperty("status") != null) { version.Subresources = new V1CustomResourceSubresources(null, new { }); } version.Schema = new V1CustomResourceValidation(MapType(entityType)); return(crd); }