Browse Source

Generate plugin types from the swagger spec.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Daniel Nephin 8 years ago
parent
commit
6f7b69b63f

+ 84 - 13
api/swagger.yaml

@@ -1118,11 +1118,15 @@ definitions:
 
   PluginMount:
     type: "object"
+    x-nullable: false
+    required: [Name, Description, Settable, Source, Destination, Type, Options]
     properties:
       Name:
         type: "string"
+        x-nullable: false
       Description:
         type: "string"
+        x-nullable: false
       Settable:
         type: "array"
         items:
@@ -1131,8 +1135,10 @@ definitions:
         type: "string"
       Destination:
         type: "string"
+        x-nullable: false
       Type:
         type: "string"
+        x-nullable: false
       Options:
         type: "array"
         items:
@@ -1140,11 +1146,15 @@ definitions:
 
   PluginDevice:
     type: "object"
+    required: [Name, Description, Settable, Path]
+    x-nullable: false
     properties:
       Name:
         type: "string"
+        x-nullable: false
       Description:
         type: "string"
+        x-nullable: false
       Settable:
         type: "array"
         items:
@@ -1152,22 +1162,61 @@ definitions:
       Path:
         type: "string"
 
+  PluginEnv:
+    type: "object"
+    x-nullable: false
+    required: [Name, Description, Settable, Value]
+    properties:
+      Name:
+        x-nullable: false
+        type: "string"
+      Description:
+        x-nullable: false
+        type: "string"
+      Settable:
+        type: "array"
+        items:
+          type: "string"
+      Value:
+        type: "string"
+
+  PluginInterfaceType:
+    type: "object"
+    x-nullable: false
+    required: [Prefix, Capability, Version]
+    properties:
+      Prefix:
+        type: "string"
+        x-nullable: false
+      Capability:
+        type: "string"
+        x-nullable: false
+      Version:
+        type: "string"
+        x-nullable: false
+
   Plugin:
     description: "A plugin for the Remote API"
     type: "object"
+    required: [Config, Enabled, Manifest, Name, Tag]
     properties:
       Id:
         type: "string"
       Name:
         type: "string"
+        x-nullable: false
       Tag:
         type: "string"
+        x-nullable: false
       Enabled:
         description: "True when the plugin is running. False when the plugin is not running, only installed."
         type: "boolean"
+        x-nullable: false
       Config:
         description: "Settings that can be modified by users."
         type: "object"
+        x-nullable: false
+        required: [Args, Devices, Env, Mounts]
         properties:
           Mounts:
             type: "array"
@@ -1188,40 +1237,67 @@ definitions:
       Manifest:
         description: "The manifest of a plugin."
         type: "object"
+        x-nullable: false
+        required:
+          - ManifestVersion
+          - Description
+          - Documentation
+          - Interface
+          - Entrypoint
+          - Workdir
+          - Network
+          - Capabilities
+          - Mounts
+          - Devices
+          - Env
+          - Args
         properties:
           ManifestVersion:
             type: "string"
+            x-nullable: false
           Description:
             type: "string"
+            x-nullable: false
           Documentation:
             type: "string"
+            x-nullable: false
           Interface:
             description: "The interface between Docker and the plugin"
+            x-nullable: false
             type: "object"
+            required: [Types, Socket]
             properties:
               Types:
                 type: "array"
                 items:
-                  type: "string"
+                  $ref: "#/definitions/PluginInterfaceType"
               Socket:
                 type: "string"
+                x-nullable: false
           Entrypoint:
             type: "array"
             items:
               type: "string"
           Workdir:
             type: "string"
+            x-nullable: false
           User:
             type: "object"
+            x-nullable: false
             properties:
               UID:
                 type: "integer"
+                format: "uint32"
               GID:
                 type: "integer"
+                format: "uint32"
           Network:
             type: "object"
+            x-nullable: false
+            required: [Type]
             properties:
               Type:
+                x-nullable: false
                 type: "string"
           Capabilities:
             type: "array"
@@ -1236,24 +1312,19 @@ definitions:
             items:
               $ref: "#/definitions/PluginDevice"
           Env:
-            type: "object"
-            properties:
-              Name:
-                type: "string"
-              Description:
-                type: "string"
-              Settable:
-                type: "array"
-                items:
-                  type: "string"
-              Value:
-                type: "string"
+            type: "array"
+            items:
+              $ref: "#/definitions/PluginEnv"
           Args:
             type: "object"
+            x-nullable: false
+            required: [Name, Description, Settable, Value]
             properties:
               Name:
+                x-nullable: false
                 type: "string"
               Description:
+                x-nullable: false
                 type: "string"
               Settable:
                 type: "array"

+ 9 - 0
api/types/client.go

@@ -314,3 +314,12 @@ type TaskListOptions struct {
 type PluginRemoveOptions struct {
 	Force bool
 }
+
+// PluginInstallOptions holds parameters to install a plugin.
+type PluginInstallOptions struct {
+	Disabled              bool
+	AcceptAllPermissions  bool
+	RegistryAuth          string // RegistryAuth is the base64 encoded credentials for the registry
+	PrivilegeFunc         RequestPrivilegeFunc
+	AcceptPermissionsFunc func(PluginPrivileges) (bool, error)
+}

+ 137 - 142
api/types/plugin.go

@@ -1,168 +1,163 @@
 package types
 
-import (
-	"encoding/json"
-	"fmt"
-)
-
-// PluginInstallOptions holds parameters to install a plugin.
-type PluginInstallOptions struct {
-	Disabled              bool
-	AcceptAllPermissions  bool
-	RegistryAuth          string // RegistryAuth is the base64 encoded credentials for the registry
-	PrivilegeFunc         RequestPrivilegeFunc
-	AcceptPermissionsFunc func(PluginPrivileges) (bool, error)
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+// Plugin A plugin for the Remote API
+// swagger:model Plugin
+type Plugin struct {
+
+	// config
+	// Required: true
+	Config PluginConfig `json:"Config"`
+
+	// True when the plugin is running. False when the plugin is not running, only installed.
+	// Required: true
+	Enabled bool `json:"Enabled"`
+
+	// Id
+	ID string `json:"Id,omitempty"`
+
+	// manifest
+	// Required: true
+	Manifest PluginManifest `json:"Manifest"`
+
+	// name
+	// Required: true
+	Name string `json:"Name"`
+
+	// tag
+	// Required: true
+	Tag string `json:"Tag"`
 }
 
-// PluginConfig represents the values of settings potentially modifiable by a user
+// PluginConfigSettings that can be modified by users.
+// swagger:model PluginConfig
 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
-	// Enabled is true when the plugin is running, is false when the plugin is not running, only installed.
-	Enabled  bool
-	Config   PluginConfig
-	Manifest PluginManifest
-}
+	// args
+	// Required: true
+	Args []string `json:"Args"`
 
-// 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
-}
+	// devices
+	// Required: true
+	Devices []PluginDevice `json:"Devices"`
 
-// 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
-}
+	// env
+	// Required: true
+	Env []string `json:"Env"`
 
-// MarshalJSON implements json.Marshaler for PluginInterfaceType
-func (t *PluginInterfaceType) MarshalJSON() ([]byte, error) {
-	return json.Marshal(t.String())
+	// mounts
+	// Required: true
+	Mounts []PluginMount `json:"Mounts"`
 }
 
-// String implements fmt.Stringer for PluginInterfaceType
-func (t PluginInterfaceType) String() string {
-	return fmt.Sprintf("%s.%s/%s", t.Prefix, t.Capability, t.Version)
-}
+// PluginManifestThe manifest of a plugin.
+// swagger:model PluginManifest
+type PluginManifest struct {
 
-// PluginInterface describes the interface between Docker and plugin
-type PluginInterface struct {
-	Types  []PluginInterfaceType
-	Socket string
-}
+	// args
+	// Required: true
+	Args PluginManifestArgs `json:"Args"`
 
-// 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
-}
+	// capabilities
+	// Required: true
+	Capabilities []string `json:"Capabilities"`
 
-// PluginNetwork represents the network configuration for a plugin
-type PluginNetwork struct {
-	Type string
-}
+	// description
+	// Required: true
+	Description string `json:"Description"`
 
-// PluginMount represents the mount configuration for a plugin
-type PluginMount struct {
-	PluginSetting
-	Source      *string
-	Destination string
-	Type        string
-	Options     []string
-}
+	// devices
+	// Required: true
+	Devices []PluginDevice `json:"Devices"`
 
-// PluginEnv represents an environment variable for a plugin
-type PluginEnv struct {
-	PluginSetting
-	Value *string
-}
+	// documentation
+	// Required: true
+	Documentation string `json:"Documentation"`
 
-// PluginArgs represents the command line arguments for a plugin
-type PluginArgs struct {
-	PluginSetting
-	Value []string
-}
+	// entrypoint
+	// Required: true
+	Entrypoint []string `json:"Entrypoint"`
+
+	// env
+	// Required: true
+	Env []PluginEnv `json:"Env"`
+
+	// interface
+	// Required: true
+	Interface PluginManifestInterface `json:"Interface"`
+
+	// manifest version
+	// Required: true
+	ManifestVersion string `json:"ManifestVersion"`
 
-// PluginDevice represents a device for a plugin
-type PluginDevice struct {
-	PluginSetting
-	Path *string
+	// mounts
+	// Required: true
+	Mounts []PluginMount `json:"Mounts"`
+
+	// network
+	// Required: true
+	Network PluginManifestNetwork `json:"Network"`
+
+	// user
+	User PluginManifestUser `json:"User,omitempty"`
+
+	// workdir
+	// Required: true
+	Workdir string `json:"Workdir"`
 }
 
-// PluginUser represents the user for the plugin's process
-type PluginUser struct {
-	UID uint32 `json:"Uid,omitempty"`
-	GID uint32 `json:"Gid,omitempty"`
+// PluginManifestArgsplugin manifest args
+// swagger:model PluginManifestArgs
+type PluginManifestArgs struct {
+
+	// description
+	// Required: true
+	Description string `json:"Description"`
+
+	// name
+	// Required: true
+	Name string `json:"Name"`
+
+	// settable
+	// Required: true
+	Settable []string `json:"Settable"`
+
+	// value
+	// Required: true
+	Value []string `json:"Value"`
 }
 
-// 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
+// PluginManifestInterfaceThe interface between Docker and the plugin
+// swagger:model PluginManifestInterface
+type PluginManifestInterface struct {
+
+	// socket
+	// Required: true
+	Socket string `json:"Socket"`
+
+	// types
+	// Required: true
+	Types []PluginInterfaceType `json:"Types"`
 }
 
-// PluginPrivilege describes a permission the user has to accept
-// upon installing a plugin.
-type PluginPrivilege struct {
-	Name        string
-	Description string
-	Value       []string
+// PluginManifestNetworkplugin manifest network
+// swagger:model PluginManifestNetwork
+type PluginManifestNetwork struct {
+
+	// type
+	// Required: true
+	Type string `json:"Type"`
 }
 
-// PluginPrivileges is a list of PluginPrivilege
-type PluginPrivileges []PluginPrivilege
+// PluginManifestUserplugin manifest user
+// swagger:model PluginManifestUser
+type PluginManifestUser struct {
+
+	// g ID
+	GID uint32 `json:"GID,omitempty"`
+
+	// UID
+	UID uint32 `json:"UID,omitempty"`
+}

+ 25 - 0
api/types/plugin_device.go

@@ -0,0 +1,25 @@
+package types
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+// PluginDevice plugin device
+// swagger:model PluginDevice
+type PluginDevice struct {
+
+	// description
+	// Required: true
+	Description string `json:"Description"`
+
+	// name
+	// Required: true
+	Name string `json:"Name"`
+
+	// path
+	// Required: true
+	Path *string `json:"Path"`
+
+	// settable
+	// Required: true
+	Settable []string `json:"Settable"`
+}

+ 25 - 0
api/types/plugin_env.go

@@ -0,0 +1,25 @@
+package types
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+// PluginEnv plugin env
+// swagger:model PluginEnv
+type PluginEnv struct {
+
+	// description
+	// Required: true
+	Description string `json:"Description"`
+
+	// name
+	// Required: true
+	Name string `json:"Name"`
+
+	// settable
+	// Required: true
+	Settable []string `json:"Settable"`
+
+	// value
+	// Required: true
+	Value *string `json:"Value"`
+}

+ 21 - 0
api/types/plugin_interface_type.go

@@ -0,0 +1,21 @@
+package types
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+// PluginInterfaceType plugin interface type
+// swagger:model PluginInterfaceType
+type PluginInterfaceType struct {
+
+	// capability
+	// Required: true
+	Capability string `json:"Capability"`
+
+	// prefix
+	// Required: true
+	Prefix string `json:"Prefix"`
+
+	// version
+	// Required: true
+	Version string `json:"Version"`
+}

+ 37 - 0
api/types/plugin_mount.go

@@ -0,0 +1,37 @@
+package types
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+// PluginMount plugin mount
+// swagger:model PluginMount
+type PluginMount struct {
+
+	// description
+	// Required: true
+	Description string `json:"Description"`
+
+	// destination
+	// Required: true
+	Destination string `json:"Destination"`
+
+	// name
+	// Required: true
+	Name string `json:"Name"`
+
+	// options
+	// Required: true
+	Options []string `json:"Options"`
+
+	// settable
+	// Required: true
+	Settable []string `json:"Settable"`
+
+	// source
+	// Required: true
+	Source *string `json:"Source"`
+
+	// type
+	// Required: true
+	Type string `json:"Type"`
+}

+ 64 - 0
api/types/plugin_responses.go

@@ -0,0 +1,64 @@
+package types
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// PluginsListResponse contains the response for the remote API
+type PluginsListResponse []*Plugin
+
+const (
+	authzDriver   = "AuthzDriver"
+	graphDriver   = "GraphDriver"
+	ipamDriver    = "IpamDriver"
+	networkDriver = "NetworkDriver"
+	volumeDriver  = "VolumeDriver"
+)
+
+// 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)
+}
+
+// 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

+ 2 - 1
hack/generate-swagger-api.sh

@@ -5,4 +5,5 @@ swagger generate model -f api/swagger.yaml \
     -t api -m types --skip-validator \
     -n Volume \
     -n Port \
-    -n ImageSummary
+    -n ImageSummary \
+    -n Plugin -n PluginDevice -n PluginMount -n PluginEnv -n PluginInterfaceType