Skip to content

Commit

Permalink
Finishes up the rest of the Plugin API surface. (#300)
Browse files Browse the repository at this point in the history
Implements the missing api's from REF: #298
Minor fixups to match the Docker.DotNet model closer.
Updates specgen to take into account these plugin types.

Resolves #163
  • Loading branch information
jterry75 authored and galvesribeiro committed Apr 2, 2018
1 parent 0a462eb commit 5970d5f
Show file tree
Hide file tree
Showing 19 changed files with 426 additions and 126 deletions.
91 changes: 79 additions & 12 deletions src/Docker.DotNet/Endpoints/IPluginOperations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public interface IPluginOperations
{
/// <summary>
/// List plugins.
///
/// Returns information about installed plugins.
/// </summary>
/// <remarks>
/// docker plugin ls
Expand All @@ -21,9 +23,24 @@ public interface IPluginOperations
/// 500 - Server error.
/// </remarks>
Task<IList<Plugin>> ListPluginsAsync(PluginListParameters parameters, CancellationToken cancellationToken = default(CancellationToken));


/// <summary>
/// Get plugin privileges.
/// </summary>
/// <remarks>
/// docker plugin privileges
///
/// HTTP POST /plugins/privileges
///
/// 200 - No error.
/// 500 - Server error.
/// </remarks>
Task<IList<PluginPrivilege>> GetPluginPrivilegesAsync(PluginGetPrivilegeParameters parameters, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Install a plugin.
///
/// Pulls and installs a plugin. After the plugin is installed, it can be enabled using the `POST /plugins/{name}/enable` endpoint.
/// </summary>
/// <remarks>
/// docker plugin pull
Expand All @@ -44,10 +61,11 @@ public interface IPluginOperations
/// HTTP GET /plugins/{name}/json
///
/// 200 - No error.
/// 404 - plugin is not installed.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
Task<Plugin> InspectPluginAsync(string id, CancellationToken cancellationToken = default(CancellationToken));
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task<Plugin> InspectPluginAsync(string name, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Remove a plugin.
Expand All @@ -58,9 +76,10 @@ public interface IPluginOperations
/// HTTP DELETE /plugins/{name}
///
/// 200 - No error.
/// 404 - plugin is not installed.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task RemovePluginAsync(string name, PluginRemoveParameters parameters, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
Expand All @@ -72,9 +91,10 @@ public interface IPluginOperations
/// HTTP POST /plugins/{name}/enable
///
/// 200 - No error.
/// 404 - plugin is not installed.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task EnablePluginAsync(string name, PluginEnableParameters parameters, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
Expand All @@ -86,23 +106,70 @@ public interface IPluginOperations
/// HTTP POST /plugins/{name}/disable
///
/// 200 - No error.
/// 404 - plugin is not installed.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
Task DisablePluginAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task DisablePluginAsync(string name, PluginDisableParameters parameters, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Get plugin privileges.
/// Upgrade a plugin.
/// </summary>
/// <remarks>
/// docker plugin privileges
/// docker plugin upgrade
///
/// HTTP POST /plugins/{name}/disable
/// HTTP POST /plugins/{name}/upgrade
///
/// 200 - No error.
/// 404 - plugin is not installed.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task UpgradePluginAsync(string name, PluginUpgradeParameters parameters, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Create a plugin.
/// </summary>
/// <remarks>
/// docker plugin create
///
/// HTTP POST /plugins/create
///
/// 200 - No error.
/// 500 - Server error.
/// </remarks>
Task CreatePluginAsync(PluginCreateParameters parameters, Stream plugin, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Push a plugin.
///
/// Push a plugin to the registry.
/// </summary>
/// <remarks>
/// docker plugin push
///
/// HTTP POST /plugins/{name}/push
///
/// 200 - No error.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task PushPluginAsync(string name, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Configure a plugin.
/// </summary>
/// <remarks>
/// docker plugin set
///
/// HTTP POST /plugins/{name}/set
///
/// 204 - No error.
/// 404 - Plugin not installed.
/// 500 - Server error.
/// </remarks>
Task<IList<PluginPrivilege>> GetPluginPrivilegesAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
/// <param name="name">The name of the plugin. The `:latest` tag is optional, and is the default if omitted.</param>
Task ConfigurePluginAsync(string name, PluginConfigureParameters parameters, CancellationToken cancellationToken = default(CancellationToken));
}
}
154 changes: 120 additions & 34 deletions src/Docker.DotNet/Endpoints/PluginOperations.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
Expand All @@ -26,75 +27,160 @@ internal PluginOperations(DockerClient client)
this._client = client;
}

public async Task<IList<Plugin>> ListPluginsAsync(PluginListParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
IQueryString queryParameters = parameters == null ? null : new QueryString<PluginListParameters>(parameters);
var response = await this._client.MakeRequestAsync(this._client.NoErrorHandlers, HttpMethod.Get, "plugins", queryParameters, cancellationToken).ConfigureAwait(false);
return this._client.JsonSerializer.DeserializeObject<Plugin[]>(response.Body);
}

public async Task<IList<PluginPrivilege>> GetPluginPrivilegesAsync(PluginGetPrivilegeParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
}

var query = new QueryString<PluginGetPrivilegeParameters>(parameters);
var response = await this._client.MakeRequestAsync(this._client.NoErrorHandlers, HttpMethod.Post, "plugins/privileges", query, cancellationToken).ConfigureAwait(false);
return this._client.JsonSerializer.DeserializeObject<PluginPrivilege[]>(response.Body);
}

public Task InstallPluginAsync(PluginInstallParameters parameters, IProgress<JSONMessage> progress, CancellationToken cancellationToken = default(CancellationToken))
{
if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
}

if (parameters.RequestBody == null)
if (parameters.Privileges == null)
{
throw new ArgumentNullException(nameof(parameters.RequestBody));
throw new ArgumentNullException(nameof(parameters.Privileges));
}

var data = new JsonRequestContent<IList<PluginPrivilege>>(parameters.RequestBody, this._client.JsonSerializer);
var data = new JsonRequestContent<IList<PluginPrivilege>>(parameters.Privileges, this._client.JsonSerializer);

IQueryString queryParameters = new QueryString<PluginInstallParameters>(parameters);
return StreamUtil.MonitorStreamForMessagesAsync(
this._client.MakeRequestForStreamAsync(this._client.NoErrorHandlers, HttpMethod.Post, $"plugins/pull", queryParameters, data, null, CancellationToken.None),
this._client,
cancellationToken,
progress);
}

public async Task<IList<Plugin>> ListPluginsAsync(PluginListParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
}

public async Task<Plugin> InspectPluginAsync(string name, CancellationToken cancellationToken)
{
IQueryString queryParameters = parameters == null ? null : new QueryString<PluginListParameters>(parameters);
var response = await this._client.MakeRequestAsync(this._client.NoErrorHandlers, HttpMethod.Get, "plugins", queryParameters, cancellationToken).ConfigureAwait(false);
return this._client.JsonSerializer.DeserializeObject<Plugin[]>(response.Body);
}

public Task RemovePluginAsync(string name, PluginRemoveParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

var response = await this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Get, $"plugins/{name}/json", cancellationToken);
return this._client.JsonSerializer.DeserializeObject<Plugin>(response.Body);
}

public Task RemovePluginAsync(string name, PluginRemoveParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

IQueryString queryParameters = parameters == null ? null : new QueryString<PluginRemoveParameters>(parameters);
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Delete, $"plugins/{name}", queryParameters, cancellationToken);
}

public Task EnablePluginAsync(string name, PluginEnableParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Delete, $"plugins/{name}", queryParameters, cancellationToken);
}

public Task EnablePluginAsync(string name, PluginEnableParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

IQueryString queryParameters = parameters == null ? null : new QueryString<PluginEnableParameters>(parameters);
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/enable", queryParameters, cancellationToken);
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/enable", queryParameters, cancellationToken);
}

public Task DisablePluginAsync(string name, PluginDisableParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

IQueryString queryParameters = parameters == null ? null : new QueryString<PluginDisableParameters>(parameters);
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/disable", queryParameters, cancellationToken);
}

public Task DisablePluginAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
public Task UpgradePluginAsync(string name, PluginUpgradeParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/disable", cancellationToken);
}

public Task<Plugin> InspectPluginAsync(string id, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}

public Task<IList<PluginPrivilege>> GetPluginPrivilegesAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
}

if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
}

if (parameters.Privileges == null)
{
throw new ArgumentNullException(nameof(parameters.Privileges));
}

var query = new QueryString<PluginUpgradeParameters>(parameters);
var data = new JsonRequestContent<IList<PluginPrivilege>>(parameters.Privileges, this._client.JsonSerializer);
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/upgrade", query, data, cancellationToken);
}

public Task CreatePluginAsync(PluginCreateParameters parameters, Stream plugin, CancellationToken cancellationToken = default(CancellationToken))
{
if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
}

if (plugin == null)
{
throw new ArgumentNullException(nameof(plugin));
}

var query = new QueryString<PluginCreateParameters>(parameters);
var data = new BinaryRequestContent(plugin, TarContentType);
return this._client.MakeRequestAsync(this._client.NoErrorHandlers, HttpMethod.Post, $"plugins/create", query, data, cancellationToken);
}

public Task PushPluginAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/push", cancellationToken);
}

public Task ConfigurePluginAsync(string name, PluginConfigureParameters parameters, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}

if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
}

if (parameters.Args == null)
{
throw new ArgumentNullException(nameof(parameters.Args));
}

var query = new QueryString<PluginConfigureParameters>(parameters);
var body = new JsonRequestContent<IList<string>>(parameters.Args, this._client.JsonSerializer);
return this._client.MakeRequestAsync(new[] { NoSuchPluginHandler }, HttpMethod.Post, $"plugins/{name}/set", query, cancellationToken);
}
}
}
2 changes: 1 addition & 1 deletion src/Docker.DotNet/Models/ImagePushParameters.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ public class ImagePushParameters // (main.ImagePushParameters)
public string Tag { get; set; }

[DataMember(Name = "RegistryAuth", EmitDefaultValue = false)]
public string RegistryAuth { get; set; }
public AuthConfig RegistryAuth { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ public class ImagesSearchParameters // (main.ImagesSearchParameters)
public string Term { get; set; }

[DataMember(Name = "RegistryAuth", EmitDefaultValue = false)]
public string RegistryAuth { get; set; }
public AuthConfig RegistryAuth { get; set; }
}
}
12 changes: 12 additions & 0 deletions src/Docker.DotNet/Models/PluginConfigureParameters.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class PluginConfigureParameters // (main.PluginConfigureParameters)
{
[DataMember(Name = "Args", EmitDefaultValue = false)]
public IList<string> Args { get; set; }
}
}
11 changes: 11 additions & 0 deletions src/Docker.DotNet/Models/PluginCreateParameters.Generated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Runtime.Serialization;

namespace Docker.DotNet.Models
{
[DataContract]
public class PluginCreateParameters // (main.PluginCreateParameters)
{
[QueryStringParameter("name", true)]
public string Name { get; set; }
}
}
Loading

0 comments on commit 5970d5f

Please sign in to comment.