cinder/cinder/volume/drivers/nec/v/nec_v_rest.py

281 lines
11 KiB
Python

# Copyright (C) 2021, 2023, NEC corporation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
"""REST interface for NEC Driver."""
from oslo_config import cfg
from cinder.volume import configuration
from cinder.volume.drivers.hitachi import hbsd_rest
from cinder.volume.drivers.hitachi import hbsd_rest_api
from cinder.volume.drivers.hitachi import hbsd_rest_fc
from cinder.volume.drivers.hitachi import hbsd_rest_iscsi
COMMON_VOLUME_OPTS = [
cfg.StrOpt(
'nec_v_storage_id',
default=None,
help='Product number of the storage system.'),
cfg.ListOpt(
'nec_v_pools',
default=[],
deprecated_name='nec_v_pool',
help='Pool number[s] or pool name[s] of the DP pool.'),
cfg.StrOpt(
'nec_v_snap_pool',
default=None,
help='Pool number or pool name of the snapshot pool.'),
cfg.StrOpt(
'nec_v_ldev_range',
default=None,
help='Range of the LDEV numbers in the format of \'xxxx-yyyy\' that '
'can be used by the driver. Values can be in decimal format '
'(e.g. 1000) or in colon-separated hexadecimal format '
'(e.g. 00:03:E8).'),
cfg.ListOpt(
'nec_v_target_ports',
default=[],
help='IDs of the storage ports used to attach volumes to the '
'controller node. To specify multiple ports, connect them by '
'commas (e.g. CL1-A,CL2-A).'),
cfg.ListOpt(
'nec_v_compute_target_ports',
default=[],
help='IDs of the storage ports used to attach volumes to compute '
'nodes. To specify multiple ports, connect them by commas '
'(e.g. CL1-A,CL2-A).'),
cfg.BoolOpt(
'nec_v_group_create',
default=False,
help='If True, the driver will create host groups or iSCSI targets on '
'storage ports as needed.'),
cfg.BoolOpt(
'nec_v_group_delete',
default=False,
help='If True, the driver will delete host groups or iSCSI targets on '
'storage ports as needed.'),
cfg.IntOpt(
'nec_v_copy_speed',
default=3,
min=1, max=15,
help='Copy speed of storage system. 1 or 2 indicates '
'low speed, 3 indicates middle speed, and a value between 4 and '
'15 indicates high speed.'),
cfg.IntOpt(
'nec_v_copy_check_interval',
default=3,
min=1, max=600,
help='Interval in seconds to check copying status during a volume '
'copy.'),
cfg.IntOpt(
'nec_v_async_copy_check_interval',
default=10,
min=1, max=600,
help='Interval in seconds to check asynchronous copying status during '
'a copy pair deletion or data restoration.'),
]
REST_VOLUME_OPTS = [
cfg.BoolOpt(
'nec_v_rest_disable_io_wait',
default=True,
help='It may take some time to detach volume after I/O. '
'This option will allow detaching volume to complete '
'immediately.'),
cfg.BoolOpt(
'nec_v_rest_tcp_keepalive',
default=True,
help='Enables or disables use of REST API tcp keepalive'),
cfg.BoolOpt(
'nec_v_discard_zero_page',
default=True,
help='Enable or disable zero page reclamation in a DP-VOL.'),
cfg.IntOpt(
'nec_v_lun_timeout',
default=hbsd_rest._LUN_TIMEOUT,
help='Maximum wait time in seconds for adding a LUN to complete.'),
cfg.IntOpt(
'nec_v_lun_retry_interval',
default=hbsd_rest._LUN_RETRY_INTERVAL,
help='Retry interval in seconds for REST API adding a LUN.'),
cfg.IntOpt(
'nec_v_restore_timeout',
default=hbsd_rest._RESTORE_TIMEOUT,
help='Maximum wait time in seconds for the restore operation to '
'complete.'),
cfg.IntOpt(
'nec_v_state_transition_timeout',
default=hbsd_rest._STATE_TRANSITION_TIMEOUT,
help='Maximum wait time in seconds for a volume transition to '
'complete.'),
cfg.IntOpt(
'nec_v_lock_timeout',
default=hbsd_rest_api._LOCK_TIMEOUT,
help='Maximum wait time in seconds for storage to be unlocked.'),
cfg.IntOpt(
'nec_v_rest_timeout',
default=hbsd_rest_api._REST_TIMEOUT,
help='Maximum wait time in seconds for REST API execution to '
'complete.'),
cfg.IntOpt(
'nec_v_extend_timeout',
default=hbsd_rest_api._EXTEND_TIMEOUT,
help='Maximum wait time in seconds for a volume extention to '
'complete.'),
cfg.IntOpt(
'nec_v_exec_retry_interval',
default=hbsd_rest_api._EXEC_RETRY_INTERVAL,
help='Retry interval in seconds for REST API execution.'),
cfg.IntOpt(
'nec_v_rest_connect_timeout',
default=hbsd_rest_api._DEFAULT_CONNECT_TIMEOUT,
help='Maximum wait time in seconds for REST API connection to '
'complete.'),
cfg.IntOpt(
'nec_v_rest_job_api_response_timeout',
default=hbsd_rest_api._JOB_API_RESPONSE_TIMEOUT,
help='Maximum wait time in seconds for a response from REST API.'),
cfg.IntOpt(
'nec_v_rest_get_api_response_timeout',
default=hbsd_rest_api._GET_API_RESPONSE_TIMEOUT,
help='Maximum wait time in seconds for a response against GET method '
'of REST API.'),
cfg.IntOpt(
'nec_v_rest_server_busy_timeout',
default=hbsd_rest_api._REST_SERVER_BUSY_TIMEOUT,
help='Maximum wait time in seconds when REST API returns busy.'),
cfg.IntOpt(
'nec_v_rest_keep_session_loop_interval',
default=hbsd_rest_api._KEEP_SESSION_LOOP_INTERVAL,
help='Loop interval in seconds for keeping REST API session.'),
cfg.IntOpt(
'nec_v_rest_another_ldev_mapped_retry_timeout',
default=hbsd_rest_api._ANOTHER_LDEV_MAPPED_RETRY_TIMEOUT,
help='Retry time in seconds when new LUN allocation request fails.'),
cfg.IntOpt(
'nec_v_rest_tcp_keepidle',
default=hbsd_rest_api._TCP_KEEPIDLE,
help='Wait time in seconds for sending a first TCP keepalive packet.'),
cfg.IntOpt(
'nec_v_rest_tcp_keepintvl',
default=hbsd_rest_api._TCP_KEEPINTVL,
help='Interval of transmissions in seconds for TCP keepalive packet.'),
cfg.IntOpt(
'nec_v_rest_tcp_keepcnt',
default=hbsd_rest_api._TCP_KEEPCNT,
help='Maximum number of transmissions for TCP keepalive packet.'),
cfg.ListOpt(
'nec_v_host_mode_options',
default=[],
help='Host mode option for host group or iSCSI target'),
]
FC_VOLUME_OPTS = [
cfg.BoolOpt(
'nec_v_zoning_request',
default=False,
help='If True, the driver will configure FC zoning between the server '
'and the storage system provided that FC zoning manager is '
'enabled.'),
]
CONF = cfg.CONF
CONF.register_opts(COMMON_VOLUME_OPTS, group=configuration.SHARED_CONF_GROUP)
CONF.register_opts(REST_VOLUME_OPTS, group=configuration.SHARED_CONF_GROUP)
CONF.register_opts(FC_VOLUME_OPTS, group=configuration.SHARED_CONF_GROUP)
def update_conf(conf):
# COMMON_VOLUME_OPTS
conf.hitachi_storage_id = conf.nec_v_storage_id
conf.hitachi_pools = conf.nec_v_pools
conf.hitachi_snap_pool = conf.nec_v_snap_pool
conf.hitachi_ldev_range = conf.nec_v_ldev_range
conf.hitachi_target_ports = conf.nec_v_target_ports
conf.hitachi_compute_target_ports = (
conf.nec_v_compute_target_ports)
conf.hitachi_group_create = conf.nec_v_group_create
conf.hitachi_group_delete = conf.nec_v_group_delete
conf.hitachi_copy_speed = conf.nec_v_copy_speed
conf.hitachi_copy_check_interval = (
conf.nec_v_copy_check_interval)
conf.hitachi_async_copy_check_interval = (
conf.nec_v_async_copy_check_interval)
# REST_VOLUME_OPTS
conf.hitachi_rest_disable_io_wait = (
conf.nec_v_rest_disable_io_wait)
conf.hitachi_rest_tcp_keepalive = (
conf.nec_v_rest_tcp_keepalive)
conf.hitachi_discard_zero_page = (
conf.nec_v_discard_zero_page)
conf.hitachi_lun_timeout = conf.nec_v_lun_timeout
conf.hitachi_lun_retry_interval = (
conf.nec_v_lun_retry_interval)
conf.hitachi_restore_timeout = conf.nec_v_restore_timeout
conf.hitachi_state_transition_timeout = (
conf.nec_v_state_transition_timeout)
conf.hitachi_lock_timeout = conf.nec_v_lock_timeout
conf.hitachi_rest_timeout = conf.nec_v_rest_timeout
conf.hitachi_extend_timeout = conf.nec_v_extend_timeout
conf.hitachi_exec_retry_interval = (
conf.nec_v_exec_retry_interval)
conf.hitachi_rest_connect_timeout = (
conf.nec_v_rest_connect_timeout)
conf.hitachi_rest_job_api_response_timeout = (
conf.nec_v_rest_job_api_response_timeout)
conf.hitachi_rest_get_api_response_timeout = (
conf.nec_v_rest_get_api_response_timeout)
conf.hitachi_rest_server_busy_timeout = (
conf.nec_v_rest_server_busy_timeout)
conf.hitachi_rest_keep_session_loop_interval = (
conf.nec_v_rest_keep_session_loop_interval)
conf.hitachi_rest_another_ldev_mapped_retry_timeout = (
conf.nec_v_rest_another_ldev_mapped_retry_timeout)
conf.hitachi_rest_tcp_keepidle = (
conf.nec_v_rest_tcp_keepidle)
conf.hitachi_rest_tcp_keepintvl = (
conf.nec_v_rest_tcp_keepintvl)
conf.hitachi_rest_tcp_keepcnt = (
conf.nec_v_rest_tcp_keepcnt)
conf.hitachi_host_mode_options = (
conf.nec_v_host_mode_options)
return conf
class VStorageRESTFC(hbsd_rest_fc.HBSDRESTFC):
"""REST interface fibre channel class."""
def __init__(self, conf, storage_protocol, db):
"""Initialize instance variables."""
conf.append_config_values(COMMON_VOLUME_OPTS)
conf.append_config_values(REST_VOLUME_OPTS)
conf.append_config_values(FC_VOLUME_OPTS)
super(VStorageRESTFC, self).__init__(conf, storage_protocol, db)
self.conf = update_conf(self.conf)
# FC_VOLUME_OPTS
self.conf.hitachi_zoning_request = self.conf.nec_v_zoning_request
class VStorageRESTISCSI(hbsd_rest_iscsi.HBSDRESTISCSI):
"""REST interface iSCSI channel class."""
def __init__(self, conf, storage_protocol, db):
"""Initialize instance variables."""
conf.append_config_values(COMMON_VOLUME_OPTS)
conf.append_config_values(REST_VOLUME_OPTS)
super(VStorageRESTISCSI, self).__init__(conf, storage_protocol, db)
self.conf = update_conf(self.conf)