# == define: cinder::backend::netapp
#
# Configures Cinder to use the NetApp unified volume driver
# Compatible for multiple backends
#
# === Parameters
#
# [*netapp_login*]
#   (required) Administrative user account name used to access the storage
#   system or proxy server.
#
# [*netapp_password*]
#   (required) Password for the administrative user account specified in the
#   netapp_login option.
#
# [*netapp_server_hostname*]
#   (required) The hostname (or IP address) for the storage system or proxy
#   server.
#
# [*volume_backend_name*]
#   (optional) The name of the cinder::backend::netapp resource
#   Defaults to $name.
#
# [*backend_availability_zone*]
#   (Optional) Availability zone for this volume backend.
#   If not set, the storage_availability_zone option value
#   is used as the default for all backends.
#   Defaults to $facts['os_service_default'].
#
# [*image_volume_cache_enabled*]
#   (Optional) Enable Cinder's image cache function for this backend.
#   Defaults to $facts['os_service_default'],
#
# [*image_volume_cache_max_size_gb*]
#   (Optional) Max size of the image volume cache for this backend in GB.
#   Defaults to $facts['os_service_default'],
#
# [*image_volume_cache_max_count*]
#   (Optional) Max number of entries allowed in the image volume cache.
#   Defaults to $facts['os_service_default'],
#
# [*reserved_percentage*]
#   (Optional) The percentage of backend capacity is reserved.
#   Defaults to $facts['os_service_default'].
#
# [*max_over_subscription_ratio*]
#   (Optional) Representation of the over subscription ratio when thin
#   provisionig is involved.
#   Defaults to $facts['os_service_default'].
#
# [*netapp_server_port*]
#   (optional) The TCP port to use for communication with the storage
#   system or proxy. If not specified, Data ONTAP drivers will use 80
#   for HTTP and 443 for HTTPS;
#   Defaults to $facts['os_service_default'].
#
# [*netapp_size_multiplier*]
#   (optional) The quantity to be multiplied by the requested volume size to
#   ensure enough space is available on the virtual storage server (Vserver) to
#   fulfill the volume creation request.
#   Defaults to $facts['os_service_default'].
#
# [*netapp_storage_family*]
#   (optional) The storage family type used on the storage system; valid value
#   is ontap_cluster for using clustered Data ONTAP.
#   Defaults to $facts['os_service_default'].
#
# [*netapp_storage_protocol*]
#   (optional) The storage protocol to be used on the data path with the storage
#   system. Valid values are iscsi, fc, nfs.
#   Defaults to nfs
#
# [*netapp_transport_type*]
#   (optional) The transport protocol used when communicating with the storage
#   system or proxy server. Valid values are http or https.
#   Defaults to $facts['os_service_default'].
#
# [*netapp_vserver*]
#   (optional) This option specifies the virtual storage server (Vserver)
#   name on the storage cluster on which provisioning of block storage volumes
#   should occur.
#   Defaults to $facts['os_service_default'].
#
# [*expiry_thres_minutes*]
#   (optional) This parameter specifies the threshold for last access time for
#   images in the NFS image cache. When a cache cleaning cycle begins, images
#   in the cache that have not been accessed in the last M minutes, where M is
#   the value of this parameter, will be deleted from the cache to create free
#   space on the NFS share.
#   Defaults to $facts['os_service_default'].
#
# [*thres_avl_size_perc_start*]
#   (optional) If the percentage of available space for an NFS share has
#   dropped below the value specified by this parameter, the NFS image cache
#   will be cleaned.
#   Defaults to $facts['os_service_default'].
#
# [*thres_avl_size_perc_stop*]
#   (optional) When the percentage of available space on an NFS share has
#   reached the percentage specified by this parameter, the driver will stop
#   clearing files from the NFS image cache that have not been accessed in the
#   last M minutes, where M is the value of the expiry_thres_minutes parameter.
#   Defaults to $facts['os_service_default'].
#
# [*nfs_shares*]
#   (optional) Array of NFS exports in the form of host:/share; will be written into
#    file specified in nfs_shares_config
#    Defaults to undef
#
# [*nfs_shares_config*]
#   (optional) File with the list of available NFS shares
#   Defaults to '/etc/cinder/shares.conf'
#
# [*nfs_mount_options*]
#   (optional) Mount options passed to the nfs client. See section
#   of the nfs man page for details.
#   Defaults to $facts['os_service_default']
#
# [*netapp_pool_name_search_pattern*]
#   (optional) This option is only utilized when the Cinder driver is
#   configured to use iSCSI or Fibre Channel. It is used to restrict
#   provisioning to the specified FlexVol volumes. Specify the value of this
#   option as a regular expression which will be applied to the names of
#   FlexVol volumes from the storage backend which represent pools in Cinder.
#   ^ (beginning of string) and $ (end of string) are implicitly wrapped around
#   the regular expression specified before filtering.
#   Defaults to $facts['os_service_default'].
#
# [*netapp_host_type*]
#   (optional) This option is used to define how the controllers will work with
#   the particular operating system on the hosts that are connected to it.
#   Defaults to $facts['os_service_default']
#
# [*nas_secure_file_operations*]
#   (Optional) Allow network-attached storage systems to operate in a secure
#   environment where root level access is not permitted. If set to False,
#   access is as the root user and insecure. If set to True, access is not as
#   root. If set to auto, a check is done to determine if this is a new
#   installation: True is used if so, otherwise False. Default is auto.
#   Defaults to $facts['os_service_default']
#
# [*nas_secure_file_permissions*]
#   (Optional) Set more secure file permissions on network-attached storage
#   volume files to restrict broad other/world access. If set to False,
#   volumes are created with open permissions. If set to True, volumes are
#   created with permissions for the cinder user and group (660). If set to
#   auto, a check is done to determine if this is a new installation: True is
#   used if so, otherwise False. Default is auto.
#   Defaults to $facts['os_service_default']
#
# [*manage_volume_type*]
#   (Optional) Whether or not manage Cinder Volume type.
#   If set to true, a Cinder Volume type will be created
#   with volume_backend_name=$volume_backend_name key/value.
#   Defaults to false.
#
# [*extra_options*]
#   (optional) Hash of extra options to pass to the backend stanza
#   Defaults to: {}
#   Example :
#     { 'netapp_backend/param1' => { 'value' => value1 } }
#
# DEPRECATED PARAMETERS
#
# [*netapp_copyoffload_tool_path*]
#   (optional) This option specifies the path of the NetApp Copy Offload tool
#   binary. Ensure that the binary has execute permissions set which allow the
#   effective user of the cinder-volume process to execute the file.
#   Defaults to undef
#
# === Examples
#
#  cinder::backend::netapp { 'myBackend':
#    netapp_login           => 'clusterAdmin',
#    netapp_password        => 'password',
#    netapp_server_hostname => 'netapp.mycorp.com',
#    netapp_server_port     => '443',
#    netapp_transport_type  => 'https',
#    netapp_vserver         => 'openstack-vserver',
#  }
#
# === Authors
#
# Bob Callaway <bob.callaway@netapp.com>
#
# === Copyright
#
# Copyright 2014 NetApp, Inc.
#
define cinder::backend::netapp (
  $netapp_login,
  $netapp_password,
  $netapp_server_hostname,
  $volume_backend_name                    = $name,
  $backend_availability_zone              = $facts['os_service_default'],
  $image_volume_cache_enabled             = $facts['os_service_default'],
  $image_volume_cache_max_size_gb         = $facts['os_service_default'],
  $image_volume_cache_max_count           = $facts['os_service_default'],
  $reserved_percentage                    = $facts['os_service_default'],
  $max_over_subscription_ratio            = $facts['os_service_default'],
  $netapp_server_port                     = $facts['os_service_default'],
  $netapp_size_multiplier                 = $facts['os_service_default'],
  $netapp_storage_family                  = $facts['os_service_default'],
  $netapp_storage_protocol                = 'nfs',
  $netapp_transport_type                  = $facts['os_service_default'],
  $netapp_vserver                         = $facts['os_service_default'],
  $expiry_thres_minutes                   = $facts['os_service_default'],
  $thres_avl_size_perc_start              = $facts['os_service_default'],
  $thres_avl_size_perc_stop               = $facts['os_service_default'],
  Optional[Array[String]] $nfs_shares     = undef,
  Stdlib::Absolutepath $nfs_shares_config = '/etc/cinder/shares.conf',
  $nfs_mount_options                      = $facts['os_service_default'],
  $netapp_host_type                       = $facts['os_service_default'],
  Boolean $manage_volume_type             = false,
  Hash $extra_options                     = {},
  $netapp_pool_name_search_pattern        = $facts['os_service_default'],
  $nas_secure_file_operations             = $facts['os_service_default'],
  $nas_secure_file_permissions            = $facts['os_service_default'],
  # DEPRECATED PARAMETERS
  $netapp_copyoffload_tool_path           = undef,
) {

  include cinder::deps

  if $netapp_copyoffload_tool_path != undef {
    warning("The netapp_copyoffload_tool_path parameter has been deprecated \
and will be removed in a future release.")
  }

  if $nfs_shares {
    file {$nfs_shares_config:
      content => join($nfs_shares, "\n"),
      require => Anchor['cinder::install::end'],
      notify  => Anchor['cinder::service::begin'],
    }
  }

  cinder_config {
    "${name}/nfs_mount_options":                value => $nfs_mount_options;
    "${name}/volume_backend_name":              value => $volume_backend_name;
    "${name}/backend_availability_zone":        value => $backend_availability_zone;
    "${name}/image_volume_cache_enabled":       value => $image_volume_cache_enabled;
    "${name}/image_volume_cache_max_size_gb":   value => $image_volume_cache_max_size_gb;
    "${name}/image_volume_cache_max_count":     value => $image_volume_cache_max_count;
    "${name}/reserved_percentage":              value => $reserved_percentage;
    "${name}/max_over_subscription_ratio":      value => $max_over_subscription_ratio;
    "${name}/volume_driver":                    value => 'cinder.volume.drivers.netapp.common.NetAppDriver';
    "${name}/netapp_login":                     value => $netapp_login;
    "${name}/netapp_password":                  value => $netapp_password, secret => true;
    "${name}/netapp_server_hostname":           value => $netapp_server_hostname;
    "${name}/netapp_server_port":               value => $netapp_server_port;
    "${name}/netapp_size_multiplier":           value => $netapp_size_multiplier;
    "${name}/netapp_storage_family":            value => $netapp_storage_family;
    "${name}/netapp_storage_protocol":          value => $netapp_storage_protocol;
    "${name}/netapp_transport_type":            value => $netapp_transport_type;
    "${name}/netapp_vserver":                   value => $netapp_vserver;
    "${name}/expiry_thres_minutes":             value => $expiry_thres_minutes;
    "${name}/thres_avl_size_perc_start":        value => $thres_avl_size_perc_start;
    "${name}/thres_avl_size_perc_stop":         value => $thres_avl_size_perc_stop;
    "${name}/nfs_shares_config":                value => $nfs_shares_config;
    "${name}/netapp_copyoffload_tool_path":     value => pick($netapp_copyoffload_tool_path, $facts['os_service_default']);
    "${name}/netapp_pool_name_search_pattern":  value => $netapp_pool_name_search_pattern;
    "${name}/netapp_host_type":                 value => $netapp_host_type;
    "${name}/nas_secure_file_operations":       value => $nas_secure_file_operations;
    "${name}/nas_secure_file_permissions":      value => $nas_secure_file_permissions;
  }

  if $manage_volume_type {
    cinder_type { $volume_backend_name:
      ensure     => present,
      properties => ["volume_backend_name=${volume_backend_name}"],
    }
  }

  create_resources('cinder_config', $extra_options)

}
