Initial port of cache functions from java client (#665)
* Initial port of cache functions from java client * Move lock in Cache.Replace to be less disruptive * Remove IListerWatcher as it's not used at the moment * Added todo in Cache.Get as reminder * TApiType implement IKubernetesObject * TApiType implement IKubernetesObject * TApiType implement class along with IKubernetesObject * Disable failing test until it can be figured out * Ran `dotnet format --fix-whitespace --fix-style` to put formatting in compliance * Moved contents of KubernetesClient.Util into KubernetesClient project * Moved contents of KubernetesClient.Util into KubernetesClient project #2 :(
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MartinCostello.Logging.XUnit" Version="0.1.2" />
|
||||
<PackageReference Include="FluentAssertions" Version="5.10.3" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.2.0" />
|
||||
<PackageReference Include="System.IO.Abstractions.TestingHelpers" Version="13.2.33" />
|
||||
@@ -41,4 +42,8 @@
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\KubernetesClient\KubernetesClient.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Util\Common" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
336
tests/KubernetesClient.Tests/Util/Informer/Cache/CacheTest.cs
Normal file
336
tests/KubernetesClient.Tests/Util/Informer/Cache/CacheTest.cs
Normal file
@@ -0,0 +1,336 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using k8s.Util.Informer.Cache;
|
||||
using k8s.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace k8s.Tests.Util.Informer.Cache
|
||||
{
|
||||
public class CacheTest
|
||||
{
|
||||
[Fact(DisplayName = "Create default cache success")]
|
||||
private void CreateCacheSuccess()
|
||||
{
|
||||
var cache = new Cache<V1Node>();
|
||||
cache.Should().NotBeNull();
|
||||
cache.GetIndexers().ContainsKey(Caches.NamespaceIndex).Should().BeTrue();
|
||||
// Todo: validate all defaults gor set up
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Add cache item success")]
|
||||
private void AddCacheItemSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
|
||||
cache.Get(aPod).Equals(aPod).Should().BeTrue();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Update cache item success")]
|
||||
private void UpdateCacheItemSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
aPod.Kind = "another-kind";
|
||||
cache.Update(aPod);
|
||||
|
||||
cache.Get(aPod).Kind.Equals(aPod.Kind).Should().BeTrue();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Delete cache item success")]
|
||||
private void DeleteCacheItemSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
cache.Delete(aPod);
|
||||
|
||||
// Todo: check indices for removed item
|
||||
cache.Get(aPod).Should().BeNull();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Replace cache items success")]
|
||||
private void ReplaceCacheItemsSuccess()
|
||||
{
|
||||
var pods = Util.CreatePods(3);
|
||||
var aPod = pods.First();
|
||||
var anotherPod = pods.Skip(1).First();
|
||||
var yetAnotherPod = pods.Skip(2).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
cache.Replace(new[] { anotherPod, yetAnotherPod });
|
||||
|
||||
// Todo: check indices for replaced items
|
||||
cache.Get(anotherPod).Should().NotBeNull();
|
||||
cache.Get(yetAnotherPod).Should().NotBeNull();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List item keys success")]
|
||||
public void ListItemKeysSuccess()
|
||||
{
|
||||
var pods = Util.CreatePods(3);
|
||||
var aPod = pods.First();
|
||||
var anotherPod = pods.Skip(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
cache.Add(anotherPod);
|
||||
|
||||
var keys = cache.ListKeys();
|
||||
|
||||
keys.Should().Contain($"{aPod.Metadata.NamespaceProperty}/{aPod.Metadata.Name}");
|
||||
keys.Should().Contain($"{anotherPod.Metadata.NamespaceProperty}/{anotherPod.Metadata.Name}");
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get item doesn't exist")]
|
||||
public void GetItemNotExist()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
var item = cache.Get(aPod);
|
||||
item.Should().BeNull();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get item success")]
|
||||
public void GetItemSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
var item = cache.Get(aPod);
|
||||
item.Equals(aPod).Should().BeTrue();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List items success")]
|
||||
public void ListItemSuccess()
|
||||
{
|
||||
var pods = Util.CreatePods(3);
|
||||
var aPod = pods.First();
|
||||
var anotherPod = pods.Skip(1).First();
|
||||
var yetAnotherPod = pods.Skip(2).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(aPod);
|
||||
cache.Add(anotherPod);
|
||||
cache.Add(yetAnotherPod);
|
||||
|
||||
var items = cache.List();
|
||||
items.Should().HaveCount(3);
|
||||
items.Should().Contain(aPod);
|
||||
items.Should().Contain(anotherPod);
|
||||
items.Should().Contain(yetAnotherPod);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get item by key success")]
|
||||
public void GetItemByKeySuccess()
|
||||
{
|
||||
var pod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(pod);
|
||||
var item = cache.GetByKey($"{pod.Metadata.NamespaceProperty}/{pod.Metadata.Name}");
|
||||
item.Should().NotBeNull();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Index items no index")]
|
||||
public void IndexItemsNoIndex()
|
||||
{
|
||||
var pod = Util.CreatePods(1).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(pod);
|
||||
|
||||
Assert.Throws<ArgumentException>(() => { cache.Index("asdf", pod); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Index items success")]
|
||||
public void IndexItemsSuccess()
|
||||
{
|
||||
var pod = Util.CreatePods(1).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(pod);
|
||||
|
||||
var items = cache.Index("namespace", pod);
|
||||
|
||||
items.Should().Contain(pod);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get index keys no index")]
|
||||
public void GetIndexKeysNoIndex()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
Assert.Throws<ArgumentException>(() => { cache.IndexKeys("a", "b"); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get index keys no indice item")]
|
||||
public void GetIndexKeysNoIndiceItem()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
Assert.Throws<KeyNotFoundException>(() => { cache.IndexKeys("namespace", "b"); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get index keys success")]
|
||||
public void GetIndexKeysSuccess()
|
||||
{
|
||||
var pod = Util.CreatePods(1).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(pod);
|
||||
var keys = cache.IndexKeys("namespace", pod.Metadata.NamespaceProperty);
|
||||
|
||||
keys.Should().NotBeNull();
|
||||
keys.Should().Contain(Caches.MetaNamespaceKeyFunc(pod));
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List by index no index")]
|
||||
public void ListByIndexNoIndex()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
Assert.Throws<ArgumentException>(() => { cache.ByIndex("a", "b"); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List by index no indice item")]
|
||||
public void ListByIndexNoIndiceItem()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
Assert.Throws<KeyNotFoundException>(() => { cache.ByIndex("namespace", "b"); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List by index success")]
|
||||
public void ListByIndexSuccess()
|
||||
{
|
||||
var pod = Util.CreatePods(1).First();
|
||||
|
||||
var cache = new Cache<V1Pod>();
|
||||
|
||||
cache.Add(pod);
|
||||
var items = cache.ByIndex("namespace", pod.Metadata.NamespaceProperty);
|
||||
|
||||
items.Should().Contain(pod);
|
||||
}
|
||||
|
||||
/* Add Indexers */
|
||||
[Fact(DisplayName = "Add null indexers")]
|
||||
public void AddNullIndexers()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
Assert.Throws<ArgumentNullException>(() => { cache.AddIndexers(null); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Add indexers with conflict")]
|
||||
public void AddIndexersConflict()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
Dictionary<string, Func<V1Pod, List<string>>> initialIndexers = new Dictionary<string, Func<V1Pod, List<string>>>()
|
||||
{
|
||||
{ "1", pod => new List<string>() },
|
||||
{ "2", pod => new List<string>() },
|
||||
};
|
||||
Dictionary<string, Func<V1Pod, List<string>>> conflictIndexers = new Dictionary<string, Func<V1Pod, List<string>>>()
|
||||
{
|
||||
{ "1", pod => new List<string>() },
|
||||
};
|
||||
|
||||
cache.AddIndexers(initialIndexers);
|
||||
Assert.Throws<ArgumentException>(() => { cache.AddIndexers(conflictIndexers); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Add indexers success")]
|
||||
public void AddIndexersSuccess()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
Dictionary<string, Func<V1Pod, List<string>>> indexers = new Dictionary<string, Func<V1Pod, List<string>>>()
|
||||
{
|
||||
{ "2", pod => new List<string>() { pod.Name() } },
|
||||
{ "3", pod => new List<string>() { pod.Name() } },
|
||||
};
|
||||
|
||||
cache.AddIndexers(indexers);
|
||||
|
||||
var savedIndexers = cache.GetIndexers();
|
||||
savedIndexers.Should().HaveCount(indexers.Count + 1); // blank cache constructor will add a default index
|
||||
savedIndexers.Should().Contain(indexers);
|
||||
|
||||
// Todo: check indicies collection for new indexname keys
|
||||
}
|
||||
|
||||
/* Add Index Function */
|
||||
[Fact(DisplayName = "Add index function success")]
|
||||
public void AddIndexFuncSuccess()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
cache.AddIndexFunc("1", pod => new List<string>() { pod.Name() });
|
||||
|
||||
var savedIndexers = cache.GetIndexers();
|
||||
savedIndexers.Should().HaveCount(2);
|
||||
|
||||
// Todo: check indicies collection for new indexname keys
|
||||
}
|
||||
|
||||
/* Get Key Function */
|
||||
[Fact(DisplayName = "Get default key function success")]
|
||||
public void GetDefaultKeyFuncSuccess()
|
||||
{
|
||||
var pod = new V1Pod()
|
||||
{
|
||||
Metadata = new V1ObjectMeta()
|
||||
{
|
||||
Name = "a-name",
|
||||
NamespaceProperty = "the-namespace",
|
||||
},
|
||||
};
|
||||
var cache = new Cache<V1Pod>();
|
||||
var defaultReturnValue = Caches.DeletionHandlingMetaNamespaceKeyFunc<V1Pod>(pod);
|
||||
|
||||
var funcReturnValue = cache.KeyFunc(pod);
|
||||
|
||||
Assert.True(defaultReturnValue.Equals(funcReturnValue));
|
||||
}
|
||||
|
||||
/* Set Key Function */
|
||||
[Fact(DisplayName = "Set key function success")]
|
||||
public void SetKeyFuncSuccess()
|
||||
{
|
||||
var aPod = new V1Pod()
|
||||
{
|
||||
Kind = "some-kind",
|
||||
Metadata = new V1ObjectMeta()
|
||||
{
|
||||
Name = "a-name",
|
||||
NamespaceProperty = "the-namespace",
|
||||
},
|
||||
};
|
||||
var cache = new Cache<V1Pod>();
|
||||
var newFunc = new Func<V1Pod, string>((pod) => pod.Kind);
|
||||
var defaultReturnValue = newFunc(aPod);
|
||||
|
||||
cache.SetKeyFunc(newFunc);
|
||||
|
||||
var funcReturnValue = cache.KeyFunc(aPod);
|
||||
|
||||
Assert.True(defaultReturnValue.Equals(funcReturnValue));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using k8s.Models;
|
||||
using Xunit;
|
||||
using k8s.Util.Informer.Cache;
|
||||
|
||||
namespace k8s.Tests.Util.Informer.Cache
|
||||
{
|
||||
public class CachesTest
|
||||
{
|
||||
[Fact(DisplayName = "Check for default DeletedFinalStateUnknown")]
|
||||
public void CheckDefaultDeletedFinalStateUnknown()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
Caches.DeletionHandlingMetaNamespaceKeyFunc(aPod).Should().Be($"{aPod.Metadata.NamespaceProperty}/{aPod.Metadata.Name}");
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Check for obj DeletedFinalStateUnknown")]
|
||||
public void CheckObjDeletedFinalStateUnknown()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var key = "a-key";
|
||||
var deletedPod = new DeletedFinalStateUnknown<V1Pod>(key, aPod);
|
||||
|
||||
var returnKey = Caches.DeletionHandlingMetaNamespaceKeyFunc(deletedPod);
|
||||
|
||||
// returnKey.Should().Be(key);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get default namespace key null")]
|
||||
public void GetDefaultNamespaceKeyNull()
|
||||
{
|
||||
Assert.Throws<ArgumentNullException>(() => { Caches.MetaNamespaceKeyFunc(null); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get default namespace key success")]
|
||||
public void GetDefaultNamespaceKeySuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
Caches.MetaNamespaceKeyFunc(aPod).Should().Be($"{aPod.Metadata.NamespaceProperty}/{aPod.Metadata.Name}");
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get default namespace index null")]
|
||||
public void GetDefaultNamespaceIndexNull()
|
||||
{
|
||||
Assert.Throws<ArgumentNullException>(() => { Caches.MetaNamespaceIndexFunc<V1Pod>(null); });
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get default namespace index success")]
|
||||
public void GetDefaultNamespaceIndexSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var indexes = Caches.MetaNamespaceIndexFunc(aPod);
|
||||
|
||||
indexes.Should().NotBeNull();
|
||||
indexes.Should().Contain(aPod.Metadata.NamespaceProperty);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using k8s.Models;
|
||||
using Xunit;
|
||||
using k8s.Util.Informer.Cache;
|
||||
|
||||
namespace k8s.Tests.Util.Informer.Cache
|
||||
{
|
||||
public class ListerTest
|
||||
{
|
||||
[Fact(DisplayName = "Create default lister success")]
|
||||
private void CreateListerDefaultsSuccess()
|
||||
{
|
||||
var cache = new Cache<V1Pod>();
|
||||
var lister = new Lister<V1Pod>(cache);
|
||||
|
||||
lister.Should().NotBeNull();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List with null namespace success")]
|
||||
private void ListNullNamespaceSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
var lister = new Lister<V1Pod>(cache);
|
||||
|
||||
cache.Add(aPod);
|
||||
var pods = lister.List();
|
||||
|
||||
pods.Should().HaveCount(1);
|
||||
pods.Should().Contain(aPod);
|
||||
// Can't 'Get' the pod due to no namespace specified in Lister constructor
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "List with custom namespace success")]
|
||||
private void ListCustomNamespaceSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
var lister = new Lister<V1Pod>(cache, aPod.Metadata.NamespaceProperty);
|
||||
|
||||
cache.Add(aPod);
|
||||
var pods = lister.List();
|
||||
|
||||
pods.Should().HaveCount(1);
|
||||
pods.Should().Contain(aPod);
|
||||
lister.Get(aPod.Metadata.Name).Should().Be(aPod);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get with null namespace success")]
|
||||
private void GetNullNamespaceSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
var lister = new Lister<V1Pod>(cache);
|
||||
|
||||
cache.Add(aPod);
|
||||
var pod = lister.Get(aPod.Metadata.Name);
|
||||
|
||||
// it's null because the namespace was not set in Lister constructor, but the pod did have a namespace.
|
||||
// So it can't build the right key name for lookup in Cache
|
||||
pod.Should().BeNull();
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Get with custom namespace success")]
|
||||
private void GetCustomNamespaceSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
var lister = new Lister<V1Pod>(cache, aPod.Metadata.NamespaceProperty);
|
||||
|
||||
cache.Add(aPod);
|
||||
var pod = lister.Get(aPod.Metadata.Name);
|
||||
|
||||
pod.Should().Be(aPod);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Set custom namespace success")]
|
||||
private void SetCustomNamespaceSuccess()
|
||||
{
|
||||
var aPod = Util.CreatePods(1).First();
|
||||
var cache = new Cache<V1Pod>();
|
||||
var lister = new Lister<V1Pod>(cache);
|
||||
|
||||
cache.Add(aPod);
|
||||
var pod = lister.Get(aPod.Metadata.Name);
|
||||
pod.Should().BeNull();
|
||||
|
||||
lister = lister.Namespace(aPod.Metadata.NamespaceProperty);
|
||||
|
||||
pod = lister.Get(aPod.Metadata.Name);
|
||||
pod.Should().Be(aPod);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using FluentAssertions;
|
||||
using k8s.Models;
|
||||
using k8s.Util.Informer.Cache;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
using Xunit.Sdk;
|
||||
|
||||
namespace k8s.Tests.Util.Informer.Cache
|
||||
{
|
||||
public class ReflectorTest
|
||||
{
|
||||
private readonly ITestOutputHelper _ouputHelper;
|
||||
|
||||
public ReflectorTest(ITestOutputHelper outputHelper)
|
||||
{
|
||||
_ouputHelper = outputHelper;
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Create default reflector success")]
|
||||
public void CreateReflectorSuccess()
|
||||
{
|
||||
/*using var apiClient = new Kubernetes(_clientConfiguration);
|
||||
var cache = new Cache<V1Pod>();
|
||||
var queue = new DeltaFifo(Caches.MetaNamespaceKeyFunc, cache, _deltasLogger);
|
||||
var listerWatcher = new ListWatcher<V1Pod, V1PodList>(apiClient, ListAllPods);
|
||||
var logger = LoggerFactory.Create(builder => builder.AddXUnit(_ouputHelper).SetMinimumLevel(LogLevel.Trace)).CreateLogger<k8s.Util.Cache.Reflector>();
|
||||
var reflector = new k8s.Util.Cache.Reflector<V1Pod, V1PodList>(listerWatcher, queue, logger);
|
||||
|
||||
reflector.Should().NotBeNull();*/
|
||||
}
|
||||
}
|
||||
}
|
||||
45
tests/KubernetesClient.Tests/Util/Informer/Cache/Util.cs
Normal file
45
tests/KubernetesClient.Tests/Util/Informer/Cache/Util.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using k8s.Models;
|
||||
|
||||
namespace k8s.Tests.Util.Informer.Cache
|
||||
{
|
||||
internal static class Util
|
||||
{
|
||||
internal static IEnumerable<V1Pod> CreatePods(int cnt)
|
||||
{
|
||||
var pods = new List<V1Pod>();
|
||||
for (var i = 0; i < cnt; i++)
|
||||
{
|
||||
pods.Add(new V1Pod()
|
||||
{
|
||||
ApiVersion = "Pod/V1",
|
||||
Kind = "Pod",
|
||||
Metadata = new V1ObjectMeta()
|
||||
{
|
||||
Name = Guid.NewGuid().ToString(),
|
||||
NamespaceProperty = "the-namespace",
|
||||
ResourceVersion = "1",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return pods;
|
||||
}
|
||||
|
||||
internal static V1PodList CreatePostList(int cnt)
|
||||
{
|
||||
return new V1PodList()
|
||||
{
|
||||
ApiVersion = "Pod/V1",
|
||||
Kind = "Pod",
|
||||
Metadata = new V1ListMeta()
|
||||
{
|
||||
ResourceVersion = "1",
|
||||
},
|
||||
Items = CreatePods(cnt).ToList(),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user