(bugfix): empty string json parse issue, code review

This commit is contained in:
Maksym Sadovnychyy 2024-08-18 18:46:18 +02:00
parent 6bcb99c40f
commit 03b71068bb
4 changed files with 90 additions and 47 deletions

View File

@ -6,11 +6,12 @@ using Microsoft.Extensions.Logging;
using MaksIT.PodmanClientDotNet.Models;
using MaksIT.PodmanClientDotNet.Models.Container;
using MaksIT.PodmanClientDotNet.Extensions;
using MaksIT.PodmanClientDotNet.Models.Exec;
namespace MaksIT.PodmanClientDotNet {
public partial class PodmanClient {
public async Task<CreateContainerResponse> CreateContainerAsync(
public async Task<CreateContainerResponse?> CreateContainerAsync(
string name,
string image,
List<string> command = null,
@ -252,7 +253,9 @@ namespace MaksIT.PodmanClientDotNet {
if (response.IsSuccessStatusCode) {
var jsonResponse = await response.Content.ReadAsStringAsync();
return jsonResponse.ToObject<CreateContainerResponse>();
return !string.IsNullOrWhiteSpace(jsonResponse)
? jsonResponse.ToObject<CreateContainerResponse>()
: null;
}
else {
var errorContent = await response.Content.ReadAsStringAsync();
@ -277,7 +280,6 @@ namespace MaksIT.PodmanClientDotNet {
}
response.EnsureSuccessStatusCode();
return null;
}
}
@ -288,6 +290,14 @@ namespace MaksIT.PodmanClientDotNet {
var response = await _httpClient.PostAsync(
$"/{_apiVersion}/libpod/containers/{containerId}/start?detachKeys={Uri.EscapeDataString(detachKeys)}", null);
if (response.IsSuccessStatusCode) {
var jsonResponse = await response.Content.ReadAsStringAsync();
}
else {
}
switch (response.StatusCode) {
case System.Net.HttpStatusCode.NoContent:
_logger.LogInformation("Container started successfully.");
@ -326,6 +336,8 @@ namespace MaksIT.PodmanClientDotNet {
var response = await _httpClient.PostAsync($"/{_apiVersion}/libpod/containers/{containerId}/stop{queryParams}", null);
if (response.IsSuccessStatusCode) {
var jsonResponse = await response.Content.ReadAsStringAsync();
if (response.StatusCode == System.Net.HttpStatusCode.NoContent) {
_logger.LogInformation("Container stopped successfully.");
}
@ -355,27 +367,15 @@ namespace MaksIT.PodmanClientDotNet {
}
}
public async Task ForceDeleteContainerAsync(string containerId, bool deleteVolumes = false, int timeout = 10) {
public async Task<DeleteContainerResponse[]?> ForceDeleteContainerAsync(string containerId, bool deleteVolumes = false, int timeout = 10) {
var queryParams = $"?force=true&v={deleteVolumes.ToString().ToLower()}&timeout={timeout}";
var response = await _httpClient.DeleteAsync($"/{_apiVersion}/libpod/containers/{containerId}{queryParams}");
if (response.IsSuccessStatusCode) {
if (response.StatusCode == System.Net.HttpStatusCode.NoContent) {
_logger.LogInformation("Container force deleted successfully.");
}
else if (response.StatusCode == System.Net.HttpStatusCode.OK) {
var responseContent = await response.Content.ReadAsStringAsync();
var deleteResponses = responseContent.ToObject<DeleteContainerResponse[]>();
foreach (var deleteResponse in deleteResponses) {
if (string.IsNullOrEmpty(deleteResponse.Err)) {
_logger.LogInformation($"Container {deleteResponse.Id} deleted successfully.");
}
else {
_logger.LogError($"Error deleting container {deleteResponse.Id}: {deleteResponse.Err}");
}
}
}
var jsonResponse = await response.Content.ReadAsStringAsync();
return !string.IsNullOrWhiteSpace(jsonResponse)
? jsonResponse.ToObject<DeleteContainerResponse[]>()
: null;
}
else {
var errorContent = await response.Content.ReadAsStringAsync();
@ -404,34 +404,23 @@ namespace MaksIT.PodmanClientDotNet {
}
response.EnsureSuccessStatusCode();
return null;
}
}
public async Task DeleteContainerAsync(string containerId, bool depend = false, bool ignore = false, int timeout = 10) {
public async Task<DeleteContainerResponse[]?> DeleteContainerAsync(string containerId, bool depend = false, bool ignore = false, int timeout = 10) {
var queryParams = $"?depend={depend.ToString().ToLower()}&ignore={ignore.ToString().ToLower()}&timeout={timeout}";
var response = await _httpClient.DeleteAsync($"/libpod/containers/{containerId}{queryParams}");
var response = await _httpClient.DeleteAsync($"/{_apiVersion}/containers/{containerId}{queryParams}");
if (response.IsSuccessStatusCode) {
if (response.StatusCode == System.Net.HttpStatusCode.NoContent) {
_logger.LogInformation("Container deleted successfully.");
}
else if (response.StatusCode == System.Net.HttpStatusCode.OK) {
var responseContent = await response.Content.ReadAsStringAsync();
var deleteResponses = JsonSerializer.Deserialize<DeleteContainerResponse[]>(responseContent);
foreach (var deleteResponse in deleteResponses) {
if (string.IsNullOrEmpty(deleteResponse.Err)) {
_logger.LogInformation($"Container {deleteResponse.Id} deleted successfully.");
}
else {
_logger.LogInformation($"Error deleting container {deleteResponse.Id}: {deleteResponse.Err}");
}
}
}
var jsonResponse = await response.Content.ReadAsStringAsync();
return !string.IsNullOrWhiteSpace(jsonResponse)
? jsonResponse.ToObject<DeleteContainerResponse []>()
: null;
}
else {
var errorContent = await response.Content.ReadAsStringAsync();
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
var errorDetails = errorContent.ToObject<ErrorResponse>();
switch (response.StatusCode) {
case System.Net.HttpStatusCode.BadRequest:
@ -455,7 +444,8 @@ namespace MaksIT.PodmanClientDotNet {
break;
}
response.EnsureSuccessStatusCode(); // Throws an exception if the response indicates an error
response.EnsureSuccessStatusCode();
return null;
}
}
@ -469,7 +459,8 @@ namespace MaksIT.PodmanClientDotNet {
var response = await _httpClient.PutAsync($"/{_apiVersion}/libpod/containers/{containerId}/archive{queryParams}", content);
if (response.IsSuccessStatusCode) {
_logger.LogInformation("Files copied successfully to the container.");
var stringResponse = await response.Content.ReadAsStringAsync();
_logger.LogInformation($"Files copied successfully to the container.\n\n{stringResponse}".Trim());
}
else {
var errorContent = await response.Content.ReadAsStringAsync();

View File

@ -8,7 +8,7 @@
<!-- NuGet package metadata -->
<PackageId>PodmanClient.DotNet</PackageId>
<Version>1.0.3</Version>
<Version>1.0.4</Version>
<Authors>Maksym Sadovnychyy</Authors>
<Company>MAKS-IT</Company>
<Product>PodmanClient.DotNet</Product>

View File

@ -10,7 +10,7 @@ using MaksIT.PodmanClientDotNet.Extensions;
namespace MaksIT.PodmanClientDotNet {
public partial class PodmanClient {
public async Task<CreateExecResponse> CreateExecAsync(
public async Task<CreateExecResponse?> CreateExecAsync(
string containerName,
string[] cmd,
bool attachStderr = true,
@ -49,7 +49,9 @@ namespace MaksIT.PodmanClientDotNet {
if (response.IsSuccessStatusCode) {
var jsonResponse = await response.Content.ReadAsStringAsync();
return jsonResponse.ToObject<CreateExecResponse>();
return !string.IsNullOrWhiteSpace(jsonResponse)
? jsonResponse.ToObject<CreateExecResponse>()
: null;
}
else {
var jsonResponse = await response.Content.ReadAsStringAsync();
@ -103,8 +105,7 @@ namespace MaksIT.PodmanClientDotNet {
if (response.IsSuccessStatusCode) {
var stringResponse = await response.Content.ReadAsStringAsync();
_logger.LogInformation(stringResponse);
_logger.LogInformation($"Command executed successfully.\n\n{stringResponse}".Trim());
}
else {
var jsonResponse = await response.Content.ReadAsStringAsync();
@ -137,7 +138,9 @@ namespace MaksIT.PodmanClientDotNet {
if (response.IsSuccessStatusCode) {
var jsonResponse = await response.Content.ReadAsStringAsync();
return jsonResponse.ToObject<InspectExecResponse>();
return !string.IsNullOrWhiteSpace(jsonResponse)
? jsonResponse.ToObject<InspectExecResponse>()
: null;
}
else {
var jsonResponse = await response.Content.ReadAsStringAsync();

View File

@ -0,0 +1,49 @@
#!/bin/sh
# Retrieve the API key from the environment variable
apiKey=$NUGET_MAKS_IT
if [ -z "$apiKey" ]; then
echo "Error: API key not found in environment variable NUGET_MAKS_IT."
exit 1
fi
# NuGet source
nugetSource="https://api.nuget.org/v3/index.json"
# Define paths
scriptDir=$(dirname "$0")
solutionDir=$(realpath "$scriptDir")
projectDir="$solutionDir/PodmanClient"
outputDir="$projectDir/bin/Release"
# Clean previous builds
echo "Cleaning previous builds..."
dotnet clean "$projectDir" -c Release
# Build the project
echo "Building the project..."
dotnet build "$projectDir" -c Release
# Pack the NuGet package
echo "Packing the project..."
dotnet pack "$projectDir" -c Release --no-build
# Look for the .nupkg file
packageFile=$(find "$outputDir" -name "*.nupkg" -print0 | xargs -0 ls -t | head -n 1)
if [ -n "$packageFile" ]; then
echo "Package created successfully: $packageFile"
# Push the package to NuGet
echo "Pushing the package to NuGet..."
dotnet nuget push "$packageFile" -k "$apiKey" -s "$nugetSource" --skip-duplicate
if [ $? -eq 0 ]; then
echo "Package pushed successfully."
else
echo "Failed to push the package."
fi
else
echo "Package creation failed. No .nupkg file found."
exit 1
fi