diff --git a/src/KubeClient/ApiMetadata/KubeApiMetadataCache.cs b/src/KubeClient/ApiMetadata/KubeApiMetadataCache.cs index 83260afd..005926b0 100644 --- a/src/KubeClient/ApiMetadata/KubeApiMetadataCache.cs +++ b/src/KubeClient/ApiMetadata/KubeApiMetadataCache.cs @@ -20,6 +20,11 @@ public sealed class KubeApiMetadataCache /// public static readonly IReadOnlyCollection ApiGroupPrefixes = new string[] { "api", "apis" }; + /// + /// The character used as a separator between a resource type's groupVersion and kind. + /// + const char ResourceTypeSeparator = ':'; + /// /// An object used to synchronise access to cache state. /// @@ -466,7 +471,7 @@ async Task> LoadGroupApis(IKubeApiClient kubeClient, strin } apiMetadata.Add( - new KubeApiMetadata(kind, groupVersion.Version ?? groupVersion.GroupVersion, singularName, shortNames, isPreferredVersion, apiPaths) + new KubeApiMetadata(kind, groupVersion.GroupVersion ?? groupVersion.Version, singularName, shortNames, isPreferredVersion, apiPaths) ); } @@ -495,20 +500,25 @@ public string[] GetCacheKeys() /// public (string kind, string apiVersion)[] GetKnownResourceKinds() { + List<(string kind, string apiVersion)> knownResourceKinds = new List<(string kind, string apiVersion)>(); + lock (_stateLock) { - return _metadata.Keys - .Where( - key => key.IndexOf('/') != -1 - ) - .Select( - key => key.Split('/') - ) - .Select( - keyParts => (kind: keyParts[0], apiVersion: keyParts[1]) - ) - .ToArray(); + foreach (string cacheKey in _metadata.Keys) + { + string[] keyComponents = cacheKey.Split(new char[] { ResourceTypeSeparator }, count: 2); + + // Ignore aliases for resource types from preferred versions (i.e. ones without a groupVersion). + if (keyComponents.Length != 2) + continue; + + knownResourceKinds.Add( + (kind: keyComponents[1], apiVersion: keyComponents[0]) + ); + } } + + return knownResourceKinds.ToArray(); } /// @@ -579,7 +589,7 @@ static string CreateCacheKey(string kind, string apiVersion) if (String.IsNullOrWhiteSpace(apiVersion)) throw new ArgumentException("Argument cannot be null, empty, or entirely composed of whitespace: 'apiVersion'.", nameof(apiVersion)); - return $"{apiVersion}/{kind}"; + return $"{apiVersion}{ResourceTypeSeparator}{kind}"; } } }