Skip to content

Commit c5e4bbf

Browse files
Implement List operations for KubectlGet
Add List<T> and ListAsync<T> methods to Kubectl and AsyncKubectl classes that support: - Listing namespaced and cluster-scoped resources - Label selector filtering (e.g., "app=test,tier=frontend") - Field selector filtering (e.g., "metadata.name=my-pod") - Pagination with limit and continue token Also update GenericClient.ListAsync and ListNamespacedAsync to pass through the filtering parameters to the underlying CustomObjects API. Co-authored-by: brendandburns <5751682+brendandburns@users.noreply.github.com>
1 parent 29af80a commit c5e4bbf

File tree

4 files changed

+442
-4
lines changed

4 files changed

+442
-4
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
namespace k8s.kubectl.beta;
2+
3+
public partial class AsyncKubectl
4+
{
5+
/// <summary>
6+
/// List Kubernetes resources of a specific type.
7+
/// </summary>
8+
/// <typeparam name="T">The type of Kubernetes resource list to get (e.g., V1PodList).</typeparam>
9+
/// <param name="namespace">The namespace to list resources from. If null, lists cluster-scoped resources or resources across all namespaces for namespaced resources.</param>
10+
/// <param name="labelSelector">A selector to restrict the list of returned objects by their labels. Defaults to everything.</param>
11+
/// <param name="fieldSelector">A selector to restrict the list of returned objects by their fields. Defaults to everything.</param>
12+
/// <param name="limit">Maximum number of responses to return for a list call.</param>
13+
/// <param name="continueToken">The continue option should be set when retrieving more results from the server.</param>
14+
/// <param name="cancellationToken">Cancellation token.</param>
15+
/// <returns>The list of requested resources.</returns>
16+
public async Task<T> ListAsync<T>(
17+
string? @namespace = null,
18+
string? labelSelector = null,
19+
string? fieldSelector = null,
20+
int? limit = null,
21+
string? continueToken = null,
22+
CancellationToken cancellationToken = default)
23+
where T : IKubernetesObject
24+
{
25+
var metadata = typeof(T).GetKubernetesTypeMetadata();
26+
using var genericClient = new GenericClient(client, metadata.Group, metadata.ApiVersion, metadata.PluralName, disposeClient: false);
27+
28+
return @namespace != null
29+
? await genericClient.ListNamespacedAsync<T>(@namespace, labelSelector, fieldSelector, limit, continueToken, cancellationToken).ConfigureAwait(false)
30+
: await genericClient.ListAsync<T>(labelSelector, fieldSelector, limit, continueToken, cancellationToken).ConfigureAwait(false);
31+
}
32+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace k8s.kubectl.beta;
2+
3+
public partial class Kubectl
4+
{
5+
/// <summary>
6+
/// List Kubernetes resources of a specific type.
7+
/// </summary>
8+
/// <typeparam name="T">The type of Kubernetes resource list to get (e.g., V1PodList).</typeparam>
9+
/// <param name="namespace">The namespace to list resources from. If null, lists cluster-scoped resources or resources across all namespaces for namespaced resources.</param>
10+
/// <param name="labelSelector">A selector to restrict the list of returned objects by their labels. Defaults to everything.</param>
11+
/// <param name="fieldSelector">A selector to restrict the list of returned objects by their fields. Defaults to everything.</param>
12+
/// <param name="limit">Maximum number of responses to return for a list call.</param>
13+
/// <param name="continueToken">The continue option should be set when retrieving more results from the server.</param>
14+
/// <returns>The list of requested resources.</returns>
15+
public T List<T>(
16+
string? @namespace = null,
17+
string? labelSelector = null,
18+
string? fieldSelector = null,
19+
int? limit = null,
20+
string? continueToken = null)
21+
where T : IKubernetesObject
22+
{
23+
return client.ListAsync<T>(@namespace, labelSelector, fieldSelector, limit, continueToken).GetAwaiter().GetResult();
24+
}
25+
}

src/KubernetesClient/GenericClient.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ public async Task<T> CreateNamespacedAsync<T>(T obj, string ns, CancellationToke
4242
return resp.Body;
4343
}
4444

45-
public async Task<T> ListAsync<T>(CancellationToken cancel = default)
45+
public async Task<T> ListAsync<T>(string labelSelector = null, string fieldSelector = null, int? limit = null, string continueToken = null, CancellationToken cancel = default)
4646
where T : IKubernetesObject
4747
{
48-
var resp = await kubernetes.CustomObjects.ListClusterCustomObjectWithHttpMessagesAsync<T>(group, version, plural, cancellationToken: cancel).ConfigureAwait(false);
48+
var resp = await kubernetes.CustomObjects.ListClusterCustomObjectWithHttpMessagesAsync<T>(group, version, plural, labelSelector: labelSelector, fieldSelector: fieldSelector, limit: limit, continueParameter: continueToken, cancellationToken: cancel).ConfigureAwait(false);
4949
return resp.Body;
5050
}
5151

52-
public async Task<T> ListNamespacedAsync<T>(string ns, CancellationToken cancel = default)
52+
public async Task<T> ListNamespacedAsync<T>(string ns, string labelSelector = null, string fieldSelector = null, int? limit = null, string continueToken = null, CancellationToken cancel = default)
5353
where T : IKubernetesObject
5454
{
55-
var resp = await kubernetes.CustomObjects.ListNamespacedCustomObjectWithHttpMessagesAsync<T>(group, version, ns, plural, cancellationToken: cancel).ConfigureAwait(false);
55+
var resp = await kubernetes.CustomObjects.ListNamespacedCustomObjectWithHttpMessagesAsync<T>(group, version, ns, plural, labelSelector: labelSelector, fieldSelector: fieldSelector, limit: limit, continueParameter: continueToken, cancellationToken: cancel).ConfigureAwait(false);
5656
return resp.Body;
5757
}
5858

0 commit comments

Comments
 (0)