package
1.10.5
Repository: https://github.com/hashicorp/nomad.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

This package provides an example implementation of a device plugin for reference.

Behavior

The example device plugin models files within a specified directory as devices. The plugin will periodically scan the directory for changes and will expose them via the streaming Fingerprint RPC. Device health is set to unhealthy if the file has a specific filemode permission as described by the config unhealthy_perm. Further statistics are also collected on the detected devices.

Installation

nomad_plugin_dir='/opt/nomad/plugins' # for example
go build -o $nomad_plugin_dir/nomad-device-example ./cmd

Config

Example client agent config with our plugin block:

client {
  enabled = true
}

plugin_dir = "/opt/nomad/plugins"

plugin "nomad-device-example" {
  config {
    dir            = "/tmp/nomad-device"
    list_period    = "1s"
    unhealthy_perm = "-rwxrwxrwx"
  }
}

The valid configuration options are:

  • dir (string: "."): The directory to scan for files that will represent fake devices.
  • list_period (string: "5s"): The interval to scan the directory for changes.
  • unhealthy_perm (string: "-rwxrwxrwx"): The file mode permission that if set on a detected file will casue the device to be considered unhealthy.

Usage

Create two instances of the device, one unhealthy:

mkdir -p /tmp/nomad-device
cd /tmp/nomad-device
touch device01 && chmod 0777 device01
touch device02

It should be fingerprinted by the client agent after the list_period, which you can check with:

nomad node status -json -self | jq '.NodeResources.Devices'
[
  {
    "Attributes": null,
    "Instances": [
      {
        "HealthDescription": "Device has bad permissions \"-rwxrwxrwx\"",
        "Healthy": false,
        "ID": "device01",
        "Locality": null
      },
      {
        "HealthDescription": "",
        "Healthy": true,
        "ID": "device02",
        "Locality": null
      }
    ],
    "Name": "mock",
    "Type": "file",
    "Vendor": "nomad"
  }
]

The value to put in job specification device block, or a quota specification, is "{Vendor}/{Type}/{Name}" i.e. "nomad/file/mock":

job.nomad.hcl:

job "job" {
  group "grp" {
    task "tsk" {
      driver = "..."
      config {}
      resources {
        device "nomad/file/mock" {
          count = 1
        }
      }
    }
  }
}

dev.quota.hcl:

name = "dev"
limit {
  region = "global"
  region_limit {
    device "nomad/file/mock" {
      count = 2 # to allow for deployments/reschedules
    }
  }
}