/// <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);
        }