Skip to content

Commit 6de1b4b

Browse files
committed
Add Native Console Support to Service UI
1 parent 3de7968 commit 6de1b4b

15 files changed

+99
-69
lines changed

client/app/core/product-features.constants.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"DELETE": "sui_vm_snapshot_delete"
3232
},
3333
"HTML5_CONSOLE": "sui_vm_html5_console",
34+
"NATIVE_CONSOLE": "sui_vm_native_console",
3435
"VMRC_CONSOLE": "sui_vm_vmrc_console",
3536
"WEB_CONSOLE": "sui_vm_web_console",
3637
"TAGS": "sui_vm_tags",

client/app/services/consoles.service.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ export function ConsolesFactory ($window, CollectionsApi, $timeout, $location, E
7272
case 'remote':
7373
openRemote(results)
7474
break
75+
case 'native':
76+
openNative(results)
77+
break
7578
default:
7679
EventNotifications.error(__('Unsupported console protocol returned. ') + results.proto)
7780
}
@@ -118,4 +121,17 @@ export function ConsolesFactory ($window, CollectionsApi, $timeout, $location, E
118121
// openstack
119122
$window.open(results.remote_url)
120123
}
124+
125+
function openNative (results) {
126+
const base64DecodedFile = atob(results.connection);
127+
const href = window.URL.createObjectURL(new Blob([base64DecodedFile], {type: results.type}));
128+
const a = document.createElement('a');
129+
130+
a.style.display = 'none';
131+
a.href = href;
132+
a.download = results.name;
133+
document.body.appendChild(a);
134+
a.click();
135+
window.URL.revokeObjectURL(href);
136+
}
121137
}

client/app/services/consoles.service.spec.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,26 @@ describe('Service: ConsolesFactory', function () {
7979
expect(collectionsApiGetSpy).to.have.been.calledWith('tasks', '1', {attributes: 'task_results'})
8080
})
8181
})
82+
it('should successfully start a native session', function(done) {
83+
const taskResponse = {
84+
'state': 'Finished',
85+
'status': 'Ok',
86+
'task_results': {
87+
'proto': 'native',
88+
'connection': 'blah',
89+
'name': 'blah',
90+
'type': 'blah'
91+
}
92+
}
93+
sinon.stub(CollectionsApi, 'post').returns(Promise.resolve(successResponse))
94+
const collectionsApiGetSpy = sinon.stub(CollectionsApi, 'get').returns(Promise.resolve(taskResponse))
95+
Consoles.open('12345').then((data) => {
96+
$timeout.flush()
97+
done()
98+
99+
expect(collectionsApiGetSpy).to.have.been.calledWith('tasks', '1', {attributes: 'task_results'})
100+
})
101+
})
82102
it('should successfully start a remote session', function (done) {
83103
const taskResponse = {
84104
'state': 'Finished',

client/app/services/service-details/service-details.component.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ function ComponentController ($stateParams, $state, $window, CollectionsApi, Eve
4040
disableStartButton: disableStartButton,
4141
toggleOpenResourceGroup: toggleOpenResourceGroup,
4242
toggleOpenGenericObjects: toggleOpenGenericObjects,
43-
openCockpit: openCockpit,
4443
openConsole: openConsole,
4544
processSnapshot: processSnapshot,
4645
startVM: startVM,
@@ -386,14 +385,10 @@ function ComponentController ($stateParams, $state, $window, CollectionsApi, Eve
386385
}
387386

388387
function openConsole (item, protocol) {
389-
if ((item.supported_consoles.html5.visible && item.supported_consoles.html5.enabled) || (item.supported_consoles.vmrc.visible && item.supported_consoles.vmrc.enabled)) {
390-
Consoles.open(item.id, protocol)
391-
}
392-
}
388+
let permissionValue = protocol.concat('_console');
393389

394-
function openCockpit (item) {
395-
if (item.supported_consoles.cockpit.visible && item.supported_consoles.cockpit.enabled) {
396-
$window.open('http://' + item.ipaddresses[0] + ':9090')
390+
if (vm.permissions[permissionValue] && item.supported_consoles[protocol].visible && item.supported_consoles[protocol].enabled) {
391+
Consoles.open(item.id, protocol);
397392
}
398393
}
399394

client/app/services/service-details/service-details.html

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,13 @@ <h2 translate>Resources</h2>
288288
</ul>
289289
</div>
290290
<div class="btn-group" uib-dropdown dropdown-append-to-body
291-
ng-if="($ctrl.customScope.permissions.cockpit || $ctrl.customScope.permissions.html5_console)
291+
ng-if="($ctrl.customScope.permissions.vmrc_console
292+
|| $ctrl.customScope.permissions.html5_console
293+
|| $ctrl.customScope.permissions.native_console)
292294
&& (item.supported_consoles.html5.visible || item.supported_consoles.html5.message
293-
|| item.supported_consoles.cockpit.visible || item.supported_consoles.cockpit.message)"> <button type="button" class="btn btn-default" uib-dropdown-toggle
295+
|| item.supported_consoles.vmrc.visible || item.supported_consoles.vmrc.message
296+
|| item.supported_consoles.native.visible || item.supported_consoles.native.message)">
297+
<button type="button" class="btn btn-default" uib-dropdown-toggle
294298
type="button">
295299
<i class="fa fa-window-maximize "></i>
296300
<span translate>Access</span>
@@ -314,14 +318,13 @@ <h2 translate>Resources</h2>
314318
ng-click="$ctrl.customScope.openConsole(item, 'vmrc')">
315319
<a href="#" translate>VM VMRC Console</a>
316320
</li>
317-
318-
<li ng-if="item.supported_consoles.cockpit.visible || item.supported_consoles.cockpit.message"
321+
<li ng-if="item.supported_consoles.native.visible || item.supported_consoles.native.message"
319322
role="menuitem"
320-
uib-tooltip="{{item.supported_consoles.cockpit.message}}"
323+
uib-tooltip="{{item.supported_consoles.native.message}}"
321324
tooltip-placement="bottom"
322-
ng-class="{'disabled': !item.supported_consoles.cockpit.enabled || !$ctrl.customScope.permissions.cockpit}"
323-
ng-click="$ctrl.customScope.openCockpit(item)">
324-
<a href="#" translate>Web Console</a>
325+
ng-class="{'disabled': !item.supported_consoles.native.enabled || !$ctrl.customScope.permissions.native_console}"
326+
ng-click="$ctrl.customScope.openConsole(item, 'native')">
327+
<a href="#" translate>Native Console</a>
325328
</li>
326329
</ul>
327330
</div>

client/app/services/service-explorer/service-explorer.component.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ describe('Component: serviceExplorer', () => {
3030
serviceStart: false,
3131
serviceStop: false,
3232
serviceSuspend: false,
33-
cockpit: false,
3433
html5_console: false,
34+
native_console: false,
3535
vmrc_console: false,
3636
viewSnapshots: false,
3737
vm_snapshot_show_list: false,

client/app/services/services-state.service.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ export function ServicesStateFactory (ListConfiguration, CollectionsApi, RBAC) {
146146
instanceStop: RBAC.has(RBAC.FEATURES.VMS.STOP),
147147
instanceSuspend: RBAC.has(RBAC.FEATURES.VMS.SUSPEND),
148148
instanceRetire: RBAC.hasAny([RBAC.FEATURES.SERVICES.RETIRE.RETIRE_NOW, RBAC.FEATURES.SERVICES.RETIRE.SET_DATE]),
149-
cockpit: RBAC.has(RBAC.FEATURES.VMS.WEB_CONSOLE),
150149
html5_console: RBAC.has(RBAC.FEATURES.VMS.HTML5_CONSOLE),
150+
native_console: RBAC.has(RBAC.FEATURES.VMS.NATIVE_CONSOLE),
151151
vmrc_console: RBAC.has(RBAC.FEATURES.VMS.VMRC_CONSOLE),
152152
viewSnapshots: RBAC.has(RBAC.FEATURES.VMS.SNAPSHOTS.VIEW),
153153

client/app/services/services-state.service.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ describe('Service: ServicesStateFactory', () => {
8383
'instanceStop': false,
8484
'instanceSuspend': false,
8585
'instanceRetire': false,
86-
'cockpit': false,
8786
'html5_console': false,
87+
'native_console': false,
8888
'vmrc_console': false,
8989
'viewSnapshots': false,
9090
'vm_snapshot_add': false,

0 commit comments

Comments
 (0)