#!/bin/sh # # # NVMe-oF (rdma, tcp, fc) OCF RA. Exports and manages NVMe targets. # # (c) 2021 LINBIT HA-Solutions GmbH, written by Philipp Reisner # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it would be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Further, this software is distributed without any warranty that it is # free of the rightful claim of any third person regarding infringement # or the like. Any license provided herein, whether implied or # otherwise, applies only to this software file. Patent licenses, if # any, provided herein do not apply to combinations of this program with # other software, or any other product whatsoever. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. # ####################################################################### # Initialization: : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs OCF_RESKEY_namespace_id_default="1" : ${OCF_RESKEY_namespace_id=${OCF_RESKEY_namespace_id_default}} OCF_RESKEY_nguid_default="" : ${OCF_RESKEY_nguid=${OCF_RESKEY_nguid_default}} ####################################################################### meta_data() { cat < 1.0 Manages NVMe-oF namespaces. An NVMe-oF namespace is part of an NVMe-oF target. A namespace must be created after the subsystem. It is similar in concept to the LUN of an iSCSI target. NVMe-oF target export agent The NVMe Qualified Name (NQN) is used to identify the remote NVMe storage target. It is similar to an iSCSI Qualified Name (IQN). While it is a free-form string, you should follow the convention: nqn.2014-08.com.vendor:nvme:nvm-subsystem-sn-12345 You need to refer here to the NQN of an NVMe Subsystem your created with the NVMeSubsystem resource agent. NVMe Qualified Name The NVMe namespace id (number). namespace id The full path to the block device or file that should be exposed through this namespace. block device full path The UUID that should be exposed by NVMe. Create it using uuidgen. This is necessary for the initiators to accept the namespace from the new server after failover. UUID NGUID stands for Namespace Globally Unique Identifier. Seems to be optional, looks like e.g. VMWare ESXi7 uses it to identify namespaces. Use 'uuidgen' to create it. NGUID END } ####################################################################### nvmet_namespace_usage() { cat < ${namespace}/device_path echo "${OCF_RESKEY_uuid}" > ${namespace}/device_uuid [ "${OCF_RESKEY_nguid}" ] && echo "${OCF_RESKEY_nguid}" > ${namespace}/device_nguid echo 1 > ${namespace}/enable nvmet_namespace_monitor } nvmet_namespace_stop() { nvmet_namespace_monitor if [ $? -eq $OCF_NOT_RUNNING ]; then return $OCF_SUCCESS fi rmdir ${namespace} return $OCF_SUCCESS } nvmet_namespace_monitor() { [ -d ${namespace} ] || return $OCF_NOT_RUNNING return $OCF_SUCCESS } nvmet_namespace_validate() { if [ ! -d /sys/kernel/config/nvmet ]; then ocf_log err "/sys/kernel/config/nvmet does not exist -- Load the nvmet.ko linux kernel module." exit $OCF_ERR_INSTALLED fi subsys=/sys/kernel/config/nvmet/subsystems/${OCF_RESKEY_nqn} namespace=${subsys}/namespaces/${OCF_RESKEY_namespace_id} return $OCF_SUCCESS } case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; usage|help) nvmet_namespace_usage exit $OCF_SUCCESS ;; esac # Everything except usage and meta-data must pass the validate test nvmet_namespace_validate case $__OCF_ACTION in start) nvmet_namespace_start;; stop) nvmet_namespace_stop;; monitor|status) nvmet_namespace_monitor;; reload) ocf_log info "Reloading..." nvmet_namespace_start ;; validate-all) ;; *) nvmet_namespace_usage exit $OCF_ERR_UNIMPLEMENTED ;; esac rc=$? ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc" exit $rc