/// <summary>
        ///     Ensure that a PersistentVolumeClaim for data exists for the specified database server.
        /// </summary>
        /// <returns>
        ///     The PersistentVolumeClaim resource, as a <see cref="PersistentVolumeClaimV1"/>.
        /// </returns>
        public async Task <PersistentVolumeClaimV1> EnsureDataVolumeClaimPresent()
        {
            RequireCurrentState();

            PersistentVolumeClaimV1 existingPersistentVolumeClaim = await FindDataVolumeClaim();

            if (existingPersistentVolumeClaim != null)
            {
                Log.LogInformation("Found existing data-volume claim {PersistentVolumeClaimName} for server {ServerId}.",
                                   existingPersistentVolumeClaim.Metadata.Name,
                                   State.Id
                                   );

                return(existingPersistentVolumeClaim);
            }

            Log.LogInformation("Creating data-volume claim for server {ServerId}...",
                               State.Id
                               );

            PersistentVolumeClaimV1 createdPersistentVolumeClaim = await KubeClient.PersistentVolumeClaimsV1().Create(
                KubeResources.DataVolumeClaim(State,
                                              kubeNamespace: KubeOptions.KubeNamespace
                                              )
                );

            Log.LogInformation("Successfully created data-volume claim {PersistentVolumeClaimName} for server {ServerId}.",
                               createdPersistentVolumeClaim.Metadata.Name,
                               State.Id
                               );

            return(createdPersistentVolumeClaim);
        }
        /// <summary>
        ///     Ensure that a PersistentVolumeClaim for data does not exist for the specified database server.
        /// </summary>
        /// <returns>
        ///     <c>true</c>, if the controller is now absent; otherwise, <c>false</c>.
        /// </returns>
        public async Task <bool> EnsureDataVolumeClaimAbsent()
        {
            RequireCurrentState();

            PersistentVolumeClaimV1 dataVolumeClaim = await FindDataVolumeClaim();

            if (dataVolumeClaim == null)
            {
                return(true);
            }

            Log.LogInformation("Deleting data-volume claim {PersistentVolumeClaimName} for server {ServerId}...",
                               dataVolumeClaim.Metadata.Name,
                               State.Id
                               );

            try
            {
                await KubeClient.PersistentVolumeClaimsV1().Delete(
                    name: dataVolumeClaim.Metadata.Name,
                    kubeNamespace: KubeOptions.KubeNamespace,
                    propagationPolicy: DeletePropagationPolicy.Background
                    );

                string dataVolumeName = dataVolumeClaim.Spec.VolumeName;
                if (!String.IsNullOrWhiteSpace(dataVolumeClaim.Spec.VolumeName))
                {
                    Log.LogInformation("Deleting data volume {PersistentVolumeName} for server {ServerId}...",
                                       dataVolumeName,
                                       State.Id
                                       );

                    await KubeClient.PersistentVolumesV1().Delete(
                        name: dataVolumeName,
                        kubeNamespace: KubeOptions.KubeNamespace
                        );
                }
            }
            catch (HttpRequestException <StatusV1> deleteFailed)
            {
                Log.LogError("Failed to delete data-volume claim {PersistentVolumeClaimName} for server {ServerId} (Message:{FailureMessage}, Reason:{FailureReason}).",
                             dataVolumeClaim.Metadata.Name,
                             State.Id,
                             deleteFailed.Response.Message,
                             deleteFailed.Response.Reason
                             );

                return(false);
            }

            Log.LogInformation("Deleted data-volume claim {PersistentVolumeClaimName} for server {ServerId}.",
                               dataVolumeClaim.Metadata.Name,
                               State.Id
                               );

            return(true);
        }
        /// <summary>
        ///     Request creation of a <see cref="PersistentVolumeClaimV1"/>.
        /// </summary>
        /// <param name="newPersistentVolumeClaim">
        ///     A <see cref="PersistentVolumeClaimV1"/> representing the PersistentVolumeClaim to create.
        /// </param>
        /// <param name="cancellationToken">
        ///     An optional <see cref="CancellationToken"/> that can be used to cancel the request.
        /// </param>
        /// <returns>
        ///     A <see cref="PersistentVolumeClaimV1"/> representing the current state for the newly-created PersistentVolumeClaim.
        /// </returns>
        public async Task <PersistentVolumeClaimV1> Create(PersistentVolumeClaimV1 newPersistentVolumeClaim, CancellationToken cancellationToken = default)
        {
            if (newPersistentVolumeClaim == null)
            {
                throw new ArgumentNullException(nameof(newPersistentVolumeClaim));
            }

            return(await Http
                   .PostAsJsonAsync(
                       Requests.Collection.WithTemplateParameters(new
            {
                Namespace = newPersistentVolumeClaim?.Metadata?.Namespace ?? KubeClient.DefaultNamespace
            }),
                       postBody : newPersistentVolumeClaim,
                       cancellationToken : cancellationToken
                       )
                   .ReadContentAsAsync <PersistentVolumeClaimV1, StatusV1>());
        }