Пример #1
0
    public void EqualityAndInequality(
        string group1,
        string kind1,
        string ns1,
        string name1,
        string group2,
        string kind2,
        string ns2,
        string name2,
        bool shouldBeEqual)
    {
        var key1 = new GroupKindNamespacedName(group1, kind1, new NamespacedName(ns1, name1));
        var key2 = new GroupKindNamespacedName(group2, kind2, new NamespacedName(ns2, name2));

        var areEqual    = key1 == key2;
        var areNotEqual = key1 != key2;

#pragma warning disable CS1718 // Comparison made to same variable
        var sameEqual1    = key1 == key1;
        var sameNotEqual1 = key1 != key1;
        var sameEqual2    = key2 == key2;
        var sameNotEqual2 = key2 != key2;
#pragma warning restore CS1718 // Comparison made to same variable

        Assert.NotEqual(areNotEqual, areEqual);
        Assert.Equal(shouldBeEqual, areEqual);
        Assert.True(sameEqual1);
        Assert.False(sameNotEqual1);
        Assert.True(sameEqual2);
        Assert.False(sameNotEqual2);
    }
Пример #2
0
    public void NamespaceCanBeNull()
    {
        var resource = new V1ClusterRole(
            apiVersion: $"{V1ClusterRole.KubeGroup}/{V1ClusterRole.KubeApiVersion}",
            kind: V1ClusterRole.KubeKind,
            metadata: new V1ObjectMeta(
                name: "the-name"));

        var key = GroupKindNamespacedName.From(resource);

        Assert.Equal("rbac.authorization.k8s.io", key.Group);
        Assert.Equal("ClusterRole", key.Kind);
        Assert.Null(key.NamespacedName.Namespace);
        Assert.Equal("the-name", key.NamespacedName.Name);
    }
Пример #3
0
    public void GroupKindAndNamespacedNameFromResource()
    {
        var resource = new V1Role(
            apiVersion: $"{V1Role.KubeGroup}/{V1Role.KubeApiVersion}",
            kind: V1Role.KubeKind,
            metadata: new V1ObjectMeta(
                name: "the-name",
                namespaceProperty: "the-namespace"));

        var key = GroupKindNamespacedName.From(resource);

        Assert.Equal("rbac.authorization.k8s.io", key.Group);
        Assert.Equal("Role", key.Kind);
        Assert.Equal("the-namespace", key.NamespacedName.Namespace);
        Assert.Equal("the-name", key.NamespacedName.Name);
    }
Пример #4
0
    public void GroupCanBeEmpty()
    {
        var resource = new V1ConfigMap(
            apiVersion: V1ConfigMap.KubeApiVersion,
            kind: V1ConfigMap.KubeKind,
            metadata: new V1ObjectMeta(
                name: "the-name",
                namespaceProperty: "the-namespace"));

        var key = GroupKindNamespacedName.From(resource);

        Assert.Equal("", key.Group);
        Assert.Equal("ConfigMap", key.Kind);
        Assert.Equal("the-namespace", key.NamespacedName.Namespace);
        Assert.Equal("the-name", key.NamespacedName.Name);
    }
Пример #5
0
    public void NotifyWithPrimaryResourceCausesCacheEntryAndQueueItem()
    {
        var generator       = Mock.Of <IOperatorGenerator <TypicalResource> >();
        var typicalInformer = new FakeResourceInformer <TypicalResource>();
        var podInformer     = new FakeResourceInformer <V1Pod>();
        var addCalls        = new List <NamespacedName>();
        var queue           = new FakeQueue <NamespacedName>
        {
            OnAdd = addCalls.Add,
        };
        var cache = new OperatorCache <TypicalResource>();

        using var host = new HostBuilder()
                         .ConfigureServices(services =>
        {
            services
            .AddLogging()
            .AddKubernetesOperatorRuntime()
            .AddOperator <TypicalResource>(op =>
            {
                op.WithRelatedResource <V1Pod>();
                op.Configure(options => options.NewRateLimitingQueue = _ => queue);
            })
            .AddSingleton(generator)
            .AddSingleton <IResourceInformer <TypicalResource> >(typicalInformer)
            .AddSingleton <IResourceInformer <V1Pod> >(podInformer)
            .AddSingleton <IOperatorCache <TypicalResource> >(cache);
        })
                         .Build();

        var handler = host.Services.GetRequiredService <IOperatorHandler <TypicalResource> >();

        var typical = new TypicalResource
        {
            ApiVersion = $"{TypicalResource.KubeGroup}/{TypicalResource.KubeApiVersion}",
            Kind       = TypicalResource.KubeKind,
            Metadata   = new V1ObjectMeta(
                name: "test-name",
                namespaceProperty: "test-namespace")
        };

        var unrelatedPod = new V1Pod
        {
            ApiVersion = TypicalResource.KubeApiVersion,
            Kind       = TypicalResource.KubeKind,
            Metadata   = new V1ObjectMeta(
                name: "test-unrelated",
                namespaceProperty: "test-namespace")
        };

        var relatedPod = new V1Pod(

            apiVersion: TypicalResource.KubeApiVersion,
            kind: TypicalResource.KubeKind,
            metadata: new V1ObjectMeta(
                name: "test-related",
                namespaceProperty: "test-namespace",
                ownerReferences: new[]
        {
            new V1OwnerReference(
                uid: typical.Uid(),
                apiVersion: typical.ApiVersion,
                kind: typical.Kind,
                name: typical.Name())
        }));

        typicalInformer.Callback(WatchEventType.Added, typical);
        podInformer.Callback(WatchEventType.Added, unrelatedPod);
        podInformer.Callback(WatchEventType.Added, relatedPod);

        var expectedName = new NamespacedName("test-namespace", "test-name");

        Assert.Equal(new[] { expectedName, expectedName }, addCalls);

        Assert.True(cache.TryGetWorkItem(expectedName, out var cacheItem));

        Assert.Equal(typical, cacheItem.Resource);

        var related = Assert.Single(cacheItem.Related);

        Assert.Equal(GroupKindNamespacedName.From(relatedPod), related.Key);
        Assert.Equal(relatedPod, related.Value);
    }