# @summary
#   A define that manages a docker plugin
#
# @param plugin_name
#  This ensures whether the plugin is installed or not.
#  Note that the default behaviour of docker plugin
#  requires a plugin be disabled before it can be removed
#
# @param enabled
#  A setting to enable or disable an installed plugin.
#
# @param timeout
#  The number of seconds to wait when enabling a plugin
#
# @param plugin_alias
#  An alternative name to use for an installed plugin
#
# @param disable_on_install
#  Alters the default behaviour of enabling a plugin upon install
#
# @param disable_content_trust
#  Skip image verification
#
# @param grant_all_permissions
#  Grant all permissions necessary to run the plugin
#
# @param force_remove
#  Force the removal of an active plugin
#
# @param settings
#  Any additional settings to pass to the plugin during install
#
# @param ensure
#
define docker::plugin (
  Enum[present,absent] $ensure                = 'present',
  String               $plugin_name           = $title,
  Boolean              $enabled               = true,
  Optional[String]     $timeout               = undef,
  Optional[String]     $plugin_alias          = undef,
  Boolean              $disable_on_install    = false,
  Boolean              $disable_content_trust = true,
  Boolean              $grant_all_permissions = true,
  Boolean              $force_remove          = true,
  Array                $settings              = [],
) {
  include docker::params

  $docker_command = "${docker::params::docker_command} plugin"

  if ($facts['os']['family'] == 'windows') {
    fail('Feature not implemented on windows.')
  }

  if $ensure == 'present' {
    $docker_plugin_install_flags = docker_plugin_install_flags({
        plugin_name           => $plugin_name,
        plugin_alias          => $plugin_alias,
        disable_on_install    => $disable_on_install,
        disable_content_trust => $disable_content_trust,
        grant_all_permissions => $grant_all_permissions,
        settings              => $settings,
      }
    )

    $exec_install   = "${docker_command} install ${docker_plugin_install_flags}"
    $unless_install = "${docker_command} ls --format='{{.PluginReference}}' | grep -w ${plugin_name}"

    exec { "plugin install ${plugin_name}":
      command     => $exec_install,
      environment => 'HOME=/root',
      path        => ['/bin', '/usr/bin'],
      timeout     => 0,
      unless      => $unless_install,
    }
  } elsif $ensure == 'absent' {
    $docker_plugin_remove_flags = docker_plugin_remove_flags({
        plugin_name => $plugin_name,
        force_remove => $force_remove,
      }
    )

    $exec_rm   = "${docker_command} rm ${docker_plugin_remove_flags}"
    $onlyif_rm = "${docker_command} ls --format='{{.PluginReference}}' | grep -w ${plugin_name}"

    exec { "plugin remove ${plugin_name}":
      command     => $exec_rm,
      environment => 'HOME=/root',
      path        => ['/bin', '/usr/bin'],
      timeout     => 0,
      onlyif      => $onlyif_rm,
    }
  }

  if $enabled {
    $docker_plugin_enable_flags = docker_plugin_enable_flags({
        plugin_name  => $plugin_name,
        plugin_alias => $plugin_alias,
        timeout      => $timeout,
      }
    )

    $exec_enable   = "${docker_command} enable ${docker_plugin_enable_flags}"
    $onlyif_enable = "${docker_command} ls -f enabled=false --format='{{.PluginReference}}' | grep -w ${plugin_name}"

    exec { "plugin enable ${plugin_name}":
      command     => $exec_enable,
      environment => 'HOME=/root',
      path        => ['/bin', '/usr/bin'],
      timeout     => 0,
      onlyif      => $onlyif_enable,
    }
  } elsif $enabled == false {
    exec { "disable ${plugin_name}":
      command     => "${docker_command} disable ${plugin_name}",
      environment => 'HOME=/root',
      path        => ['/bin', '/usr/bin',],
      timeout     => 0,
      unless      => "${docker_command} ls -f enabled=false --format='{{.PluginReference}}' | grep -w ${plugin_name}",
    }
  }
}
