]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Display the number of iSCSI active sessions 27248/head
authorRicardo Marques <rimarques@suse.com>
Thu, 28 Mar 2019 14:54:23 +0000 (14:54 +0000)
committerRicardo Marques <rimarques@suse.com>
Thu, 28 Mar 2019 14:57:34 +0000 (14:57 +0000)
Fixes: https://tracker.ceph.com/issues/38989
Signed-off-by: Ricardo Marques <rimarques@suse.com>
src/pybind/mgr/dashboard/controllers/iscsi.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.ts
src/pybind/mgr/dashboard/frontend/src/locale/messages.xlf
src/pybind/mgr/dashboard/services/iscsi_client.py
src/pybind/mgr/dashboard/tests/test_iscsi.py

index 5342a4463b59244ff52b250e57c9f7344c685d9e..01f3719992bfe3771d7d07ceeed89e5112022d12 100644 (file)
@@ -29,10 +29,17 @@ class IscsiUi(BaseController):
     @ReadPermission
     def status(self):
         status = {'available': False}
-        if not IscsiGatewaysConfig.get_gateways_config()['gateways']:
+        gateways = IscsiGatewaysConfig.get_gateways_config()['gateways']
+        if not gateways:
             status['message'] = 'There are no gateways defined'
             return status
         try:
+            for gateway in gateways.keys():
+                try:
+                    IscsiClient.instance(gateway_name=gateway).ping()
+                except RequestException:
+                    status['message'] = 'Gateway {} is inaccessible'.format(gateway)
+                    return status
             config = IscsiClient.instance().get_config()
             if config['version'] != IscsiUi.REQUIRED_CEPH_ISCSI_CONFIG_VERSION:
                 status['message'] = 'Unsupported `ceph-iscsi` config version. Expected {} but ' \
@@ -104,6 +111,7 @@ class IscsiTarget(RESTController):
         targets = []
         for target_iqn in config['targets'].keys():
             target = IscsiTarget._config_to_target(target_iqn, config)
+            IscsiTarget._set_info(target)
             targets.append(target)
         return targets
 
@@ -111,7 +119,9 @@ class IscsiTarget(RESTController):
         config = IscsiClient.instance().get_config()
         if target_iqn not in config['targets']:
             raise cherrypy.HTTPError(404)
-        return IscsiTarget._config_to_target(target_iqn, config)
+        target = IscsiTarget._config_to_target(target_iqn, config)
+        IscsiTarget._set_info(target)
+        return target
 
     @iscsi_target_task('delete', {'target_iqn': '{target_iqn}'})
     def delete(self, target_iqn):
@@ -538,6 +548,15 @@ class IscsiTarget(RESTController):
         }
         return target
 
+    @staticmethod
+    def _set_info(target):
+        if not target['portals']:
+            return
+        target_iqn = target['target_iqn']
+        gateway_name = target['portals'][0]['host']
+        target_info = IscsiClient.instance(gateway_name=gateway_name).get_targetinfo(target_iqn)
+        target['info'] = target_info
+
     @staticmethod
     def _sorted_portals(portals):
         portals = portals or []
index a798e58b274fe5de3a213025d0c85f5c715910a1..c1f66967f9b56c7573c386927bfcfd4fb3075693 100644 (file)
@@ -101,6 +101,11 @@ export class IscsiTargetListComponent implements OnInit, OnDestroy {
         name: this.i18n('Images'),
         prop: 'cdImages',
         flexGrow: 2
+      },
+      {
+        name: this.i18n('# Sessions'),
+        prop: 'info.num_sessions',
+        flexGrow: 1
       }
     ];
 
index 2f184d852d19bc2dc78bbd3bb799f55e8cc0f223..4a952c88b76ae3f4d8571cd7cf9258c88c8e91c7 100644 (file)
           <context context-type="linenumber">1</context>
         </context-group>
       </trans-unit>
+      <trans-unit id="99e094878070eebc1b972bac02aaa33b2bf83b35" datatype="html">
+        <source># Sessions</source>
+        <context-group purpose="location">
+          <context context-type="sourcefile">src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.ts</context>
+          <context context-type="linenumber">1</context>
+        </context-group>
+      </trans-unit>
       <trans-unit id="9a541ec1a4319fffc16ad3b3ab2c2b6d251a829d" datatype="html">
         <source>Hostname</source>
         <context-group purpose="location">
index e69c621b5586f2024bc3f0ef45887c0b42492dfd..887b0ca0d68f56cc72ab10800a437472d748592d 100644 (file)
@@ -198,3 +198,8 @@ class IscsiClient(RestClient):
         return request({
             'action': action
         })
+
+    @RestClient.api_get('/api/targetinfo/{target_iqn}')
+    def get_targetinfo(self, target_iqn, request=None):
+        logger.debug("iSCSI: Getting targetinfo: %s", target_iqn)
+        return request()
index c8d99eea280ab5df7456f8631dc52a0899610860..f562aa03f20d8886ea86d3ad70781fe0055942c0 100644 (file)
@@ -431,7 +431,10 @@ iscsi_target_response = {
             'members': ['iqn.1994-05.com.redhat:rh7-client2']
         }
     ],
-    'target_controls': {}
+    'target_controls': {},
+    'info': {
+        'num_sessions': 0
+    }
 }
 
 
@@ -627,3 +630,8 @@ class IscsiClientMock(object):
 
     def update_targetauth(self, target_iqn, action):
         self.config['targets'][target_iqn]['acl_enabled'] = (action == 'enable_acl')
+
+    def get_targetinfo(self, _):
+        return {
+            'num_sessions': 0
+        }