|
@@ -0,0 +1,160 @@
|
|
|
+// +build experimental
|
|
|
+
|
|
|
+package types
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+)
|
|
|
+
|
|
|
+// PluginConfig represents the values of settings potentially modifiable by a user
|
|
|
+type PluginConfig struct {
|
|
|
+ Mounts []PluginMount
|
|
|
+ Env []string
|
|
|
+ Args []string
|
|
|
+ Devices []PluginDevice
|
|
|
+}
|
|
|
+
|
|
|
+// Plugin represents a Docker plugin for the remote API
|
|
|
+type Plugin struct {
|
|
|
+ ID string `json:"Id,omitempty"`
|
|
|
+ Name string
|
|
|
+ Tag string
|
|
|
+ Active bool
|
|
|
+ Config PluginConfig
|
|
|
+ Manifest PluginManifest
|
|
|
+}
|
|
|
+
|
|
|
+// PluginsListResponse contains the response for the remote API
|
|
|
+type PluginsListResponse []*Plugin
|
|
|
+
|
|
|
+const (
|
|
|
+ authzDriver = "AuthzDriver"
|
|
|
+ graphDriver = "GraphDriver"
|
|
|
+ ipamDriver = "IpamDriver"
|
|
|
+ networkDriver = "NetworkDriver"
|
|
|
+ volumeDriver = "VolumeDriver"
|
|
|
+)
|
|
|
+
|
|
|
+// PluginInterfaceType represents a type that a plugin implements.
|
|
|
+type PluginInterfaceType struct {
|
|
|
+ Prefix string // This is always "docker"
|
|
|
+ Capability string // Capability should be validated against the above list.
|
|
|
+ Version string // Plugin API version. Depends on the capability
|
|
|
+}
|
|
|
+
|
|
|
+// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType
|
|
|
+func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error {
|
|
|
+ versionIndex := len(p)
|
|
|
+ prefixIndex := 0
|
|
|
+ if len(p) < 2 || p[0] != '"' || p[len(p)-1] != '"' {
|
|
|
+ return fmt.Errorf("%q is not a plugin interface type", p)
|
|
|
+ }
|
|
|
+ p = p[1 : len(p)-1]
|
|
|
+loop:
|
|
|
+ for i, b := range p {
|
|
|
+ switch b {
|
|
|
+ case '.':
|
|
|
+ prefixIndex = i
|
|
|
+ case '/':
|
|
|
+ versionIndex = i
|
|
|
+ break loop
|
|
|
+ }
|
|
|
+ }
|
|
|
+ t.Prefix = string(p[:prefixIndex])
|
|
|
+ t.Capability = string(p[prefixIndex+1 : versionIndex])
|
|
|
+ if versionIndex < len(p) {
|
|
|
+ t.Version = string(p[versionIndex+1:])
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// MarshalJSON implements json.Marshaler for PluginInterfaceType
|
|
|
+func (t *PluginInterfaceType) MarshalJSON() ([]byte, error) {
|
|
|
+ return json.Marshal(t.String())
|
|
|
+}
|
|
|
+
|
|
|
+// String implements fmt.Stringer for PluginInterfaceType
|
|
|
+func (t PluginInterfaceType) String() string {
|
|
|
+ return fmt.Sprintf("%s.%s/%s", t.Prefix, t.Capability, t.Version)
|
|
|
+}
|
|
|
+
|
|
|
+// PluginInterface describes the interface between Docker and plugin
|
|
|
+type PluginInterface struct {
|
|
|
+ Types []PluginInterfaceType
|
|
|
+ Socket string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginSetting is to be embedded in other structs, if they are supposed to be
|
|
|
+// modifiable by the user.
|
|
|
+type PluginSetting struct {
|
|
|
+ Name string
|
|
|
+ Description string
|
|
|
+ Settable []string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginNetwork represents the network configuration for a plugin
|
|
|
+type PluginNetwork struct {
|
|
|
+ Type string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginMount represents the mount configuration for a plugin
|
|
|
+type PluginMount struct {
|
|
|
+ PluginSetting
|
|
|
+ Source *string
|
|
|
+ Destination string
|
|
|
+ Type string
|
|
|
+ Options []string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginEnv represents an environment variable for a plugin
|
|
|
+type PluginEnv struct {
|
|
|
+ PluginSetting
|
|
|
+ Value *string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginArgs represents the command line arguments for a plugin
|
|
|
+type PluginArgs struct {
|
|
|
+ PluginSetting
|
|
|
+ Value []string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginDevice represents a device for a plugin
|
|
|
+type PluginDevice struct {
|
|
|
+ PluginSetting
|
|
|
+ Path *string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginUser represents the user for the plugin's process
|
|
|
+type PluginUser struct {
|
|
|
+ UID uint32 `json:"Uid,omitempty"`
|
|
|
+ GID uint32 `json:"Gid,omitempty"`
|
|
|
+}
|
|
|
+
|
|
|
+// PluginManifest represents the manifest of a plugin
|
|
|
+type PluginManifest struct {
|
|
|
+ ManifestVersion string
|
|
|
+ Description string
|
|
|
+ Documentation string
|
|
|
+ Interface PluginInterface
|
|
|
+ Entrypoint []string
|
|
|
+ Workdir string
|
|
|
+ User PluginUser `json:",omitempty"`
|
|
|
+ Network PluginNetwork
|
|
|
+ Capabilities []string
|
|
|
+ Mounts []PluginMount
|
|
|
+ Devices []PluginDevice
|
|
|
+ Env []PluginEnv
|
|
|
+ Args PluginArgs
|
|
|
+}
|
|
|
+
|
|
|
+// PluginPrivilege describes a permission the user has to accept
|
|
|
+// upon installing a plugin.
|
|
|
+type PluginPrivilege struct {
|
|
|
+ Name string
|
|
|
+ Description string
|
|
|
+ Value []string
|
|
|
+}
|
|
|
+
|
|
|
+// PluginPrivileges is a list of PluginPrivilege
|
|
|
+type PluginPrivileges []PluginPrivilege
|