Skip to content

Commit 25a27d2

Browse files
Cyrille Bourgoisjleveugle
authored andcommitted
feat: add instance dashboard
1 parent 894625d commit 25a27d2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+939
-424
lines changed

packages/manager/modules/pci/src/projects/project/instances/active-monthly-billing/active-monthly-billing.module.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'angular-translate';
55
import 'ovh-ui-angular';
66
import 'ovh-api-services';
77

8-
import deleteInstance from '../instance/active-monthly-billing';
8+
import deleteInstance from '../instance/active-monthly-billing/active-monthly-billing.module';
99
import routing from './active-monthly-billing.routing';
1010

1111
const moduleName = 'ovhManagerPciInstancesActiveMonthlyBilling';

packages/manager/modules/pci/src/projects/project/instances/backup/backup.module.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'angular-translate';
55
import 'ovh-ui-angular';
66
import 'ovh-api-services';
77

8-
import backupInstance from '../instance/backup';
8+
import backupInstance from '../instance/backup/backup.module';
99
import routing from './backup.routing';
1010

1111
const moduleName = 'ovhManagerPciInstancesBackup';

packages/manager/modules/pci/src/projects/project/instances/delete/delete.module.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'angular-translate';
55
import 'ovh-ui-angular';
66
import 'ovh-api-services';
77

8-
import deleteInstance from '../instance/delete';
8+
import deleteInstance from '../instance/delete/delete.module';
99
import routing from './delete.routing';
1010

1111
const moduleName = 'ovhManagerPciInstancesDelete';

packages/manager/modules/pci/src/projects/project/instances/instance.class.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import filter from 'lodash/filter';
2+
import first from 'lodash/first';
23
import get from 'lodash/get';
34
import includes from 'lodash/includes';
45
import isObject from 'lodash/isObject';
@@ -101,6 +102,10 @@ export default class Instance {
101102
);
102103
}
103104

105+
hasPublicIpV4() {
106+
return this.publicIpV4.length > 0;
107+
}
108+
104109
get publicIpV4() {
105110
return filter(this.ipAddresses, ipAddress => ipAddress.type === 'public' && ipAddress.version === 4);
106111
}
@@ -109,6 +114,14 @@ export default class Instance {
109114
return filter(this.ipAddresses, ipAddress => ipAddress.type === 'private' && ipAddress.version === 4);
110115
}
111116

117+
hasPublicIpV6() {
118+
return this.publicIpV6.length > 0;
119+
}
120+
121+
get publicIpV6() {
122+
return filter(this.ipAddresses, ipAddress => ipAddress.type === 'public' && ipAddress.version === 6);
123+
}
124+
112125
isMonthlyBillingEnabled() {
113126
return (isObject(this.monthlyBilling) && get(this.monthlyBilling, 'status') === 'ok');
114127
}
@@ -120,4 +133,20 @@ export default class Instance {
120133
isRescuableWithDefaultImage() {
121134
return !includes(['freebsd', 'windows'], this.image.distribution);
122135
}
136+
137+
get connectionInfos() {
138+
const user = get(this, 'image.user') || 'user';
139+
const ip = this.getDefaultIp();
140+
return get(this, 'image.type') === 'windows' ? `rdekstop ${ip}` : `ssh ${user}@${ip}`;
141+
}
142+
143+
getDefaultIp() {
144+
if (this.hasPublicIpV4()) {
145+
return first(this.publicIpV4).ip;
146+
}
147+
if (this.hasPublicIpV6()) {
148+
return first(this.publicIpV6).ip;
149+
}
150+
return 'X.X.X.X';
151+
}
123152
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import controller from './attach-volume.controller';
2+
import template from './attach-volume.html';
3+
4+
export default {
5+
controller,
6+
template,
7+
bindings: {
8+
projectId: '<',
9+
instance: '<',
10+
volumes: '<',
11+
goBack: '<',
12+
},
13+
};
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import get from 'lodash/get';
2+
3+
export default class PciInstanceAttachVolumeController {
4+
/* @ngInject */
5+
constructor(
6+
$translate,
7+
CucCloudMessage,
8+
PciProjectsProjectInstanceService,
9+
) {
10+
this.$translate = $translate;
11+
this.CucCloudMessage = CucCloudMessage;
12+
this.PciProjectsProjectInstanceService = PciProjectsProjectInstanceService;
13+
}
14+
15+
$onInit() {
16+
this.isLoading = false;
17+
}
18+
19+
attachStorage(storage) {
20+
this.isLoading = true;
21+
22+
return this.PciProjectsProjectInstanceService
23+
.attachVolume(this.projectId, storage, this.instance)
24+
.then(() => {
25+
this.CucCloudMessage.success(
26+
this.$translate.instant(
27+
'pci_projects_project_instances_instance_attach-volume_success_message',
28+
{
29+
volume: storage.name,
30+
instance: this.instance.id,
31+
},
32+
),
33+
'pci.projects.project.instances.instance',
34+
);
35+
})
36+
.catch((err) => {
37+
this.CucCloudMessage.error(
38+
this.$translate.instant(
39+
'pci_projects_project_instances_instance_attach-volume_error_attach',
40+
{
41+
message: get(err, 'data.message', null),
42+
volume: storage.name,
43+
},
44+
'pci.projects.project.instances.instance',
45+
),
46+
);
47+
})
48+
.finally(() => {
49+
this.isLoading = false;
50+
return this.goBack();
51+
});
52+
}
53+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<oui-modal
2+
data-heading="{{:: 'pci_projects_project_instances_instance_attach-volume_title' | translate}}"
3+
data-primary-action="$ctrl.attachStorage($ctrl.selectedVolume)"
4+
data-primary-label="{{:: 'pci_projects_project_instances_instance_attach-volume_submit_label' | translate }}"
5+
data-primary-disabled="$ctrl.isLoading || !$ctrl.selectedVolume"
6+
data-secondary-action="$ctrl.goBack()"
7+
data-secondary-label="{{:: 'pci_projects_project_instances_instance_attach-volume_cancel_label' | translate }}"
8+
data-on-dismiss="$ctrl.goBack()"
9+
data-loading="$ctrl.isLoading">
10+
11+
<cui-message-container data-messages="$ctrl.messages"></cui-message-container>
12+
13+
<div data-ng-if="$ctrl.volumes.length === 0">
14+
<oui-message data-type="warning">
15+
<span data-translate="pci_projects_project_instances_instance_attach-volume_error_no_compatible_volume"></span>
16+
</oui-message>
17+
</div>
18+
<div data-ng-if="$ctrl.volumes.length > 0">
19+
<oui-select
20+
data-name="selectedVolume"
21+
data-model="$ctrl.selectedVolume"
22+
data-placeholder="Rechercher"
23+
data-items="$ctrl.volumes"
24+
data-match="name"
25+
data-searchable
26+
data-disabled="$ctrl.isLoading">
27+
</oui-select>
28+
</div>
29+
</oui-modal>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import angular from 'angular';
2+
import '@ovh-ux/ng-translate-async-loader';
3+
import '@uirouter/angularjs';
4+
import 'angular-translate';
5+
import 'ovh-ui-angular';
6+
import 'ovh-api-services';
7+
8+
import component from './attach-volume.component';
9+
import routing from './attach-volume.routing';
10+
11+
const moduleName = 'ovhManagerPciInstancesInstanceAttachVolume';
12+
13+
angular
14+
.module(moduleName, [
15+
'ui.router',
16+
'oui',
17+
'ovh-api-services',
18+
'ngTranslateAsyncLoader',
19+
'pascalprecht.translate',
20+
])
21+
.config(routing)
22+
.component('pciInstancesInstanceAttachVolume', component)
23+
24+
.run(/* @ngTranslationsInject:json ./translations */);
25+
26+
export default moduleName;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
export default /* @ngInject */($stateProvider) => {
2+
$stateProvider
3+
.state('pci.projects.project.instances.instance.attachVolume', {
4+
url: '/attach?storageId',
5+
views: {
6+
modal: {
7+
component: 'pciInstancesInstanceAttachVolume',
8+
},
9+
},
10+
layout: 'modal',
11+
resolve: {
12+
goBack: /* @ngInject */ ($rootScope, $state, projectId, instance) => () => $state.go('pci.projects.project.instances.instance', {
13+
projectId,
14+
instanceId: instance.id,
15+
}),
16+
volumes: /* @ngInject */ (
17+
PciProjectsProjectInstanceService,
18+
instance,
19+
projectId,
20+
) => PciProjectsProjectInstanceService
21+
.getCompatiblesVolumes(projectId, instance),
22+
},
23+
});
24+
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import angular from 'angular';
2+
import '@uirouter/angularjs';
3+
import 'oclazyload';
4+
5+
const moduleName = 'ovhManagerPciInstancesInstanceAttachVolumeLazyLoading';
6+
7+
angular
8+
.module(moduleName, [
9+
'ui.router',
10+
'oc.lazyLoad',
11+
])
12+
.config(($stateProvider) => {
13+
$stateProvider.state('pci.projects.project.instances.instance.attachVolume.**', {
14+
url: '/volume/attach',
15+
lazyLoad: ($transition$) => {
16+
const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad');
17+
18+
return import('./attach-volume.module')
19+
.then(mod => $ocLazyLoad.inject(mod.default || mod));
20+
},
21+
});
22+
});
23+
24+
export default moduleName;

0 commit comments

Comments
 (0)