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