/// <summary> /// Realizes a desired state by creating, updating and deleting resources as required. /// </summary> /// <param name="client">The client used to perform operations.</param> /// <param name="desired">The desired state to achieve.</param> /// <param name="labelSelector">A label selector to restrict the modifications to.</param> /// <param name="namespace">A namespace to restrict the modifications to.</param> /// <param name="cancellationToken">The cancellation token.</param> public static async Task RealizeStateAsync <TResource>(this ICustomResourceClient <TResource> client, IReadOnlyCollection <TResource> desired, string labelSelector = null, string @namespace = null, CancellationToken cancellationToken = default) where TResource : CustomResource, IPayloadPatchable <TResource> { var existing = await client.ListAsync(labelSelector, @namespace, cancellationToken); foreach (var resource in desired) { var existingResource = existing.FirstOrDefault(resource.NameEquals); if (existingResource == null) { await client.CreateAsync(resource, cancellationToken); } else if (!existingResource.Equals(resource)) { await client.UpdateAsync(resource, cancellationToken); } } foreach (var resource in existing.Where(desired.DoesNotContain)) { await client.DeleteAsync(resource.Metadata.Name, resource.Metadata.Namespace, cancellationToken); } }
private async Task SubscribeAsync() { var list = await _client.ListAsync(@namespace : _namespace); OnList(list); lock (_subscriptionLock) { _subscription?.Dispose(); _subscription = _client.Watch(_namespace, list.Metadata.ResourceVersion) .Subscribe(OnNext, OnError, OnCompleted); } _logger.LogDebug("Subscribed to {0}.", _crd); }