]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Display the number of iSCSI active sessions 27450/head
authorRicardo Marques <rimarques@suse.com>
Thu, 28 Mar 2019 14:54:23 +0000 (14:54 +0000)
committerRicardo Marques <rimarques@suse.com>
Mon, 8 Apr 2019 20:45:02 +0000 (21:45 +0100)
Fixes: https://tracker.ceph.com/issues/38989
Signed-off-by: Ricardo Marques <rimarques@suse.com>
(cherry picked from commit 74e12be82b7b47f7880ac6cb8209898c3a80601f)

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 9b4c19dcf4e1b9635f4d57a9e7cdf99d256dd94d..bb3e297c91b9dfb7ca60e0261e65ec7c8363d729 100644 (file)
@@ -30,10 +30,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 ' \
@@ -105,6 +112,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
 
@@ -112,7 +120,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):
@@ -564,6 +574,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 615c8a4bfef18c91e7aa0a4913adce7a4298a0ce..3071718444365e733633f9f1076ef8d49f7ed2a4 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 db88f32f0914cba4abb2dd81f28a5751bbec7308..779f1ca22bd16766898418533f8af4c99c180c77 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
+    }
 }
 
 
@@ -635,3 +638,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
+        }