(feature): init
This commit is contained in:
commit
b37342cda1
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
266
.gitignore
vendored
Normal file
266
.gitignore
vendored
Normal file
@ -0,0 +1,266 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# DNX
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
#*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignoreable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
.directory
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush
|
||||
.cr/
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
|
||||
**/*docker-compose/LetsEncryptServer/acme
|
||||
**/*docker-compose/LetsEncryptServer/cache
|
||||
21
LICENSE.md
Normal file
21
LICENSE.md
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Maksym Sadovnychyy (MAKS-IT)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# Podman Client DotNet
|
||||
|
||||
Podman API .NET cilent implementation based on podman latest [documentation](https://docs.podman.io/en/latest/)
|
||||
36
src/PodmanClient/Extensions/ObjectExtensions.cs
Normal file
36
src/PodmanClient/Extensions/ObjectExtensions.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Extensions;
|
||||
|
||||
public static class ObjectExtensions {
|
||||
|
||||
/// <summary>
|
||||
/// Converts object to json string
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToJson<T>(this T? obj) => ToJson(obj, null);
|
||||
|
||||
/// <summary>
|
||||
/// Converts object to json string
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="obj"></param>
|
||||
/// <param name="converters"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToJson<T>(T? obj, List<JsonConverter>? converters) {
|
||||
if (obj == null)
|
||||
return "{}";
|
||||
|
||||
var options = new JsonSerializerOptions {
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
|
||||
};
|
||||
|
||||
converters?.ForEach(x => options.Converters.Add(x));
|
||||
|
||||
return JsonSerializer.Serialize(obj, options);
|
||||
}
|
||||
}
|
||||
35
src/PodmanClient/Extensions/StringExtensions.cs
Normal file
35
src/PodmanClient/Extensions/StringExtensions.cs
Normal file
@ -0,0 +1,35 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Extensions;
|
||||
|
||||
public static partial class StringExtensions {
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Converts JSON string to object
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
public static T? ToObject<T>(this string s) => ToObjectCore<T>(s, null);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="s"></param>
|
||||
/// <param name="converters"></param>
|
||||
/// <returns></returns>
|
||||
public static T? ToObject<T>(this string s, List<JsonConverter> converters) => ToObjectCore<T>(s, converters);
|
||||
|
||||
private static T? ToObjectCore<T>(string s, List<JsonConverter>? converters) {
|
||||
var options = new JsonSerializerOptions {
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
converters?.ForEach(x => options.Converters.Add(x));
|
||||
|
||||
return JsonSerializer.Deserialize<T>(s, options);
|
||||
}
|
||||
}
|
||||
18
src/PodmanClient/Models/AutoUserNsOptions.cs
Normal file
18
src/PodmanClient/Models/AutoUserNsOptions.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class AutoUserNsOptions {
|
||||
public List<IDMapping> AdditionalGIDMappings { get; set; }
|
||||
public List<IDMapping> AdditionalUIDMappings { get; set; }
|
||||
public string GroupFile { get; set; }
|
||||
public int InitialSize { get; set; }
|
||||
public string PasswdFile { get; set; }
|
||||
public int Size { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
16
src/PodmanClient/Models/BindOptions.cs
Normal file
16
src/PodmanClient/Models/BindOptions.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class BindOptions {
|
||||
public bool CreateMountpoint { get; set; }
|
||||
public bool NonRecursive { get; set; }
|
||||
public string Propagation { get; set; }
|
||||
public bool ReadOnlyForceRecursive { get; set; }
|
||||
public bool ReadOnlyNonRecursive { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
18
src/PodmanClient/Models/BlockIO.cs
Normal file
18
src/PodmanClient/Models/BlockIO.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class BlockIO {
|
||||
public int LeafWeight { get; set; }
|
||||
public List<ThrottleDevice> ThrottleReadBpsDevice { get; set; }
|
||||
public List<ThrottleDevice> ThrottleReadIopsDevice { get; set; }
|
||||
public List<ThrottleDevice> ThrottleWriteBpsDevice { get; set; }
|
||||
public List<ThrottleDevice> ThrottleWriteIopsDevice { get; set; }
|
||||
public int Weight { get; set; }
|
||||
public List<WeightDevice> WeightDevice { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
20
src/PodmanClient/Models/CPU.cs
Normal file
20
src/PodmanClient/Models/CPU.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class CPU {
|
||||
public int Burst { get; set; }
|
||||
public string Cpus { get; set; }
|
||||
public int Idle { get; set; }
|
||||
public string Mems { get; set; }
|
||||
public int Period { get; set; }
|
||||
public int Quota { get; set; }
|
||||
public int RealtimePeriod { get; set; }
|
||||
public int RealtimeRuntime { get; set; }
|
||||
public int Shares { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
129
src/PodmanClient/Models/Container/CreateContainerRequest.cs
Normal file
129
src/PodmanClient/Models/Container/CreateContainerRequest.cs
Normal file
@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Container {
|
||||
public class CreateContainerRequest {
|
||||
public Dictionary<string, string> Annotations { get; set; }
|
||||
public string ApparmorProfile { get; set; }
|
||||
public string BaseHostsFile { get; set; }
|
||||
public List<string> CapAdd { get; set; }
|
||||
public List<string> CapDrop { get; set; }
|
||||
public string CgroupParent { get; set; }
|
||||
public Namespace Cgroupns { get; set; }
|
||||
public string CgroupsMode { get; set; }
|
||||
public List<string> ChrootDirectories { get; set; }
|
||||
public List<string> CNINetworks { get; set; }
|
||||
public List<string> Command { get; set; }
|
||||
public string ConmonPidFile { get; set; }
|
||||
public List<string> ContainerCreateCommand { get; set; }
|
||||
public bool? CreateWorkingDir { get; set; }
|
||||
public List<string> DependencyContainers { get; set; }
|
||||
public List<LinuxDeviceCgroup> DeviceCgroupRule { get; set; }
|
||||
public List<LinuxDevice> Devices { get; set; }
|
||||
public List<string> DevicesFrom { get; set; }
|
||||
public List<string> DNSOption { get; set; }
|
||||
public List<string> DNSSearch { get; set; }
|
||||
public List<string> DNSServer { get; set; }
|
||||
public List<string> Entrypoint { get; set; }
|
||||
public Dictionary<string, string> Env { get; set; }
|
||||
public bool? EnvHost { get; set; }
|
||||
public List<string> EnvMerge { get; set; }
|
||||
public Dictionary<ushort, string> Expose { get; set; }
|
||||
public string GroupEntry { get; set; }
|
||||
public List<string> Groups { get; set; }
|
||||
public long? HealthCheckOnFailureAction { get; set; }
|
||||
public Schema2HealthConfig HealthConfig { get; set; }
|
||||
public List<LinuxDevice> HostDeviceList { get; set; }
|
||||
public List<string> HostAdd { get; set; }
|
||||
public string Hostname { get; set; }
|
||||
public List<string> HostUsers { get; set; }
|
||||
public bool? EnvHTTPProxy { get; set; }
|
||||
public IDMappingOptions IDMappings { get; set; }
|
||||
public string Image { get; set; }
|
||||
public string ImageArch { get; set; }
|
||||
public string ImageOS { get; set; }
|
||||
public string ImageVariant { get; set; }
|
||||
public string ImageVolumeMode { get; set; }
|
||||
public List<ImageVolume> ImageVolumes { get; set; }
|
||||
public bool? Init { get; set; }
|
||||
public string InitContainerType { get; set; }
|
||||
public string InitPath { get; set; }
|
||||
public LinuxIntelRdt IntelRdt { get; set; }
|
||||
public Namespace Ipcns { get; set; }
|
||||
public bool? LabelNested { get; set; }
|
||||
public Dictionary<string, string> Labels { get; set; }
|
||||
public LogConfigLibpod LogConfiguration { get; set; }
|
||||
public bool? ManagePassword { get; set; }
|
||||
public List<string> Mask { get; set; }
|
||||
public List<Mount> Mounts { get; set; }
|
||||
public string Name { get; set; }
|
||||
public Namespace Netns { get; set; }
|
||||
public Dictionary<string, string> NetworkOptions { get; set; }
|
||||
public Dictionary<string, NetworkSettings> Networks { get; set; }
|
||||
public bool? NoNewPrivileges { get; set; }
|
||||
public string OciRuntime { get; set; }
|
||||
public long? OomScoreAdj { get; set; }
|
||||
public List<OverlayVolume> OverlayVolumes { get; set; }
|
||||
public string PasswdEntry { get; set; }
|
||||
public LinuxPersonality Personality { get; set; }
|
||||
public Namespace Pidns { get; set; }
|
||||
public string Pod { get; set; }
|
||||
public List<PortMapping> Portmappings { get; set; }
|
||||
public bool? Privileged { get; set; }
|
||||
public List<string> ProcfsOpts { get; set; }
|
||||
public bool? PublishImagePorts { get; set; }
|
||||
public List<POSIXRlimit> RLimits { get; set; }
|
||||
public string RawImageName { get; set; }
|
||||
public bool? ReadOnlyFilesystem { get; set; }
|
||||
public bool? ReadWriteTmpfs { get; set; }
|
||||
public bool? Remove { get; set; }
|
||||
public LinuxResources ResourceLimits { get; set; }
|
||||
public string RestartPolicy { get; set; }
|
||||
public ulong? RestartTries { get; set; }
|
||||
public string Rootfs { get; set; }
|
||||
public string RootfsMapping { get; set; }
|
||||
public bool? RootfsOverlay { get; set; }
|
||||
public string RootfsPropagation { get; set; }
|
||||
public string SdnotifyMode { get; set; }
|
||||
public string SeccompPolicy { get; set; }
|
||||
public string SeccompProfilePath { get; set; }
|
||||
public Dictionary<string, string> SecretEnv { get; set; }
|
||||
public List<SecretProp> Secrets { get; set; }
|
||||
public List<string> SelinuxOpts { get; set; }
|
||||
public long? ShmSize { get; set; }
|
||||
public long? ShmSizeSystemd { get; set; }
|
||||
public StartupHealthConfig StartupHealthConfig { get; set; }
|
||||
public bool? Stdin { get; set; }
|
||||
public long? StopSignal { get; set; }
|
||||
public ulong? StopTimeout { get; set; }
|
||||
public Dictionary<string, string> StorageOpts { get; set; }
|
||||
public Dictionary<string, string> Sysctl { get; set; }
|
||||
public string Systemd { get; set; }
|
||||
public bool? Terminal { get; set; }
|
||||
public Dictionary<string, ulong> ThrottleReadBpsDevice { get; set; }
|
||||
public Dictionary<string, ulong> ThrottleReadIopsDevice { get; set; }
|
||||
public Dictionary<string, ulong> ThrottleWriteBpsDevice { get; set; }
|
||||
public Dictionary<string, ulong> ThrottleWriteIopsDevice { get; set; }
|
||||
public ulong? Timeout { get; set; }
|
||||
public string Timezone { get; set; }
|
||||
public string Umask { get; set; }
|
||||
public Dictionary<string, string> Unified { get; set; }
|
||||
public List<string> Unmask { get; set; }
|
||||
public List<string> Unsetenv { get; set; }
|
||||
public bool? Unsetenvall { get; set; }
|
||||
public bool? UseImageHosts { get; set; }
|
||||
public bool? UseImageResolvConf { get; set; }
|
||||
public string User { get; set; }
|
||||
public Namespace Userns { get; set; }
|
||||
public Namespace Utsns { get; set; }
|
||||
public bool? Volatile { get; set; }
|
||||
public List<NamedVolume> Volumes { get; set; }
|
||||
public List<string> VolumesFrom { get; set; }
|
||||
public Dictionary<string, ulong> WeightDevice { get; set; }
|
||||
public string WorkDir { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/Container/CreateContainerResponse.cs
Normal file
13
src/PodmanClient/Models/Container/CreateContainerResponse.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Container {
|
||||
public class CreateContainerResponse {
|
||||
public string Id { get; set; }
|
||||
|
||||
public string[] Warnings { get; set; }
|
||||
}
|
||||
}
|
||||
12
src/PodmanClient/Models/Container/DeleteContainerResponse.cs
Normal file
12
src/PodmanClient/Models/Container/DeleteContainerResponse.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Container {
|
||||
public class DeleteContainerResponse {
|
||||
public string Err { get; set; }
|
||||
public string Id { get; set; }
|
||||
}
|
||||
}
|
||||
13
src/PodmanClient/Models/DriverConfig.cs
Normal file
13
src/PodmanClient/Models/DriverConfig.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class DriverConfig {
|
||||
public string Name { get; set; }
|
||||
public Dictionary<string, string> Options { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/ErrorResponse.cs
Normal file
13
src/PodmanClient/Models/ErrorResponse.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class ErrorResponse {
|
||||
public string Cause { get; set; }
|
||||
public string Message { get; set; }
|
||||
public int Response { get; set; }
|
||||
}
|
||||
}
|
||||
22
src/PodmanClient/Models/Exec/CreateExecRequest.cs
Normal file
22
src/PodmanClient/Models/Exec/CreateExecRequest.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Exec
|
||||
{
|
||||
public class CreateExecRequest
|
||||
{
|
||||
public bool AttachStderr { get; set; }
|
||||
public bool AttachStdin { get; set; }
|
||||
public bool AttachStdout { get; set; }
|
||||
public string[] Cmd { get; set; }
|
||||
public string DetachKeys { get; set; }
|
||||
public string[] Env { get; set; }
|
||||
public bool Privileged { get; set; }
|
||||
public bool Tty { get; set; }
|
||||
public string User { get; set; }
|
||||
public string WorkingDir { get; set; }
|
||||
}
|
||||
}
|
||||
12
src/PodmanClient/Models/Exec/CreateExecResponse.cs
Normal file
12
src/PodmanClient/Models/Exec/CreateExecResponse.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Exec {
|
||||
public class CreateExecResponse {
|
||||
public string Id { get; set; } // The ID of the exec instance
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/Exec/InspectExecResponse.cs
Normal file
13
src/PodmanClient/Models/Exec/InspectExecResponse.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Exec {
|
||||
public class InspectExecResponse {
|
||||
public bool Running { get; set; }
|
||||
public int ExitCode { get; set; }
|
||||
public string ProcessConfig { get; set; } // Additional fields can be added based on your needs
|
||||
}
|
||||
}
|
||||
14
src/PodmanClient/Models/Exec/StartExecRequest.cs
Normal file
14
src/PodmanClient/Models/Exec/StartExecRequest.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Exec {
|
||||
public class StartExecRequest {
|
||||
public bool Detach { get; set; }
|
||||
public bool Tty { get; set; }
|
||||
public int? Height { get; set; } // Optional, nullable if not provided
|
||||
public int? Width { get; set; } // Optional, nullable if not provided
|
||||
}
|
||||
}
|
||||
12
src/PodmanClient/Models/HugepageLimit.cs
Normal file
12
src/PodmanClient/Models/HugepageLimit.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class HugepageLimit {
|
||||
public long Limit { get; set; }
|
||||
public string PageSize { get; set; }
|
||||
}
|
||||
}
|
||||
14
src/PodmanClient/Models/IDMapping.cs
Normal file
14
src/PodmanClient/Models/IDMapping.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class IDMapping {
|
||||
public int ContainerId { get; set; }
|
||||
public int HostId { get; set; }
|
||||
public int Size { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
18
src/PodmanClient/Models/IDMappingOptions.cs
Normal file
18
src/PodmanClient/Models/IDMappingOptions.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class IDMappingOptions {
|
||||
public bool AutoUserNs { get; set; }
|
||||
public AutoUserNsOptions AutoUserNsOpts { get; set; }
|
||||
public List<IDMapping> GIDMap { get; set; }
|
||||
public bool HostGIDMapping { get; set; }
|
||||
public bool HostUIDMapping { get; set; }
|
||||
public List<IDMapping> UIDMap { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
14
src/PodmanClient/Models/Image/ImagePullStatusResponse.cs
Normal file
14
src/PodmanClient/Models/Image/ImagePullStatusResponse.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Image {
|
||||
public class ImagePullStatusResponse {
|
||||
public string Status { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string Progress { get; set; }
|
||||
public ProgressDetail ProgressDetail { get; set; }
|
||||
}
|
||||
}
|
||||
11
src/PodmanClient/Models/Image/ImagePullStreamResponse.cs
Normal file
11
src/PodmanClient/Models/Image/ImagePullStreamResponse.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models.Image {
|
||||
public class ImagePullStreamResponse {
|
||||
public string Stream { get; set; }
|
||||
}
|
||||
}
|
||||
15
src/PodmanClient/Models/ImageVolume.cs
Normal file
15
src/PodmanClient/Models/ImageVolume.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class ImageVolume {
|
||||
public string Destination { get; set; }
|
||||
public bool ReadWrite { get; set; }
|
||||
public string Source { get; set; }
|
||||
public string SubPath { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
16
src/PodmanClient/Models/IntelRdt.cs
Normal file
16
src/PodmanClient/Models/IntelRdt.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class IntelRdt {
|
||||
public string ClosId { get; set; }
|
||||
public bool EnableCMT { get; set; }
|
||||
public bool EnableMBM { get; set; }
|
||||
public string L3CacheSchema { get; set; }
|
||||
public string MemBwSchema { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
18
src/PodmanClient/Models/LinuxDevice.cs
Normal file
18
src/PodmanClient/Models/LinuxDevice.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class LinuxDevice {
|
||||
public int FileMode { get; set; }
|
||||
public int Gid { get; set; }
|
||||
public int Major { get; set; }
|
||||
public int Minor { get; set; }
|
||||
public string Path { get; set; }
|
||||
public string Type { get; set; }
|
||||
public int Uid { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
16
src/PodmanClient/Models/LinuxDeviceCgroup.cs
Normal file
16
src/PodmanClient/Models/LinuxDeviceCgroup.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class LinuxDeviceCgroup {
|
||||
public string Access { get; set; }
|
||||
public bool Allow { get; set; }
|
||||
public int Major { get; set; }
|
||||
public int Minor { get; set; }
|
||||
public string Type { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
16
src/PodmanClient/Models/LinuxIntelRdt.cs
Normal file
16
src/PodmanClient/Models/LinuxIntelRdt.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class LinuxIntelRdt {
|
||||
public string ClosID { get; set; }
|
||||
public bool EnableCMT { get; set; }
|
||||
public bool EnableMBM { get; set; }
|
||||
public string L3CacheSchema { get; set; }
|
||||
public string MemBwSchema { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/LinuxPersonality.cs
Normal file
13
src/PodmanClient/Models/LinuxPersonality.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class LinuxPersonality {
|
||||
public string Domain { get; set; }
|
||||
public List<string> Flags { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
21
src/PodmanClient/Models/LinuxResources.cs
Normal file
21
src/PodmanClient/Models/LinuxResources.cs
Normal file
@ -0,0 +1,21 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class LinuxResources {
|
||||
public BlockIO BlockIO { get; set; }
|
||||
public CPU CPU { get; set; }
|
||||
public List<LinuxDeviceCgroup> Devices { get; set; }
|
||||
public List<HugepageLimit> HugepageLimits { get; set; }
|
||||
public Memory Memory { get; set; }
|
||||
public Network Network { get; set; }
|
||||
public Pids Pids { get; set; }
|
||||
public Dictionary<string, RdmaResource> Rdma { get; set; }
|
||||
public Dictionary<string, string> Unified { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
15
src/PodmanClient/Models/LogConfigLibpod.cs
Normal file
15
src/PodmanClient/Models/LogConfigLibpod.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class LogConfigLibpod {
|
||||
public string Driver { get; set; }
|
||||
public Dictionary<string, string> Options { get; set; }
|
||||
public string Path { get; set; }
|
||||
public long Size { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
20
src/PodmanClient/Models/Memory.cs
Normal file
20
src/PodmanClient/Models/Memory.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class Memory {
|
||||
public bool CheckBeforeUpdate { get; set; }
|
||||
public bool DisableOOMKiller { get; set; }
|
||||
public long Kernel { get; set; }
|
||||
public long KernelTCP { get; set; }
|
||||
public long Limit { get; set; }
|
||||
public long Reservation { get; set; }
|
||||
public long Swap { get; set; }
|
||||
public int Swappiness { get; set; }
|
||||
public bool UseHierarchy { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
20
src/PodmanClient/Models/Mount.cs
Normal file
20
src/PodmanClient/Models/Mount.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class Mount {
|
||||
public BindOptions BindOptions { get; set; }
|
||||
public string Consistency { get; set; }
|
||||
public bool ReadOnly { get; set; }
|
||||
public string Source { get; set; }
|
||||
public string Target { get; set; }
|
||||
public TmpfsOptions TmpfsOptions { get; set; }
|
||||
public string Type { get; set; }
|
||||
public VolumeOptions VolumeOptions { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
16
src/PodmanClient/Models/NamedVolume.cs
Normal file
16
src/PodmanClient/Models/NamedVolume.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class NamedVolume {
|
||||
public string Dest { get; set; }
|
||||
public bool IsAnonymous { get; set; }
|
||||
public string Name { get; set; }
|
||||
public List<string> Options { get; set; }
|
||||
public string SubPath { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/Namespace.cs
Normal file
13
src/PodmanClient/Models/Namespace.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class Namespace {
|
||||
public string Nsmode { get; set; }
|
||||
public string Value { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/Network.cs
Normal file
13
src/PodmanClient/Models/Network.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class Network {
|
||||
public int ClassID { get; set; }
|
||||
public List<NetworkPriority> Priorities { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/NetworkPriority.cs
Normal file
13
src/PodmanClient/Models/NetworkPriority.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class NetworkPriority {
|
||||
public string Name { get; set; }
|
||||
public int Priority { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
15
src/PodmanClient/Models/NetworkSettings.cs
Normal file
15
src/PodmanClient/Models/NetworkSettings.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class NetworkSettings {
|
||||
public List<string> Aliases { get; set; }
|
||||
public string InterfaceName { get; set; }
|
||||
public List<string> StaticIps { get; set; }
|
||||
public string StaticMac { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
14
src/PodmanClient/Models/OverlayVolume.cs
Normal file
14
src/PodmanClient/Models/OverlayVolume.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class OverlayVolume {
|
||||
public string Destination { get; set; }
|
||||
public List<string> Options { get; set; }
|
||||
public string Source { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
14
src/PodmanClient/Models/POSIXRlimit.cs
Normal file
14
src/PodmanClient/Models/POSIXRlimit.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class POSIXRlimit {
|
||||
public long Hard { get; set; }
|
||||
public long Soft { get; set; }
|
||||
public string Type { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
12
src/PodmanClient/Models/Pids.cs
Normal file
12
src/PodmanClient/Models/Pids.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class Pids {
|
||||
public int Limit { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
16
src/PodmanClient/Models/PortMapping.cs
Normal file
16
src/PodmanClient/Models/PortMapping.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class PortMapping {
|
||||
public int ContainerPort { get; set; }
|
||||
public string HostIp { get; set; }
|
||||
public int HostPort { get; set; }
|
||||
public string Protocol { get; set; }
|
||||
public int Range { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
12
src/PodmanClient/Models/ProgressDetail.cs
Normal file
12
src/PodmanClient/Models/ProgressDetail.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class ProgressDetail {
|
||||
public long? Current { get; set; }
|
||||
public long? Total { get; set; }
|
||||
}
|
||||
}
|
||||
13
src/PodmanClient/Models/RdmaResource.cs
Normal file
13
src/PodmanClient/Models/RdmaResource.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class RdmaResource {
|
||||
public int HcaHandles { get; set; }
|
||||
public int HcaObjects { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
17
src/PodmanClient/Models/Schema2HealthConfig.cs
Normal file
17
src/PodmanClient/Models/Schema2HealthConfig.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class Schema2HealthConfig {
|
||||
public long Interval { get; set; }
|
||||
public int Retries { get; set; }
|
||||
public long StartInterval { get; set; }
|
||||
public long StartPeriod { get; set; }
|
||||
public List<string> Test { get; set; }
|
||||
public long Timeout { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
13
src/PodmanClient/Models/SecretProp.cs
Normal file
13
src/PodmanClient/Models/SecretProp.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class SecretProp {
|
||||
public string Key { get; set; }
|
||||
public string Secret { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
18
src/PodmanClient/Models/StartupHealthConfig.cs
Normal file
18
src/PodmanClient/Models/StartupHealthConfig.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class StartupHealthConfig {
|
||||
public long Interval { get; set; }
|
||||
public int Retries { get; set; }
|
||||
public long StartInterval { get; set; }
|
||||
public long StartPeriod { get; set; }
|
||||
public int Successes { get; set; }
|
||||
public List<string> Test { get; set; }
|
||||
public long Timeout { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
14
src/PodmanClient/Models/ThrottleDevice.cs
Normal file
14
src/PodmanClient/Models/ThrottleDevice.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class ThrottleDevice {
|
||||
public int Major { get; set; }
|
||||
public int Minor { get; set; }
|
||||
public long Rate { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
14
src/PodmanClient/Models/TmpfsOptions.cs
Normal file
14
src/PodmanClient/Models/TmpfsOptions.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class TmpfsOptions {
|
||||
public int Mode { get; set; }
|
||||
public List<string> Options { get; set; }
|
||||
public long SizeBytes { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
15
src/PodmanClient/Models/VolumeOptions.cs
Normal file
15
src/PodmanClient/Models/VolumeOptions.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class VolumeOptions {
|
||||
public DriverConfig DriverConfig { get; set; }
|
||||
public Dictionary<string, string> Labels { get; set; }
|
||||
public bool NoCopy { get; set; }
|
||||
public string Subpath { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
15
src/PodmanClient/Models/WeightDevice.cs
Normal file
15
src/PodmanClient/Models/WeightDevice.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet.Models {
|
||||
public class WeightDevice {
|
||||
public int LeafWeight { get; set; }
|
||||
public int Major { get; set; }
|
||||
public int Minor { get; set; }
|
||||
public int Weight { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
10
src/PodmanClient/PodmanClientDotNet.csproj
Normal file
10
src/PodmanClient/PodmanClientDotNet.csproj
Normal file
@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>MaksIT.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
19
src/PodmanClient/PodmanConnector.cs
Normal file
19
src/PodmanClient/PodmanConnector.cs
Normal file
@ -0,0 +1,19 @@
|
||||
namespace MaksIT.PodmanClientDotNet {
|
||||
public partial class PodmanClient {
|
||||
private readonly HttpClient _httpClient;
|
||||
|
||||
public PodmanClient(string baseAddress, int timeOut) {
|
||||
_httpClient = new HttpClient();
|
||||
_httpClient.BaseAddress = new Uri(baseAddress);
|
||||
_httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
|
||||
_httpClient.Timeout = TimeSpan.FromMinutes(timeOut);
|
||||
}
|
||||
|
||||
public PodmanClient(HttpClient httpClient) {
|
||||
_httpClient = httpClient;
|
||||
_httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
|
||||
_httpClient.Timeout = TimeSpan.FromMinutes(60);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
503
src/PodmanClient/PodmanConnectorContainer.cs
Normal file
503
src/PodmanClient/PodmanConnectorContainer.cs
Normal file
@ -0,0 +1,503 @@
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
using MaksIT.PodmanClientDotNet.Extensions;
|
||||
|
||||
using MaksIT.PodmanClientDotNet.Models;
|
||||
using MaksIT.PodmanClientDotNet.Models.Container;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet {
|
||||
public partial class PodmanClient {
|
||||
public async Task<CreateContainerResponse> CreateContainerAsync(
|
||||
string name,
|
||||
string image,
|
||||
List<string> command = null,
|
||||
Dictionary<string, string> env = null,
|
||||
bool? remove = null,
|
||||
bool? stdin = null,
|
||||
bool? terminal = null,
|
||||
List<Mount> mounts = null,
|
||||
bool? privileged = null,
|
||||
string hostname = null,
|
||||
Namespace netns = null,
|
||||
List<PortMapping> portMappings = null,
|
||||
string restartPolicy = null,
|
||||
ulong? stopTimeout = null,
|
||||
List<string> capAdd = null,
|
||||
List<string> capDrop = null,
|
||||
List<string> dnsServers = null,
|
||||
List<string> dnsSearch = null,
|
||||
List<string> dnsOptions = null,
|
||||
bool? publishImagePorts = null,
|
||||
List<string> cniNetworks = null,
|
||||
Dictionary<string, string> labels = null,
|
||||
bool? readOnlyFilesystem = null,
|
||||
List<POSIXRlimit> rLimits = null,
|
||||
List<LinuxDevice> devices = null,
|
||||
string ociRuntime = null,
|
||||
string pod = null,
|
||||
bool? noNewPrivileges = null,
|
||||
string cgroupsMode = null,
|
||||
Dictionary<string, string> storageOpts = null,
|
||||
bool? unsetenvall = null,
|
||||
Dictionary<string, string> secretEnv = null,
|
||||
string timezone = null,
|
||||
Dictionary<string, string> sysctl = null,
|
||||
string seccompProfilePath = null,
|
||||
string seccompPolicy = null,
|
||||
Dictionary<string, string> annotations = null,
|
||||
string apparmorProfile = null,
|
||||
string baseHostsFile = null,
|
||||
string cgroupParent = null,
|
||||
Namespace cgroupns = null,
|
||||
List<string> chrootDirectories = null,
|
||||
string conmonPidFile = null,
|
||||
List<string> containerCreateCommand = null,
|
||||
bool? createWorkingDir = null,
|
||||
List<string> dependencyContainers = null,
|
||||
List<LinuxDeviceCgroup> deviceCgroupRule = null,
|
||||
List<string> devicesFrom = null,
|
||||
List<string> entrypoint = null,
|
||||
bool? envHost = null,
|
||||
List<string> envMerge = null,
|
||||
Dictionary<ushort, string> expose = null,
|
||||
string groupEntry = null,
|
||||
List<string> groups = null,
|
||||
long? healthCheckOnFailureAction = null,
|
||||
Schema2HealthConfig healthConfig = null,
|
||||
List<LinuxDevice> hostDeviceList = null,
|
||||
List<string> hostAdd = null,
|
||||
List<string> hostUsers = null,
|
||||
bool? envHTTPProxy = null,
|
||||
IDMappingOptions idMappings = null,
|
||||
string imageArch = null,
|
||||
string imageOS = null,
|
||||
string imageVariant = null,
|
||||
string imageVolumeMode = null,
|
||||
List<ImageVolume> imageVolumes = null,
|
||||
bool? init = null,
|
||||
string initContainerType = null,
|
||||
string initPath = null,
|
||||
LinuxIntelRdt intelRdt = null,
|
||||
Namespace ipcns = null,
|
||||
bool? labelNested = null,
|
||||
LogConfigLibpod logConfiguration = null,
|
||||
bool? managePassword = null,
|
||||
List<string> mask = null,
|
||||
Dictionary<string, string> networkOptions = null,
|
||||
Dictionary<string, NetworkSettings> networks = null,
|
||||
long? oomScoreAdj = null,
|
||||
List<OverlayVolume> overlayVolumes = null,
|
||||
string passwdEntry = null,
|
||||
LinuxPersonality personality = null,
|
||||
Namespace pidns = null,
|
||||
string rawImageName = null,
|
||||
bool? readWriteTmpfs = null,
|
||||
LinuxResources resourceLimits = null,
|
||||
ulong? restartTries = null,
|
||||
string rootfs = null,
|
||||
string rootfsMapping = null,
|
||||
bool? rootfsOverlay = null,
|
||||
string rootfsPropagation = null,
|
||||
string sdnotifyMode = null,
|
||||
List<SecretProp> secrets = null,
|
||||
List<string> selinuxOpts = null,
|
||||
long? shmSize = null,
|
||||
long? shmSizeSystemd = null,
|
||||
StartupHealthConfig startupHealthConfig = null,
|
||||
long? stopSignal = null,
|
||||
string systemd = null,
|
||||
Dictionary<string, ulong> throttleReadBpsDevice = null,
|
||||
Dictionary<string, ulong> throttleReadIopsDevice = null,
|
||||
Dictionary<string, ulong> throttleWriteBpsDevice = null,
|
||||
Dictionary<string, ulong> throttleWriteIopsDevice = null,
|
||||
ulong? timeout = null,
|
||||
string umask = null,
|
||||
Dictionary<string, string> unified = null,
|
||||
List<string> unmask = null,
|
||||
bool? useImageHosts = null,
|
||||
bool? useImageResolvConf = null,
|
||||
string user = null,
|
||||
Namespace userns = null,
|
||||
Namespace utsns = null,
|
||||
bool? volatileFlag = null,
|
||||
List<NamedVolume> volumes = null,
|
||||
List<string> volumesFrom = null,
|
||||
Dictionary<string, ulong> weightDevice = null,
|
||||
string workDir = null
|
||||
) {
|
||||
var createContainerParameters = new CreateContainerRequest {
|
||||
Name = name,
|
||||
Image = image,
|
||||
Command = command,
|
||||
Env = env,
|
||||
WorkDir = workDir,
|
||||
Remove = remove,
|
||||
Stdin = stdin,
|
||||
Terminal = terminal,
|
||||
Mounts = mounts,
|
||||
Privileged = privileged,
|
||||
Hostname = hostname,
|
||||
Netns = netns,
|
||||
Portmappings = portMappings,
|
||||
RestartPolicy = restartPolicy,
|
||||
StopTimeout = stopTimeout,
|
||||
CapAdd = capAdd,
|
||||
CapDrop = capDrop,
|
||||
DNSServer = dnsServers,
|
||||
DNSSearch = dnsSearch,
|
||||
DNSOption = dnsOptions,
|
||||
PublishImagePorts = publishImagePorts,
|
||||
CNINetworks = cniNetworks,
|
||||
Labels = labels,
|
||||
ReadOnlyFilesystem = readOnlyFilesystem,
|
||||
RLimits = rLimits,
|
||||
Devices = devices,
|
||||
OciRuntime = ociRuntime,
|
||||
Pod = pod,
|
||||
NoNewPrivileges = noNewPrivileges,
|
||||
CgroupsMode = cgroupsMode,
|
||||
StorageOpts = storageOpts,
|
||||
Unmask = unmask,
|
||||
Unsetenvall = unsetenvall,
|
||||
SecretEnv = secretEnv,
|
||||
Timezone = timezone,
|
||||
Sysctl = sysctl,
|
||||
SeccompProfilePath = seccompProfilePath,
|
||||
SeccompPolicy = seccompPolicy,
|
||||
Annotations = annotations,
|
||||
ApparmorProfile = apparmorProfile,
|
||||
BaseHostsFile = baseHostsFile,
|
||||
CgroupParent = cgroupParent,
|
||||
Cgroupns = cgroupns,
|
||||
ChrootDirectories = chrootDirectories,
|
||||
ConmonPidFile = conmonPidFile,
|
||||
ContainerCreateCommand = containerCreateCommand,
|
||||
CreateWorkingDir = createWorkingDir,
|
||||
DependencyContainers = dependencyContainers,
|
||||
DeviceCgroupRule = deviceCgroupRule,
|
||||
DevicesFrom = devicesFrom,
|
||||
Entrypoint = entrypoint,
|
||||
EnvHost = envHost,
|
||||
EnvMerge = envMerge,
|
||||
Expose = expose,
|
||||
GroupEntry = groupEntry,
|
||||
Groups = groups,
|
||||
HealthCheckOnFailureAction = healthCheckOnFailureAction,
|
||||
HealthConfig = healthConfig,
|
||||
HostDeviceList = hostDeviceList,
|
||||
HostAdd = hostAdd,
|
||||
HostUsers = hostUsers,
|
||||
EnvHTTPProxy = envHTTPProxy,
|
||||
IDMappings = idMappings,
|
||||
ImageArch = imageArch,
|
||||
ImageOS = imageOS,
|
||||
ImageVariant = imageVariant,
|
||||
ImageVolumeMode = imageVolumeMode,
|
||||
ImageVolumes = imageVolumes,
|
||||
Init = init,
|
||||
InitContainerType = initContainerType,
|
||||
InitPath = initPath,
|
||||
IntelRdt = intelRdt,
|
||||
Ipcns = ipcns,
|
||||
LabelNested = labelNested,
|
||||
LogConfiguration = logConfiguration,
|
||||
ManagePassword = managePassword,
|
||||
Mask = mask,
|
||||
NetworkOptions = networkOptions,
|
||||
Networks = networks,
|
||||
OomScoreAdj = oomScoreAdj,
|
||||
OverlayVolumes = overlayVolumes,
|
||||
PasswdEntry = passwdEntry,
|
||||
Personality = personality,
|
||||
Pidns = pidns,
|
||||
RawImageName = rawImageName,
|
||||
ReadWriteTmpfs = readWriteTmpfs,
|
||||
ResourceLimits = resourceLimits,
|
||||
RestartTries = restartTries,
|
||||
Rootfs = rootfs,
|
||||
RootfsMapping = rootfsMapping,
|
||||
RootfsOverlay = rootfsOverlay,
|
||||
RootfsPropagation = rootfsPropagation,
|
||||
SdnotifyMode = sdnotifyMode,
|
||||
Secrets = secrets,
|
||||
SelinuxOpts = selinuxOpts,
|
||||
ShmSize = shmSize,
|
||||
ShmSizeSystemd = shmSizeSystemd,
|
||||
StartupHealthConfig = startupHealthConfig,
|
||||
StopSignal = stopSignal,
|
||||
Systemd = systemd,
|
||||
ThrottleReadBpsDevice = throttleReadBpsDevice,
|
||||
ThrottleReadIopsDevice = throttleReadIopsDevice,
|
||||
ThrottleWriteBpsDevice = throttleWriteBpsDevice,
|
||||
ThrottleWriteIopsDevice = throttleWriteIopsDevice,
|
||||
Timeout = timeout,
|
||||
Umask = umask,
|
||||
Unified = unified,
|
||||
UseImageHosts = useImageHosts,
|
||||
UseImageResolvConf = useImageResolvConf,
|
||||
User = user,
|
||||
Userns = userns,
|
||||
Utsns = utsns,
|
||||
Volatile = volatileFlag,
|
||||
Volumes = volumes,
|
||||
VolumesFrom = volumesFrom,
|
||||
WeightDevice = weightDevice
|
||||
};
|
||||
|
||||
var jsonContent = new StringContent(JsonSerializer.Serialize(createContainerParameters), Encoding.UTF8, "application/json");
|
||||
var response = await _httpClient.PostAsync("/v1.41/libpod/containers/create", jsonContent);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
return JsonSerializer.Deserialize<CreateContainerResponse>(jsonResponse);
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.BadRequest:
|
||||
Console.WriteLine($"Bad parameter in request: {errorDetails?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such container: {errorDetails?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.Conflict:
|
||||
Console.WriteLine($"Conflict error in operation: {errorDetails?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine($"Error creating container: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public async Task StartContainerAsync(string containerId, string detachKeys = "ctrl-p,ctrl-q") {
|
||||
var response = await _httpClient.PostAsync(
|
||||
$"/v1.41/libpod/containers/{containerId}/start?detachKeys={Uri.EscapeDataString(detachKeys)}", null);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.NoContent:
|
||||
Console.WriteLine("Container started successfully.");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.NotModified:
|
||||
Console.WriteLine("Container was already started.");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
var errorContent404 = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails404 = errorContent404.ToObject<ErrorResponse>();
|
||||
Console.WriteLine($"Container not found: {errorDetails404?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
var errorContent500 = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails500 = errorContent500.ToObject<ErrorResponse>();
|
||||
Console.WriteLine($"Internal server error: {errorDetails500?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((int)response.StatusCode >= 400) {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = errorContent.ToObject<ErrorResponse>();
|
||||
Console.WriteLine($"Error starting container: {errorDetails?.Message}");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
}
|
||||
|
||||
public async Task StopContainerAsync(string containerId, int timeout = 10, bool ignoreAlreadyStopped = false) {
|
||||
var queryParams = $"?timeout={timeout}&Ignore={ignoreAlreadyStopped.ToString().ToLower()}";
|
||||
var response = await _httpClient.PostAsync($"/v1.41/libpod/containers/{containerId}/stop{queryParams}", null);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
if (response.StatusCode == System.Net.HttpStatusCode.NoContent) {
|
||||
Console.WriteLine("Container stopped successfully.");
|
||||
}
|
||||
else if (response.StatusCode == System.Net.HttpStatusCode.NotModified) {
|
||||
Console.WriteLine("Container was already stopped.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such container: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error stopping container: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task ForceDeleteContainerAsync(string containerId, bool deleteVolumes = false, int timeout = 10) {
|
||||
var queryParams = $"?force=true&v={deleteVolumes.ToString().ToLower()}&timeout={timeout}";
|
||||
var response = await _httpClient.DeleteAsync($"/v1.41/libpod/containers/{containerId}{queryParams}");
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
if (response.StatusCode == System.Net.HttpStatusCode.NoContent) {
|
||||
Console.WriteLine("Container force 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)) {
|
||||
Console.WriteLine($"Container {deleteResponse.Id} deleted successfully.");
|
||||
}
|
||||
else {
|
||||
Console.WriteLine($"Error deleting container {deleteResponse.Id}: {deleteResponse.Err}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.BadRequest:
|
||||
Console.WriteLine($"Bad parameter in request: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such container: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.Conflict:
|
||||
Console.WriteLine($"Conflict error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error deleting container: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task 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($"/v1.41/libpod/containers/{containerId}{queryParams}");
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
if (response.StatusCode == System.Net.HttpStatusCode.NoContent) {
|
||||
Console.WriteLine("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)) {
|
||||
Console.WriteLine($"Container {deleteResponse.Id} deleted successfully.");
|
||||
}
|
||||
else {
|
||||
Console.WriteLine($"Error deleting container {deleteResponse.Id}: {deleteResponse.Err}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.BadRequest:
|
||||
Console.WriteLine($"Bad parameter in request: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such container: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.Conflict:
|
||||
Console.WriteLine($"Conflict error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error deleting container: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode(); // Throws an exception if the response indicates an error
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public async Task ExtractArchiveToContainerAsync(string containerId, Stream tarStream, string path, bool pause = true) {
|
||||
var content = new StreamContent(tarStream);
|
||||
content.Headers.Add("Content-Type", "application/x-tar");
|
||||
|
||||
var queryParams = $"?path={Uri.EscapeDataString(path)}&pause={pause.ToString().ToLower()}";
|
||||
var response = await _httpClient.PutAsync($"/v1.41/libpod/containers/{containerId}/archive{queryParams}", content);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
Console.WriteLine("Files copied successfully to the container.");
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.BadRequest:
|
||||
Console.WriteLine($"Bad parameter in request: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.Forbidden:
|
||||
Console.WriteLine($"The container root filesystem is read-only: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such container: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error copying files: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
170
src/PodmanClient/PodmanConnectorExec.cs
Normal file
170
src/PodmanClient/PodmanConnectorExec.cs
Normal file
@ -0,0 +1,170 @@
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
using MaksIT.PodmanClientDotNet.Extensions;
|
||||
using MaksIT.PodmanClientDotNet.Models.Exec;
|
||||
using MaksIT.PodmanClientDotNet.Models;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet {
|
||||
public partial class PodmanClient {
|
||||
|
||||
public async Task<CreateExecResponse> CreateExecAsync(
|
||||
string containerName,
|
||||
string[] cmd,
|
||||
bool attachStderr = true,
|
||||
bool attachStdin = false,
|
||||
bool attachStdout = true,
|
||||
string detachKeys = null,
|
||||
string[] env = null,
|
||||
bool privileged = false,
|
||||
bool tty = false,
|
||||
string user = null,
|
||||
string workingDir = null
|
||||
) {
|
||||
// Construct the request object
|
||||
var execRequest = new CreateExecRequest {
|
||||
AttachStderr = attachStderr,
|
||||
AttachStdin = attachStdin,
|
||||
AttachStdout = attachStdout,
|
||||
Cmd = cmd,
|
||||
DetachKeys = detachKeys,
|
||||
Env = env,
|
||||
Privileged = privileged,
|
||||
Tty = tty,
|
||||
User = user,
|
||||
WorkingDir = workingDir
|
||||
};
|
||||
|
||||
// Serialize the request object to JSON
|
||||
var jsonRequest = execRequest.ToJson();
|
||||
var content = new StringContent(jsonRequest, Encoding.UTF8, "application/json");
|
||||
|
||||
// Create the request URL
|
||||
var requestUrl = $"/containers/{Uri.EscapeDataString(containerName)}/exec";
|
||||
|
||||
// Send the POST request
|
||||
var response = await _httpClient.PostAsync(requestUrl, content);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
return jsonResponse.ToObject<CreateExecResponse>();
|
||||
}
|
||||
else {
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
var errorResponse = JsonSerializer.Deserialize<ErrorResponse>(jsonResponse);
|
||||
|
||||
// Handle different response codes
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such container: {errorResponse?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.Conflict:
|
||||
Console.WriteLine($"Conflict error: {errorResponse?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorResponse?.Message}");
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine($"Error creating exec instance: {errorResponse?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task StartExecAsync(
|
||||
string execId,
|
||||
bool detach = false,
|
||||
bool tty = false,
|
||||
int? height = null,
|
||||
int? width = null,
|
||||
string outputFilePath = "exec_output.log"
|
||||
) {
|
||||
|
||||
outputFilePath = Path.Combine(Path.GetTempPath(), outputFilePath);
|
||||
|
||||
// Construct the request object
|
||||
var startExecRequest = new StartExecRequest {
|
||||
Detach = detach,
|
||||
Tty = tty,
|
||||
Height = height,
|
||||
Width = width
|
||||
};
|
||||
|
||||
// Serialize the request object to JSON
|
||||
var jsonRequest = JsonSerializer.Serialize(startExecRequest);
|
||||
var content = new StringContent(jsonRequest, Encoding.UTF8, "application/json");
|
||||
|
||||
// Create the request URL
|
||||
var requestUrl = $"/exec/{Uri.EscapeDataString(execId)}/start";
|
||||
|
||||
// Send the POST request
|
||||
var response = await _httpClient.PostAsync(requestUrl, content);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
// Write the response stream directly to a file
|
||||
using (var responseStream = await response.Content.ReadAsStreamAsync())
|
||||
using (var fileStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) {
|
||||
await responseStream.CopyToAsync(fileStream);
|
||||
}
|
||||
var test = File.ReadAllText(outputFilePath);
|
||||
Console.WriteLine($"Exec instance started and output written to {outputFilePath}");
|
||||
}
|
||||
else {
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
var errorResponse = JsonSerializer.Deserialize<ErrorResponse>(jsonResponse);
|
||||
|
||||
// Handle different response codes
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such exec instance: {errorResponse?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.Conflict:
|
||||
Console.WriteLine($"Conflict error: {errorResponse?.Message}");
|
||||
break;
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorResponse?.Message}");
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine($"Error starting exec instance: {errorResponse?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode(); // Throws an exception if the response indicates an error
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<InspectExecResponse?> InspectExecAsync(string execId) {
|
||||
var requestUrl = $"/exec/{Uri.EscapeDataString(execId)}/json";
|
||||
var response = await _httpClient.GetAsync(requestUrl);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
return jsonResponse.ToObject<InspectExecResponse>();
|
||||
}
|
||||
else {
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
var errorResponse = JsonSerializer.Deserialize<ErrorResponse>(jsonResponse);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such exec instance: {errorResponse?.Message}");
|
||||
return null;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorResponse?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error inspecting exec instance: {errorResponse?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
107
src/PodmanClient/PodmanConnectorImage.cs
Normal file
107
src/PodmanClient/PodmanConnectorImage.cs
Normal file
@ -0,0 +1,107 @@
|
||||
using System.Text.Json;
|
||||
|
||||
using MaksIT.PodmanClientDotNet.Models.Image;
|
||||
using MaksIT.PodmanClientDotNet.Models;
|
||||
|
||||
namespace MaksIT.PodmanClientDotNet {
|
||||
public partial class PodmanClient {
|
||||
|
||||
public async Task<List<ImagePullStatusResponse>> PullImageAsync(string reference, bool tlsVerify = true, bool quiet = false, string policy = "always", string arch = null, string os = null, string variant = null, bool allTags = false, string authHeader = null) {
|
||||
var query = $"reference={Uri.EscapeDataString(reference)}&tlsVerify={tlsVerify}&quiet={quiet}&policy={Uri.EscapeDataString(policy)}";
|
||||
if (!string.IsNullOrEmpty(arch)) query += $"&Arch={Uri.EscapeDataString(arch)}";
|
||||
if (!string.IsNullOrEmpty(os)) query += $"&OS={Uri.EscapeDataString(os)}";
|
||||
if (!string.IsNullOrEmpty(variant)) query += $"&Variant={Uri.EscapeDataString(variant)}";
|
||||
if (allTags) query += "&allTags=true";
|
||||
|
||||
if (!string.IsNullOrEmpty(authHeader)) {
|
||||
_httpClient.DefaultRequestHeaders.Add("X-Registry-Auth", authHeader);
|
||||
}
|
||||
|
||||
var response = await _httpClient.PostAsync($"/v1.41/libpod/images/pull?{query}", null);
|
||||
var imagePullResponses = new List<ImagePullStatusResponse>();
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
using var responseStream = await response.Content.ReadAsStreamAsync();
|
||||
using var reader = new StreamReader(responseStream);
|
||||
string line;
|
||||
|
||||
while ((line = await reader.ReadLineAsync()) != null) {
|
||||
if (line.Contains("\"status\"")) {
|
||||
// The line contains status information
|
||||
var statusResponse = JsonSerializer.Deserialize<ImagePullStatusResponse>(line);
|
||||
Console.WriteLine($"Status: {statusResponse.Status}");
|
||||
}
|
||||
else if (line.Contains("\"id\"") || line.Contains("\"images\"")) {
|
||||
// The line contains image ID information
|
||||
var imageResponse = JsonSerializer.Deserialize<ImagePullStatusResponse>(line);
|
||||
if (imageResponse != null) {
|
||||
imagePullResponses.Add(imageResponse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return imagePullResponses;
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.BadRequest:
|
||||
Console.WriteLine($"Bad request: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error pulling image: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task TagImageAsync(string image, string repo, string tag) {
|
||||
var response = await _httpClient.PostAsync($"/v1.41/libpod/images/{image}/tag?repo={Uri.EscapeDataString(repo)}&tag={Uri.EscapeDataString(tag)}", null);
|
||||
|
||||
if (response.IsSuccessStatusCode) {
|
||||
if (response.StatusCode == System.Net.HttpStatusCode.Created) {
|
||||
Console.WriteLine("Image tagged successfully.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
var errorDetails = JsonSerializer.Deserialize<ErrorResponse>(errorContent);
|
||||
|
||||
switch (response.StatusCode) {
|
||||
case System.Net.HttpStatusCode.BadRequest:
|
||||
Console.WriteLine($"Bad parameter in request: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.NotFound:
|
||||
Console.WriteLine($"No such image: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.Conflict:
|
||||
Console.WriteLine($"Conflict error in operation: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
case System.Net.HttpStatusCode.InternalServerError:
|
||||
Console.WriteLine($"Internal server error: {errorDetails?.Message}");
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine($"Error tagging image: {errorDetails?.Message}");
|
||||
break;
|
||||
}
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
25
src/PodmanClientDotNet.sln
Normal file
25
src/PodmanClientDotNet.sln
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.9.34902.65
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PodmanClientDotNet", "PodmanClient\PodmanClientDotNet.csproj", "{0833C90F-6BF3-40E4-A035-B6D6C81DB9D7}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{0833C90F-6BF3-40E4-A035-B6D6C81DB9D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0833C90F-6BF3-40E4-A035-B6D6C81DB9D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0833C90F-6BF3-40E4-A035-B6D6C81DB9D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0833C90F-6BF3-40E4-A035-B6D6C81DB9D7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {CFC10A81-CC42-4585-B549-1C2214AC18DA}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Loading…
Reference in New Issue
Block a user