Hello community,
here is the log from the commit of package ceph-iscsi for openSUSE:Factory checked in at 2019-04-30 13:06:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ceph-iscsi (Old)
and /work/SRC/openSUSE:Factory/.ceph-iscsi.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ceph-iscsi"
Tue Apr 30 13:06:35 2019 rev:10 rq:699447 version:3.0+1556546618.g28a0e8a
Changes:
--------
--- /work/SRC/openSUSE:Factory/ceph-iscsi/ceph-iscsi.changes 2019-04-09 20:18:42.421844161 +0200
+++ /work/SRC/openSUSE:Factory/.ceph-iscsi.new.5536/ceph-iscsi.changes 2019-04-30 13:06:38.421556649 +0200
@@ -1,0 +2,9 @@
+Mon Apr 29 14:04:00 UTC 2019 - Nathan Cutler <ncutler(a)suse.com>
+
+- Update to 3.0+1556546618.g28a0e8a:
+ + Should be possible to export config without targets
+ + Prevent error getting the number of active sessions
+ + Fix race condition in '_targetauth' config update
+ + Fix error when trying to get client info from 'gwcli'
+
+-------------------------------------------------------------------
Old:
----
ceph-iscsi-3.0+1554735444.g63aceaf.tar.gz
New:
----
ceph-iscsi-3.0+1556546618.g28a0e8a.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ceph-iscsi.spec ++++++
--- /var/tmp/diff_new_pack.XyZkXH/_old 2019-04-30 13:06:38.937556304 +0200
+++ /var/tmp/diff_new_pack.XyZkXH/_new 2019-04-30 13:06:38.937556304 +0200
@@ -20,7 +20,7 @@
Name: ceph-iscsi
-Version: 3.0+1554735444.g63aceaf
+Version: 3.0+1556546618.g28a0e8a
Release: 1%{?dist}
Group: System/Filesystems
Summary: Python modules for Ceph iSCSI gateway configuration management
++++++ ceph-iscsi-3.0+1554735444.g63aceaf.tar.gz -> ceph-iscsi-3.0+1556546618.g28a0e8a.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ceph-iscsi-3.0+1554735444.g63aceaf/ceph-iscsi.spec new/ceph-iscsi-3.0+1556546618.g28a0e8a/ceph-iscsi.spec
--- old/ceph-iscsi-3.0+1554735444.g63aceaf/ceph-iscsi.spec 2019-04-08 16:57:24.610585206 +0200
+++ new/ceph-iscsi-3.0+1556546618.g28a0e8a/ceph-iscsi.spec 2019-04-29 16:03:38.399644158 +0200
@@ -20,7 +20,7 @@
Name: ceph-iscsi
-Version: 3.0+1554735444.g63aceaf
+Version: 3.0+1556546618.g28a0e8a
Release: 1%{?dist}
Group: System/Filesystems
Summary: Python modules for Ceph iSCSI gateway configuration management
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ceph-iscsi-3.0+1554735444.g63aceaf/ceph_iscsi_config/target.py new/ceph-iscsi-3.0+1556546618.g28a0e8a/ceph_iscsi_config/target.py
--- old/ceph-iscsi-3.0+1554735444.g63aceaf/ceph_iscsi_config/target.py 2019-04-08 16:57:24.310583510 +0200
+++ new/ceph-iscsi-3.0+1556546618.g28a0e8a/ceph_iscsi_config/target.py 2019-04-29 16:03:38.111642298 +0200
@@ -122,8 +122,12 @@
:return: boolean
"""
+ return GWTarget._exists(self.iqn)
+
+ @staticmethod
+ def _exists(target_iqn):
return os.path.exists('/sys/kernel/config/target/iscsi/'
- '{}'.format(self.iqn))
+ '{}'.format(target_iqn))
def _get_portals(self, tpg):
"""
@@ -253,10 +257,9 @@
self.error = True
self.error_msg = "Unable to delete target - {}".format(err)
- def update_acl(self, config):
- target_config = config.config["targets"][self.iqn]
+ def update_acl(self, acl_enabled):
for tpg in self.tpg_list:
- if target_config['acl_enabled']:
+ if acl_enabled:
tpg.set_attribute('generate_node_acls', 0)
tpg.set_attribute('demo_mode_write_protect', 1)
else:
@@ -563,7 +566,8 @@
# return to caller, with error state set
return
- self.update_acl(config)
+ target_config = config.config["targets"][self.iqn]
+ self.update_acl(target_config['acl_enabled'])
discovery_auth_config = config.config['discovery_auth']
Discovery.set_discovery_auth_lio(discovery_auth_config['username'],
@@ -574,7 +578,6 @@
discovery_auth_config[
'mutual_password_encryption_enabled'])
- target_config = config.config["targets"][self.iqn]
gateway_group = config.config["gateways"].keys()
if "ip_list" not in target_config:
target_config['ip_list'] = self.gateway_ip_list
@@ -630,7 +633,8 @@
self.map_luns(config)
- self.update_acl(config)
+ target_config = config.config["targets"][self.iqn]
+ self.update_acl(target_config['acl_enabled'])
else:
self.error = True
@@ -712,6 +716,8 @@
@staticmethod
def get_num_sessions(target_iqn):
+ if not GWTarget._exists(target_iqn):
+ return 0
with open('/sys/kernel/config/target/iscsi/{}/fabric_statistics/iscsi_instance'
'/sessions'.format(target_iqn)) as sessions_file:
return int(sessions_file.read().rstrip('\n'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ceph-iscsi-3.0+1554735444.g63aceaf/gwcli/client.py new/ceph-iscsi-3.0+1556546618.g28a0e8a/gwcli/client.py
--- old/ceph-iscsi-3.0+1554735444.g63aceaf/gwcli/client.py 2019-04-08 16:57:24.314583532 +0200
+++ new/ceph-iscsi-3.0+1556546618.g28a0e8a/gwcli/client.py 2019-04-29 16:03:38.111642298 +0200
@@ -1,6 +1,6 @@
from gwcli.node import UIGroup, UINode
-from gwcli.utils import response_message, APIRequest, get_config
+from gwcli.utils import response_message, APIRequest, get_config, this_host
from ceph_iscsi_config.client import CHAP, GWClient
import ceph_iscsi_config.settings as settings
@@ -690,10 +690,18 @@
@property
def logged_in(self):
target_iqn = self.parent.parent.name
- client_info = GWClient.get_client_info(target_iqn, self.client_iqn)
- self.alias = client_info['alias']
- self.ip_address = ','.join(client_info['ip_address'])
- return client_info['state']
+ gateways = self.parent.parent.get_child('gateways')
+ local_gw = this_host()
+ is_local_target = len([child for child in gateways.children if child.name == local_gw]) > 0
+ if is_local_target:
+ client_info = GWClient.get_client_info(target_iqn, self.client_iqn)
+ self.alias = client_info['alias']
+ self.ip_address = ','.join(client_info['ip_address'])
+ return client_info['state']
+ else:
+ self.alias = ''
+ self.ip_address = ''
+ return ''
class MappedLun(UINode):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ceph-iscsi-3.0+1554735444.g63aceaf/gwcli/gateway.py new/ceph-iscsi-3.0+1556546618.g28a0e8a/gwcli/gateway.py
--- old/ceph-iscsi-3.0+1554735444.g63aceaf/gwcli/gateway.py 2019-04-08 16:57:24.314583532 +0200
+++ new/ceph-iscsi-3.0+1556546618.g28a0e8a/gwcli/gateway.py 2019-04-29 16:03:38.111642298 +0200
@@ -128,9 +128,6 @@
return
current_config = self._get_config()
- if not current_config.get('targets'):
- self.logger.error("Export requested, but the config is empty")
- return
if mode == 'copy':
self.export_copy(current_config)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ceph-iscsi-3.0+1554735444.g63aceaf/rbd-target-api.py new/ceph-iscsi-3.0+1556546618.g28a0e8a/rbd-target-api.py
--- old/ceph-iscsi-3.0+1554735444.g63aceaf/rbd-target-api.py 2019-04-08 16:57:24.314583532 +0200
+++ new/ceph-iscsi-3.0+1556546618.g28a0e8a/rbd-target-api.py 2019-04-29 16:03:38.111642298 +0200
@@ -1597,22 +1597,24 @@
**RESTRICTED**
"""
+ config.refresh()
+
local_gw = this_host()
committing_host = request.form['committing_host']
action = request.form['action']
target = GWTarget(logger, target_iqn, [])
- target_config = config.config['targets'][target_iqn]
- if action in ['disable_acl', 'enable_acl']:
- target_config['acl_enabled'] = (action == 'enable_acl')
- config.update_item('targets', target_iqn, target_config)
+ acl_enabled = (action == 'enable_acl')
if target.exists():
target.load_config()
- target.update_acl(config)
+ target.update_acl(acl_enabled)
if committing_host == local_gw:
+ target_config = config.config['targets'][target_iqn]
+ target_config['acl_enabled'] = acl_enabled
+ config.update_item('targets', target_iqn, target_config)
config.commit("retain")
return jsonify(message='OK'), 200
@@ -1634,6 +1636,10 @@
gateways = target_config['portals']
num_sessions = 0
for gateway in gateways.keys():
+ target_state = target_ready([gateway])
+ if target_state.get('status_api') == 'UP' and target_state.get('status_iscsi') == 'DOWN':
+ # If API is 'up' and iSCSI is 'down', there are no active sessions to count
+ continue
resp_text, resp_code = call_api([gateway], '_targetinfo', target_iqn, http_method='get')
if resp_code != 200:
return jsonify(message="{}".format(resp_text)), resp_code
@@ -1656,10 +1662,6 @@
"""
if target_iqn not in config.config['targets']:
return jsonify(message="Target {} does not exist".format(target_iqn)), 400
- target_config = config.config['targets'][target_iqn]
- local_gw = this_host()
- if local_gw not in target_config['portals']:
- return jsonify(message="{} is not a portal of target {}".format(local_gw, target_iqn)), 400
num_sessions = GWTarget.get_num_sessions(target_iqn)
return jsonify({
"num_sessions": num_sessions
@@ -2485,6 +2487,8 @@
"""
http_mode = 'https' if settings.config.api_secure else 'http'
target_state = {"status": 'OK',
+ "status_iscsi": 'UP',
+ "status_api": 'UP',
"summary": ''}
for gw in gateway_list:
@@ -2496,15 +2500,21 @@
api.get()
except GatewayAPIError:
target_state['status'] = 'NOTOK'
+ target_state['status_iscsi'] = 'UNKNOWN'
+ target_state['status_api'] = 'DOWN'
target_state['summary'] += ',{}(iscsi Unknown, API down)'.format(gw)
else:
if api.response.status_code == 200:
continue
elif api.response.status_code == 503:
target_state['status'] = 'NOTOK'
+ target_state['status_iscsi'] = 'DOWN'
+ target_state['status_api'] = 'UP'
target_state['summary'] += ',{}(iscsi down, API up)'.format(gw)
else:
target_state['status'] = 'NOTOK'
+ target_state['status_iscsi'] = 'UNKNOWN'
+ target_state['status_api'] = 'UNKNOWN'
target_state['summary'] += ',{}(UNKNOWN state)'.format(gw)
target_state['summary'] = target_state['summary'][1:] # ignore 1st char