--- layout: docs page_title: Base Plugin description: Learn about how to author a Nomad plugin. --- # Base Plugin The base plugin is a special plugin type implemented by all plugins. It allows for common plugin operations such as defining a configuration schema and version information. ## Plugin API #### `PluginInfo() (*PluginInfoResponse, error)` A `PluginInfoResponse` contains meta data about the plugin. ```go PluginInfoResponse{ // Type is the plugin type which is implemented Type: PluginTypeDriver, // Plugin API versions supported by the plugin PluginApiVersions: []string{drivers.ApiVersion010}, // Version of the plugin PluginVersion: "0.1.0", // Name of the plugin Name: "foodriver", } ``` #### `ConfigSchema() (*hclspec.Spec, error)` The `ConfigSchema` function allows a plugin to tell Nomad the schema for its configuration. This configuration is given in a [plugin block][pluginblock] of the client configuration. The schema is defined with the [hclspec][hclspec] package. #### `SetConfig(config *Config) error` The `SetConfig` function is called when starting the plugin for the first time. The `Config` given has two different configuration fields. The first `PluginConfig`, is an encoded configuration from the `plugin` block of the client config. The second, `AgentConfig`, is the Nomad agent's configuration which is given to all plugins. ## HCL Specifications `*hclspec.Spec` is a struct that defines the schema to validate an HCL entity against. The full documentation of the different hcl attribute types can be found on the [hclspec godoc][hclspec]. For a basic example, lets look at the driver configuration for the raw_exec driver: ```hcl job "example" { ... driver = "raw_exec" config { command = "/bin/sleep" args = ["100"] } } ``` The `config` block is what is validated against the `hclspec.Spec`. It has two keys, command which takes a string attribute and args which takes an array attribute. The corresponding `*hclspec.Spec` would be: ```go spec := hclspec.NewObject(map[string]*hclspec.Spec{ "command": hclspec.NewAttr("command", "string", true), "args": hclspec.NewAttr("args", "list(string)", false), }) ``` [hclspec]: https://godoc.org/github.com/hashicorp/nomad/plugins/shared/hclspec [pluginblock]: /nomad/docs/configuration/plugin