source generators: (#753)

* introduce net5 source generator: version convert

* remove unused generator related files
This commit is contained in:
Boshi Lian
2021-12-19 08:59:24 -08:00
committed by GitHub
parent eca9898902
commit 743e859889
14 changed files with 148 additions and 1420 deletions

View File

@@ -70,8 +70,6 @@ namespace KubernetesWatchGenerator
builder.RegisterType<ModelExtGenerator>();
builder.RegisterType<ModelGenerator>();
builder.RegisterType<ApiGenerator>();
builder.RegisterType<WatchGenerator>();
builder.RegisterType<VersionConverterGenerator>();
var container = builder.Build();
@@ -80,11 +78,6 @@ namespace KubernetesWatchGenerator
helper.RegisterHelper();
}
//if (options.GenerateWatch)
//{
// container.Resolve<WatchGenerator>().Generate(swaggerUnprocessed, outputDirectory);
//}
if (options.GenerateApi)
{
container.Resolve<ApiGenerator>().Generate(swaggerCooked, outputDirectory);
@@ -99,11 +92,6 @@ namespace KubernetesWatchGenerator
{
container.Resolve<ModelExtGenerator>().Generate(swaggerUnprocessed, outputDirectory);
}
if (options.GenerateVersionConverter)
{
container.Resolve<VersionConverterGenerator>().GenerateFromModels(outputDirectory);
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA1812", Justification = "Instanced in CommandLineParser")]
@@ -112,9 +100,6 @@ namespace KubernetesWatchGenerator
[Value(0, Required = true, HelpText = "path to src/KubernetesClient/generated")]
public string OutputPath { get; set; }
//[Option("watch", Required = false, Default = true)]
//public bool GenerateWatch { get; set; }
[Option("api", Required = false, Default = true)]
public bool GenerateApi { get; set; }
@@ -123,9 +108,6 @@ namespace KubernetesWatchGenerator
[Option("modelext", Required = false, Default = true)]
public bool GenerateModelExt { get; set; }
[Option("versionconverter", Required = false, Default = false)]
public bool GenerateVersionConverter { get; set; }
}
}
}

View File

@@ -10,22 +10,9 @@ namespace KubernetesGenerator
{
public void RegisterHelper()
{
Helpers.Register(nameof(GetTuple), GetTuple);
Helpers.Register(nameof(IfKindIs), IfKindIs);
}
public static void GetTuple(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
RenderBlock fn, RenderBlock inverse)
{
if (arguments != null && arguments.Count > 0 && arguments[0] is ITuple &&
options.TryGetValue("index", out var indexObj) && int.TryParse(indexObj?.ToString(), out var index))
{
var pair = (ITuple)arguments[0];
var value = pair[index];
context.Write(value.ToString());
}
}
public static void IfKindIs(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
RenderBlock fn, RenderBlock inverse)
{

View File

@@ -1,52 +0,0 @@
using System;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
using Nustache.Core;
namespace KubernetesGenerator
{
internal class VersionConverterGenerator
{
public void GenerateFromModels(string outputDirectory)
{
// generate version converter maps
var allGeneratedModelClassNames = Directory
.EnumerateFiles(Path.Combine(outputDirectory, "Models"))
.Select(Path.GetFileNameWithoutExtension)
.ToList();
var versionRegex = @"(^V|v)[0-9]+((alpha|beta)[0-9]+)?";
var typePairs = allGeneratedModelClassNames
.OrderBy(x => x)
.Select(x => new
{
Version = Regex.Match(x, versionRegex).Value?.ToLower(),
Kinda = Regex.Replace(x, versionRegex, string.Empty),
Type = x,
})
.Where(x => !string.IsNullOrEmpty(x.Version))
.GroupBy(x => x.Kinda)
.Where(x => x.Count() > 1)
.SelectMany(x =>
x.SelectMany((value, index) => x.Skip(index + 1), (first, second) => new { first, second }))
.OrderBy(x => x.first.Kinda)
.ThenBy(x => x.first.Version)
.Select(x => (ITuple)Tuple.Create(x.first.Type, x.second.Type))
.ToList();
var versionFile =
File.ReadAllText(Path.Combine(outputDirectory, "..", "Versioning", "VersionConverter.cs"));
var manualMaps = Regex.Matches(versionFile, @"\.CreateMap<(?<T1>.+?),\s?(?<T2>.+?)>")
.Select(x => Tuple.Create(x.Groups["T1"].Value, x.Groups["T2"].Value))
.ToList();
var versionConverterPairs = typePairs.Except(manualMaps).ToList();
Render.FileToFile(Path.Combine("templates", "VersionConverter.cs.template"), versionConverterPairs,
Path.Combine(outputDirectory, "VersionConverter.cs"));
Render.FileToFile(Path.Combine("templates", "ModelOperators.cs.template"), typePairs,
Path.Combine(outputDirectory, "ModelOperators.cs"));
}
}
}

View File

@@ -1,26 +0,0 @@
using System.IO;
using System.Linq;
using NSwag;
using Nustache.Core;
namespace KubernetesGenerator
{
internal class WatchGenerator
{
public void Generate(OpenApiDocument swagger, string outputDirectory)
{
// Generate the Watcher operations
// We skip operations where the name of the class in the C# client could not be determined correctly.
// That's usually because there are different version of the same object (e.g. for deployments).
var watchOperations = swagger.Operations.Where(
o => o.Path.Contains("/watch/")
&& o.Operation.ActualParameters.Any(p => p.Name == "name")).ToArray();
// Render.
Render.FileToFile(Path.Combine("templates", "IKubernetes.Watch.cs.template"), watchOperations,
Path.Combine(outputDirectory, "IKubernetes.Watch.cs"));
Render.FileToFile(Path.Combine("templates", "Kubernetes.Watch.cs.template"), watchOperations,
Path.Combine(outputDirectory, "Kubernetes.Watch.cs"));
}
}
}

View File

@@ -1,71 +0,0 @@
// <auto-generated>
// Code generated by https://github.com/kubernetes-client/csharp/tree/master/gen/KubernetesGenerator
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>
using k8s.Models;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace k8s
{
public partial interface IKubernetes
{
{{#.}}
/// <summary>
/// {{ToXmlDoc operation.description}}
/// </summary>
{{#operation.actualParameters}}
{{#isRequired}}
/// <param name="{{GetDotNetName name}}">
/// {{ToXmlDoc description}}
/// </param>
{{/isRequired}}
{{/operation.actualParameters}}
{{#operation.actualParameters}}
{{^isRequired}}
/// <param name="{{GetDotNetName name}}">
/// {{ToXmlDoc description}}
/// </param>
{{/isRequired}}
{{/operation.actualParameters}}
/// <param name="customHeaders">
/// The headers that will be added to request.
/// </param>
/// <param name="onEvent">
/// The action to invoke when the server sends a new event.
/// </param>
/// <param name="onError">
/// The action to invoke when an error occurs.
/// </param>
/// <param name="onClosed">
/// The action to invoke when the server closes the connection.
/// </param>
/// <param name="cancellationToken">
/// A <see cref="CancellationToken"/> which can be used to cancel the asynchronous operation.
/// </param>
/// <returns>
/// A <see cref="Task"/> which represents the asynchronous operation, and returns a new watcher.
/// </returns>
Task<Watcher<{{GetClassName operation}}>> {{GetMethodName operation}}(
{{#operation.actualParameters}}
{{#isRequired}}
{{GetDotNetType type name isRequired format}} {{GetDotNetName name}},
{{/isRequired}}
{{/operation.actualParameters}}
{{#operation.actualParameters}}
{{^isRequired}}
{{GetDotNetType .}} {{GetDotNetName .}} = null,
{{/isRequired}}
{{/operation.actualParameters}}
Dictionary<string, List<string>> customHeaders = null,
Action<WatchEventType, {{GetClassName operation}}> onEvent = null,
Action<Exception> onError = null,
Action onClosed = null,
CancellationToken cancellationToken = default(CancellationToken));
{{/.}}
}
}

View File

@@ -1,41 +0,0 @@
// <auto-generated>
// Code generated by https://github.com/kubernetes-client/csharp/tree/master/gen/KubernetesGenerator
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>
using k8s.Models;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace k8s
{
public partial class Kubernetes
{
{{#.}}
/// <inheritdoc/>
public Task<Watcher<{{GetClassName operation}}>> {{GetMethodName operation}}(
{{#operation.actualParameters}}
{{#isRequired}}
{{GetDotNetType type name isRequired format}} {{GetDotNetName name}},
{{/isRequired}}
{{/operation.actualParameters}}
{{#operation.actualParameters}}
{{^isRequired}}
{{GetDotNetType .}} {{GetDotNetName .}} = null,
{{/isRequired}}
{{/operation.actualParameters}}
Dictionary<string, List<string>> customHeaders = null,
Action<WatchEventType, {{GetClassName operation}}> onEvent = null,
Action<Exception> onError = null,
Action onClosed = null,
CancellationToken cancellationToken = default(CancellationToken))
{
string path = $"{{GetPathExpression .}}";
return WatchObjectAsync<{{GetClassName operation}}>(path: path, @continue: continueParameter, fieldSelector: fieldSelector, labelSelector: labelSelector, limit: limit, pretty: pretty, timeoutSeconds: timeoutSeconds, resourceVersion: resourceVersion, customHeaders: customHeaders, onEvent: onEvent, onError: onError, onClosed: onClosed, cancellationToken: cancellationToken);
}
{{/.}}
}
}

View File

@@ -1,20 +0,0 @@
// <auto-generated>
// Code generated by https://github.com/kubernetes-client/csharp/tree/master/gen/KubernetesGenerator
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>
using k8s.Versioning;
namespace k8s.Models
{
{{#.}}
public partial class {{GetTuple . index="0"}}
{
public static explicit operator {{GetTuple . index="0"}}({{GetTuple . index="1"}} s) => VersionConverter.Mapper.Map<{{GetTuple . index="0"}}>(s);
}
public partial class {{GetTuple . index="1"}}
{
public static explicit operator {{GetTuple . index="1"}}({{GetTuple . index="0"}} s) => VersionConverter.Mapper.Map<{{GetTuple . index="1"}}>(s);
}
{{/.}}
}

View File

@@ -1,24 +0,0 @@
// <auto-generated>
// Code generated by https://github.com/kubernetes-client/csharp/tree/master/gen/KubernetesGenerator
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>
using AutoMapper;
using k8s.Models;
namespace k8s.Versioning
{
public static partial class VersionConverter
{
private static void AutoConfigurations(IMapperConfigurationExpression cfg)
{
{{#.}}
cfg.CreateMap<{{GetTuple . index="0"}}, {{GetTuple . index="1"}}>().ReverseMap();
{{/.}}
}
}
}

View File

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>10.0</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.1" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3" PrivateAssets="all" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,116 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace LibKubernetesGenerator
{
[Generator]
public class VersionConverterGenerator : ISourceGenerator
{
private IEnumerable<string> PathSplit(string path)
{
var p = path;
while (!string.IsNullOrEmpty(p))
{
yield return Path.GetFileName(p);
p = Path.GetDirectoryName(p);
}
}
private bool PathSuffixMath(string path, string suffix)
{
var s = PathSplit(suffix).ToList();
return PathSplit(path).Take(s.Count).SequenceEqual(s);
}
public void Execute(GeneratorExecutionContext context)
{
// TODO should parse syntax node instead of text
var allGeneratedModelClassNames = new List<string>();
var manualMaps = new List<(string, string)>();
foreach (var s in context.Compilation.SyntaxTrees)
{
var p = s.FilePath;
if (PathSuffixMath(p, "Versioning/VersionConverter.cs"))
{
manualMaps = Regex.Matches(s.GetText().ToString(), @"\.CreateMap<(?<T1>.+?),\s?(?<T2>.+?)>")
.OfType<Match>()
.Select(x => (x.Groups["T1"].Value, x.Groups["T2"].Value))
.ToList();
}
else if (PathSuffixMath(Path.GetDirectoryName(p), "generated/Models"))
{
allGeneratedModelClassNames.Add(Path.GetFileNameWithoutExtension(p));
}
}
var versionRegex = @"(^V|v)[0-9]+((alpha|beta)[0-9]+)?";
var typePairs = allGeneratedModelClassNames
.OrderBy(x => x)
.Select(x => new
{
Version = Regex.Match(x, versionRegex).Value?.ToLower(),
Kinda = Regex.Replace(x, versionRegex, string.Empty),
Type = x,
})
.Where(x => !string.IsNullOrEmpty(x.Version))
.GroupBy(x => x.Kinda)
.Where(x => x.Count() > 1)
.SelectMany(x =>
x.SelectMany((value, index) => x.Skip(index + 1), (first, second) => new { first, second }))
.OrderBy(x => x.first.Kinda)
.ThenBy(x => x.first.Version)
.Select(x => (x.first.Type, x.second.Type))
.ToList();
var versionConverterPairs = typePairs.Except(manualMaps).ToList();
var sbmodel = new StringBuilder(@"// <auto-generated />
namespace k8s.Models;
using k8s.Versioning;
");
var sbversion = new StringBuilder(@"// <auto-generated />
namespace k8s.Versioning;
using AutoMapper;
using k8s.Models;
public static partial class VersionConverter
{
private static void AutoConfigurations(IMapperConfigurationExpression cfg)
{
");
foreach (var (t0, t1) in versionConverterPairs)
{
sbmodel.AppendLine($@"
public partial class {t0}
{{
public static explicit operator {t0}({t1} s) => VersionConverter.Mapper.Map<{t0}>(s);
}}
public partial class {t1}
{{
public static explicit operator {t1}({t0} s) => VersionConverter.Mapper.Map<{t1}>(s);
}}");
sbversion.AppendLine($@"cfg.CreateMap<{t0}, {t1}>().ReverseMap();");
}
sbversion.AppendLine("}}");
context.AddSource($"generated_ModelOperators.cs", SourceText.From(sbmodel.ToString(), Encoding.UTF8));
context.AddSource($"generated_VersionConverter.cs", SourceText.From(sbversion.ToString(), Encoding.UTF8));
}
public void Initialize(GeneratorInitializationContext context)
{
}
}
}

View File

@@ -47,6 +47,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GenericKubernetesApi", "exa
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "generic", "examples\generic\generic.csproj", "{F06D4C3A-7825-43A8-832B-6BDE3D355486}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibKubernetesGenerator", "gen\LibKubernetesGenerator\LibKubernetesGenerator.csproj", "{E92670D3-831E-430D-8FAC-138BF9977F3F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -273,6 +275,18 @@ Global
{F06D4C3A-7825-43A8-832B-6BDE3D355486}.Release|x64.Build.0 = Release|Any CPU
{F06D4C3A-7825-43A8-832B-6BDE3D355486}.Release|x86.ActiveCfg = Release|Any CPU
{F06D4C3A-7825-43A8-832B-6BDE3D355486}.Release|x86.Build.0 = Release|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Debug|x64.ActiveCfg = Debug|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Debug|x64.Build.0 = Debug|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Debug|x86.ActiveCfg = Debug|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Debug|x86.Build.0 = Debug|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Release|Any CPU.Build.0 = Release|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Release|x64.ActiveCfg = Release|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Release|x64.Build.0 = Release|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Release|x86.ActiveCfg = Release|Any CPU
{E92670D3-831E-430D-8FAC-138BF9977F3F}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -296,6 +310,7 @@ Global
{79BA7C4A-98AA-467E-80D4-0E4F03EE6DDE} = {879F8787-C3BB-43F3-A92D-6D4C7D3A5285}
{F81AE4C4-E044-4225-BD76-385A0DE621FD} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{F06D4C3A-7825-43A8-832B-6BDE3D355486} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
{E92670D3-831E-430D-8FAC-138BF9977F3F} = {879F8787-C3BB-43F3-A92D-6D4C7D3A5285}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {049A763A-C891-4E8D-80CF-89DD3E22ADC7}

View File

@@ -30,6 +30,10 @@
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\gen\LibKubernetesGenerator\LibKubernetesGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="10.1.1" />
<PackageReference Include="Fractions" Version="7.0.0" />
@@ -44,6 +48,7 @@
<PackageReference Include="Microsoft.Rest.ClientRuntime" Version="2.3.23" />
<PackageReference Include="Portable.BouncyCastle" Version="1.8.10" Condition="'$(TargetFramework)' == 'netstandard2.1'" />
<PackageReference Include="System.Text.Json" Version="6.0.0" Coondition="'$(TargetFramework)' == 'netstandard2.1'" />
</ItemGroup>
<ItemGroup>

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +0,0 @@
// <auto-generated>
// Code generated by https://github.com/kubernetes-client/csharp/tree/master/gen/KubernetesGenerator
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>
using AutoMapper;
using k8s.Models;
namespace k8s.Versioning
{
public static partial class VersionConverter
{
private static void AutoConfigurations(IMapperConfigurationExpression cfg)
{
cfg.CreateMap<V2beta1ContainerResourceMetricSource, V2beta2ContainerResourceMetricSource>().ReverseMap();
cfg.CreateMap<V2beta1ContainerResourceMetricSource, V2ContainerResourceMetricSource>().ReverseMap();
cfg.CreateMap<V2beta2ContainerResourceMetricSource, V2ContainerResourceMetricSource>().ReverseMap();
cfg.CreateMap<V2beta1ContainerResourceMetricStatus, V2beta2ContainerResourceMetricStatus>().ReverseMap();
cfg.CreateMap<V2beta1ContainerResourceMetricStatus, V2ContainerResourceMetricStatus>().ReverseMap();
cfg.CreateMap<V2beta2ContainerResourceMetricStatus, V2ContainerResourceMetricStatus>().ReverseMap();
cfg.CreateMap<V1beta1CronJob, V1CronJob>().ReverseMap();
cfg.CreateMap<V1beta1CronJobList, V1CronJobList>().ReverseMap();
cfg.CreateMap<V1beta1CronJobSpec, V1CronJobSpec>().ReverseMap();
cfg.CreateMap<V1beta1CronJobStatus, V1CronJobStatus>().ReverseMap();
cfg.CreateMap<V1CrossVersionObjectReference, V2beta1CrossVersionObjectReference>().ReverseMap();
cfg.CreateMap<V1CrossVersionObjectReference, V2beta2CrossVersionObjectReference>().ReverseMap();
cfg.CreateMap<V1CrossVersionObjectReference, V2CrossVersionObjectReference>().ReverseMap();
cfg.CreateMap<V2beta1CrossVersionObjectReference, V2beta2CrossVersionObjectReference>().ReverseMap();
cfg.CreateMap<V2beta1CrossVersionObjectReference, V2CrossVersionObjectReference>().ReverseMap();
cfg.CreateMap<V2beta2CrossVersionObjectReference, V2CrossVersionObjectReference>().ReverseMap();
cfg.CreateMap<V1alpha1CSIStorageCapacity, V1beta1CSIStorageCapacity>().ReverseMap();
cfg.CreateMap<V1alpha1CSIStorageCapacityList, V1beta1CSIStorageCapacityList>().ReverseMap();
cfg.CreateMap<V1beta1EndpointConditions, V1EndpointConditions>().ReverseMap();
cfg.CreateMap<V1beta1EndpointHints, V1EndpointHints>().ReverseMap();
cfg.CreateMap<V1beta1EndpointSlice, V1EndpointSlice>().ReverseMap();
cfg.CreateMap<V1beta1EndpointSliceList, V1EndpointSliceList>().ReverseMap();
cfg.CreateMap<V2beta2ExternalMetricSource, V2ExternalMetricSource>().ReverseMap();
cfg.CreateMap<V2beta2ExternalMetricStatus, V2ExternalMetricStatus>().ReverseMap();
cfg.CreateMap<V1beta1FlowDistinguisherMethod, V1beta2FlowDistinguisherMethod>().ReverseMap();
cfg.CreateMap<V1beta1FlowSchema, V1beta2FlowSchema>().ReverseMap();
cfg.CreateMap<V1beta1FlowSchemaCondition, V1beta2FlowSchemaCondition>().ReverseMap();
cfg.CreateMap<V1beta1FlowSchemaList, V1beta2FlowSchemaList>().ReverseMap();
cfg.CreateMap<V1beta1FlowSchemaSpec, V1beta2FlowSchemaSpec>().ReverseMap();
cfg.CreateMap<V1beta1FlowSchemaStatus, V1beta2FlowSchemaStatus>().ReverseMap();
cfg.CreateMap<V1beta1ForZone, V1ForZone>().ReverseMap();
cfg.CreateMap<V1beta1GroupSubject, V1beta2GroupSubject>().ReverseMap();
cfg.CreateMap<V1HorizontalPodAutoscaler, V2beta1HorizontalPodAutoscaler>().ReverseMap();
cfg.CreateMap<V1HorizontalPodAutoscaler, V2beta2HorizontalPodAutoscaler>().ReverseMap();
cfg.CreateMap<V1HorizontalPodAutoscaler, V2HorizontalPodAutoscaler>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscaler, V2beta2HorizontalPodAutoscaler>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscaler, V2HorizontalPodAutoscaler>().ReverseMap();
cfg.CreateMap<V2beta2HorizontalPodAutoscaler, V2HorizontalPodAutoscaler>().ReverseMap();
cfg.CreateMap<V2beta2HorizontalPodAutoscalerBehavior, V2HorizontalPodAutoscalerBehavior>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscalerCondition, V2beta2HorizontalPodAutoscalerCondition>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscalerCondition, V2HorizontalPodAutoscalerCondition>().ReverseMap();
cfg.CreateMap<V2beta2HorizontalPodAutoscalerCondition, V2HorizontalPodAutoscalerCondition>().ReverseMap();
cfg.CreateMap<V1HorizontalPodAutoscalerList, V2beta1HorizontalPodAutoscalerList>().ReverseMap();
cfg.CreateMap<V1HorizontalPodAutoscalerList, V2beta2HorizontalPodAutoscalerList>().ReverseMap();
cfg.CreateMap<V1HorizontalPodAutoscalerList, V2HorizontalPodAutoscalerList>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscalerList, V2beta2HorizontalPodAutoscalerList>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscalerList, V2HorizontalPodAutoscalerList>().ReverseMap();
cfg.CreateMap<V2beta2HorizontalPodAutoscalerList, V2HorizontalPodAutoscalerList>().ReverseMap();
cfg.CreateMap<V2beta2HorizontalPodAutoscalerSpec, V2HorizontalPodAutoscalerSpec>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscalerStatus, V2beta2HorizontalPodAutoscalerStatus>().ReverseMap();
cfg.CreateMap<V2beta1HorizontalPodAutoscalerStatus, V2HorizontalPodAutoscalerStatus>().ReverseMap();
cfg.CreateMap<V2beta2HorizontalPodAutoscalerStatus, V2HorizontalPodAutoscalerStatus>().ReverseMap();
cfg.CreateMap<V2beta2HPAScalingPolicy, V2HPAScalingPolicy>().ReverseMap();
cfg.CreateMap<V2beta2HPAScalingRules, V2HPAScalingRules>().ReverseMap();
cfg.CreateMap<V1beta1JobTemplateSpec, V1JobTemplateSpec>().ReverseMap();
cfg.CreateMap<V1beta1LimitedPriorityLevelConfiguration, V1beta2LimitedPriorityLevelConfiguration>().ReverseMap();
cfg.CreateMap<V1beta1LimitResponse, V1beta2LimitResponse>().ReverseMap();
cfg.CreateMap<V2beta2MetricIdentifier, V2MetricIdentifier>().ReverseMap();
cfg.CreateMap<V2beta1MetricSpec, V2beta2MetricSpec>().ReverseMap();
cfg.CreateMap<V2beta1MetricSpec, V2MetricSpec>().ReverseMap();
cfg.CreateMap<V2beta2MetricSpec, V2MetricSpec>().ReverseMap();
cfg.CreateMap<V2beta1MetricStatus, V2beta2MetricStatus>().ReverseMap();
cfg.CreateMap<V2beta1MetricStatus, V2MetricStatus>().ReverseMap();
cfg.CreateMap<V2beta2MetricStatus, V2MetricStatus>().ReverseMap();
cfg.CreateMap<V2beta2MetricTarget, V2MetricTarget>().ReverseMap();
cfg.CreateMap<V2beta2MetricValueStatus, V2MetricValueStatus>().ReverseMap();
cfg.CreateMap<V1beta1NonResourcePolicyRule, V1beta2NonResourcePolicyRule>().ReverseMap();
cfg.CreateMap<V2beta2ObjectMetricSource, V2ObjectMetricSource>().ReverseMap();
cfg.CreateMap<V2beta2ObjectMetricStatus, V2ObjectMetricStatus>().ReverseMap();
cfg.CreateMap<V1alpha1Overhead, V1beta1Overhead>().ReverseMap();
cfg.CreateMap<V1alpha1Overhead, V1Overhead>().ReverseMap();
cfg.CreateMap<V1beta1Overhead, V1Overhead>().ReverseMap();
cfg.CreateMap<V1beta1PodDisruptionBudget, V1PodDisruptionBudget>().ReverseMap();
cfg.CreateMap<V1beta1PodDisruptionBudgetList, V1PodDisruptionBudgetList>().ReverseMap();
cfg.CreateMap<V1beta1PodDisruptionBudgetSpec, V1PodDisruptionBudgetSpec>().ReverseMap();
cfg.CreateMap<V1beta1PodDisruptionBudgetStatus, V1PodDisruptionBudgetStatus>().ReverseMap();
cfg.CreateMap<V2beta2PodsMetricSource, V2PodsMetricSource>().ReverseMap();
cfg.CreateMap<V2beta2PodsMetricStatus, V2PodsMetricStatus>().ReverseMap();
cfg.CreateMap<V1beta1PolicyRulesWithSubjects, V1beta2PolicyRulesWithSubjects>().ReverseMap();
cfg.CreateMap<V1beta1PriorityLevelConfiguration, V1beta2PriorityLevelConfiguration>().ReverseMap();
cfg.CreateMap<V1beta1PriorityLevelConfigurationCondition, V1beta2PriorityLevelConfigurationCondition>().ReverseMap();
cfg.CreateMap<V1beta1PriorityLevelConfigurationList, V1beta2PriorityLevelConfigurationList>().ReverseMap();
cfg.CreateMap<V1beta1PriorityLevelConfigurationReference, V1beta2PriorityLevelConfigurationReference>().ReverseMap();
cfg.CreateMap<V1beta1PriorityLevelConfigurationSpec, V1beta2PriorityLevelConfigurationSpec>().ReverseMap();
cfg.CreateMap<V1beta1PriorityLevelConfigurationStatus, V1beta2PriorityLevelConfigurationStatus>().ReverseMap();
cfg.CreateMap<V1beta1QueuingConfiguration, V1beta2QueuingConfiguration>().ReverseMap();
cfg.CreateMap<V2beta2ResourceMetricSource, V2ResourceMetricSource>().ReverseMap();
cfg.CreateMap<V2beta2ResourceMetricStatus, V2ResourceMetricStatus>().ReverseMap();
cfg.CreateMap<V1beta1ResourcePolicyRule, V1beta2ResourcePolicyRule>().ReverseMap();
cfg.CreateMap<V1alpha1RuntimeClassList, V1beta1RuntimeClassList>().ReverseMap();
cfg.CreateMap<V1alpha1RuntimeClassList, V1RuntimeClassList>().ReverseMap();
cfg.CreateMap<V1beta1RuntimeClassList, V1RuntimeClassList>().ReverseMap();
cfg.CreateMap<V1alpha1Scheduling, V1beta1Scheduling>().ReverseMap();
cfg.CreateMap<V1alpha1Scheduling, V1Scheduling>().ReverseMap();
cfg.CreateMap<V1beta1Scheduling, V1Scheduling>().ReverseMap();
cfg.CreateMap<V1beta1ServiceAccountSubject, V1beta2ServiceAccountSubject>().ReverseMap();
cfg.CreateMap<V1beta1Subject, V1beta2Subject>().ReverseMap();
cfg.CreateMap<V1beta1Subject, V1Subject>().ReverseMap();
cfg.CreateMap<V1beta2Subject, V1Subject>().ReverseMap();
cfg.CreateMap<V1beta1UserSubject, V1beta2UserSubject>().ReverseMap();
}
}
}