]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Display iSCSI "logged in" info 29045/head
authorRicardo Marques <rimarques@suse.com>
Tue, 28 May 2019 12:43:11 +0000 (13:43 +0100)
committerTatjana Dehler <tdehler@suse.com>
Mon, 15 Jul 2019 10:33:31 +0000 (12:33 +0200)
Fixes: https://tracker.ceph.com/issues/40046
Signed-off-by: Ricardo Marques <rimarques@suse.com>
(cherry picked from commit 71ed058f71b12ebafd4e723c13608f9747f0f9d2)

src/pybind/mgr/dashboard/controllers/iscsi.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-details/iscsi-target-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-details/iscsi-target-details.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-details/iscsi-target-details.component.ts
src/pybind/mgr/dashboard/services/iscsi_client.py
src/pybind/mgr/dashboard/tests/test_iscsi.py

index b58ef66a9f2ec6ddfb54793577bea786217de8cc..108a7cbeba44e8e2425c12be17d7c799e851289c 100644 (file)
@@ -662,6 +662,11 @@ class IscsiTarget(RESTController):
         gateway_name = target['portals'][0]['host']
         target_info = IscsiClient.instance(gateway_name=gateway_name).get_targetinfo(target_iqn)
         target['info'] = target_info
+        for client in target['clients']:
+            client_iqn = client['client_iqn']
+            client_info = IscsiClient.instance(gateway_name=gateway_name).get_clientinfo(
+                target_iqn, client_iqn)
+            client['info'] = client_info
 
     @staticmethod
     def _sorted_portals(portals):
index b57089f428ddb210cc3e28ceb51f00653a7ceb87..080f458b73bc95dfc540e0e2c6552a826d303e1f 100644 (file)
@@ -8,7 +8,7 @@
       <span>&nbsp;</span>
 
       <span class="label"
-            [ngClass]="{'label-success': ['in', 'up'].includes(node.status), 'label-danger': ['down', 'out'].includes(node.status)}">
+            [ngClass]="{'label-success': ['logged_in'].includes(node.status), 'label-danger': ['logged_out'].includes(node.status)}">
         {{ node.status }}
       </span>
     </ng-template>
index 339a3c94e3302029a4e111b7b933f3c53086133b..f4c5d81107becc5966af40dc7600ed64f8ad2a17 100644 (file)
@@ -59,6 +59,11 @@ describe('IscsiTargetDetailsComponent', () => {
             luns: [{ pool: 'rbd', image: 'disk_1' }],
             auth: {
               user: 'myiscsiusername'
+            },
+            info: {
+              alias: 'myhost',
+              ip_address: ['192.168.200.1'],
+              state: { LOGGED_IN: ['node1'] }
             }
           }
         ],
@@ -88,7 +93,12 @@ describe('IscsiTargetDetailsComponent', () => {
 
     expect(component.data).toBeUndefined();
     expect(component.metadata).toEqual({
-      'client_iqn.1994-05.com.redhat:rh7-client': { user: 'myiscsiusername' },
+      'client_iqn.1994-05.com.redhat:rh7-client': {
+        user: 'myiscsiusername',
+        alias: 'myhost',
+        ip_address: ['192.168.200.1'],
+        logged_in: ['node1']
+      },
       disk_rbd_disk_1: { backstore: 'backstore:1', controls: { hw_max_sectors: 1 } },
       root: { dataout_timeout: 2 }
     });
@@ -123,6 +133,7 @@ describe('IscsiTargetDetailsComponent', () => {
                 }
               ],
               id: 'client_iqn.1994-05.com.redhat:rh7-client',
+              status: 'logged_in',
               value: 'iqn.1994-05.com.redhat:rh7-client'
             }
           ],
@@ -178,7 +189,10 @@ describe('IscsiTargetDetailsComponent', () => {
       const node = new NodeEvent(tree);
       component.onNodeSelected(node);
       expect(component.data).toEqual([
-        { current: 'myiscsiusername', default: undefined, displayName: 'user' }
+        { current: 'myiscsiusername', default: undefined, displayName: 'user' },
+        { current: 'myhost', default: undefined, displayName: 'alias' },
+        { current: ['192.168.200.1'], default: undefined, displayName: 'ip_address' },
+        { current: ['node1'], default: undefined, displayName: 'logged_in' }
       ]);
     });
 
index 588c24b5c248f4e97f67256186251561bf448ec5..b4e482a8fa5a6a531be2a54e658239810b2bbeb5 100644 (file)
@@ -119,7 +119,13 @@ export class IscsiTargetDetailsComponent implements OnChanges, OnInit {
 
     const clients = [];
     _.forEach(this.selectedItem.clients, (client) => {
-      this.metadata['client_' + client.client_iqn] = client.auth;
+      const client_metadata = _.cloneDeep(client.auth);
+      _.extend(client_metadata, client.info);
+      delete client_metadata['state'];
+      _.forEach(Object.keys(client.info.state), (state) => {
+        client_metadata[state.toLowerCase()] = client.info.state[state];
+      });
+      this.metadata['client_' + client.client_iqn] = client_metadata;
 
       const luns = [];
       client.luns.forEach((lun) => {
@@ -134,6 +140,7 @@ export class IscsiTargetDetailsComponent implements OnChanges, OnInit {
 
       clients.push({
         value: client.client_iqn,
+        status: Object.keys(client.info.state).includes('LOGGED_IN') ? 'logged_in' : 'logged_out',
         id: 'client_' + client.client_iqn,
         children: luns
       });
index 520b4ca30c78c8798e8193e6ee4eb37d965e821d..cee67399454a4ece90d1710bf5e27b96bf244f2d 100644 (file)
@@ -214,3 +214,8 @@ class IscsiClient(RestClient):
     def get_targetinfo(self, target_iqn, request=None):
         # pylint: disable=unused-argument
         return request()
+
+    @RestClient.api_get('/api/clientinfo/{target_iqn}/{client_iqn}')
+    def get_clientinfo(self, target_iqn, client_iqn, request=None):
+        # pylint: disable=unused-argument
+        return request()
index e371ef368622acd709260edd2952ff813aa07e3d..e36694e9343d6c7ff2689a100b3cb4b433909ee8 100644 (file)
@@ -164,7 +164,12 @@ class IscsiTest(ControllerTestCase, CLICommandTestMixin):
                     "password": "myiscsipassword5",
                     "user": "myiscsiusername5",
                     "mutual_password": "myiscsipassword6",
-                    "mutual_user": "myiscsiusername6"}
+                    "mutual_user": "myiscsiusername6"},
+                "info": {
+                    "alias": "",
+                    "ip_address": [],
+                    "state": {}
+                }
             })
         self._update_iscsi_target(create_request, update_request, response)
 
@@ -302,7 +307,12 @@ class IscsiTest(ControllerTestCase, CLICommandTestMixin):
                     "password": None,
                     "user": None,
                     "mutual_password": None,
-                    "mutual_user": None}
+                    "mutual_user": None},
+                "info": {
+                    "alias": "",
+                    "ip_address": [],
+                    "state": {}
+                }
             })
         response['groups'][0]['members'].append('iqn.1994-05.com.redhat:rh7-client3')
         self._update_iscsi_target(create_request, update_request, response)
@@ -425,6 +435,11 @@ iscsi_target_response = {
                 'password': 'myiscsipassword1',
                 'mutual_password': 'myiscsipassword2',
                 'mutual_user': 'myiscsiusername2'
+            },
+            'info': {
+                'alias': '',
+                'ip_address': [],
+                'state': {}
             }
         },
         {
@@ -435,6 +450,11 @@ iscsi_target_response = {
                 'password': 'myiscsipassword3',
                 'mutual_password': 'myiscsipassword4',
                 'mutual_user': 'myiscsiusername4'
+            },
+            'info': {
+                'alias': '',
+                'ip_address': [],
+                'state': {}
             }
         }
     ],
@@ -654,7 +674,16 @@ class IscsiClientMock(object):
     def update_targetauth(self, target_iqn, action):
         self.config['targets'][target_iqn]['acl_enabled'] = (action == 'enable_acl')
 
-    def get_targetinfo(self, _):
+    def get_targetinfo(self, target_iqn):
+        # pylint: disable=unused-argument
         return {
             'num_sessions': 0
         }
+
+    def get_clientinfo(self, target_iqn, client_iqn):
+        # pylint: disable=unused-argument
+        return {
+            'alias': '',
+            'ip_address': [],
+            'state': {}
+        }