Skip to content

Commit b91a9f8

Browse files
radireddyantleblanc
authored andcommitted
feat(pci.project.kubernetes.details): switch to monthly billing (#470)
show node billing type and provide an option to switch node billing type to monthly ref: MBP-354
1 parent 6382f28 commit b91a9f8

File tree

13 files changed

+206
-9
lines changed

13 files changed

+206
-9
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import controller from './billing-type.controller';
2+
import template from './billing-type.html';
3+
4+
const component = {
5+
bindings: {
6+
goBack: '<',
7+
instanceId: '<',
8+
kubeId: '<',
9+
nodeId: '<',
10+
nodeName: '<',
11+
projectId: '<',
12+
},
13+
controller,
14+
template,
15+
};
16+
17+
export default component;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import get from 'lodash/get';
2+
3+
export default class KubernetesNodesBillingTypeCtrl {
4+
/* @ngInject */
5+
constructor(
6+
$translate, Kubernetes,
7+
) {
8+
this.$translate = $translate;
9+
this.Kubernetes = Kubernetes;
10+
}
11+
12+
$onInit() {
13+
this.loading = false;
14+
}
15+
16+
switchToMonthlyBilling() {
17+
this.loading = true;
18+
return this.Kubernetes.switchToMonthlyBilling(this.projectId, this.instanceId)
19+
.then(() => this.goBack(
20+
this.$translate.instant('kube_nodes_switch_billing_type_success'),
21+
))
22+
.catch(error => this.goBack(
23+
this.$translate.instant('kube_nodes_switch_billing_type_error', {
24+
message: get(error, 'data.message'),
25+
}), 'error',
26+
))
27+
.finally(() => { this.loading = false; });
28+
}
29+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<form id="swithToMonthlyBilling"
2+
name="swithToMonthlyBilling"
3+
data-ng-submit="swithToMonthlyBilling.$valid && $ctrl.switchToMonthlyBilling()"
4+
novalidate>
5+
<oui-modal data-heading="{{ ::'kube_nodes_switch_to_monthly_billing_title' | translate }}"
6+
data-primary-label="{{ ::'kube_nodes_common_confirm' | translate }}"
7+
data-secondary-label="{{ ::'kube_nodes_common_cancel' | translate }}"
8+
data-secondary-action="$ctrl.goBack()"
9+
data-on-dismiss="$ctrl.goBack()"
10+
data-loading="$ctrl.loading">
11+
<p data-translate="kube_nodes_switch_to_monthly_billing_desc"
12+
data-translate-values="{ instanceName: $ctrl.nodeName }">
13+
</p>
14+
<p data-translate="kube_nodes_switch_to_monthly_billing_info"></p>
15+
</oui-modal>
16+
</form>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import angular from 'angular';
2+
3+
import component from './billing-type.component';
4+
import routing from './billing-type.routing';
5+
6+
const moduleName = 'ovhManagerPciProjectsProjectKubernetesNodesBillingType';
7+
8+
angular.module(moduleName, [])
9+
.config(routing)
10+
.run(/* @ngTranslationsInject:json ./translations */)
11+
.component('pciProjectsProjectKubernetesNodesBillingTypeComponent', component);
12+
13+
export default moduleName;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
export default /* @ngInject */ ($stateProvider) => {
2+
$stateProvider
3+
.state('pci.projects.project.kubernetes.details.nodes.billing-type', {
4+
url: '/billing-type?nodeId',
5+
views: {
6+
modal: {
7+
component: 'pciProjectsProjectKubernetesNodesBillingTypeComponent',
8+
},
9+
},
10+
layout: 'modal',
11+
params: {
12+
instanceId: null,
13+
nodeId: null,
14+
nodeName: null,
15+
},
16+
resolve: {
17+
goBack: /* @ngInject */ goToKubernetesNodes => goToKubernetesNodes,
18+
nodeId: /* @ngInject */ $transition$ => $transition$.params().nodeId,
19+
nodeName: /* @ngInject */ $transition$ => $transition$.params().nodeName,
20+
instanceId: /* @ngInject */ $transition$ => $transition$.params().instanceId,
21+
},
22+
});
23+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import angular from 'angular';
2+
import '@uirouter/angularjs';
3+
import 'oclazyload';
4+
5+
const moduleName = 'ovhManagerPciProjectKubernetesDetailsNodesBillingTypeLazyloading';
6+
7+
angular
8+
.module(moduleName, [
9+
'ui.router',
10+
'oc.lazyLoad',
11+
])
12+
.config(/* @ngInject */($stateProvider) => {
13+
$stateProvider.state('pci.projects.project.kubernetes.details.nodes.billing-type.**', {
14+
url: '/billing-type',
15+
lazyLoad: ($transition$) => {
16+
const $ocLazyLoad = $transition$.injector().get('$ocLazyLoad');
17+
return import('./billing-type.module')
18+
.then(mod => $ocLazyLoad.inject(mod.default || mod));
19+
},
20+
});
21+
});
22+
23+
export default moduleName;

packages/manager/modules/pci/src/projects/project/kubernetes/details/nodes/component.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const component = {
66
addNode: '<',
77
cluster: '<',
88
deleteNode: '<',
9+
switchBillingType: '<',
910
kubeId: '<',
1011
nodes: '<',
1112
projectId: '<',

packages/manager/modules/pci/src/projects/project/kubernetes/details/nodes/controller.js

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
import find from 'lodash/find';
2+
import get from 'lodash/get';
3+
import isEmpty from 'lodash/isEmpty';
24
import set from 'lodash/set';
35

46
import { STATUS } from '../constants';
57

68
export default class KubernetesNodesCtrl {
79
/* @ngInject */
810
constructor(
9-
$state,
11+
$q,
12+
$translate,
1013
CucCloudMessage,
1114
Kubernetes,
1215
OvhApiCloudProjectFlavor,
1316
OvhApiCloudProjectKube,
1417
) {
15-
this.$state = $state;
18+
this.$q = $q;
19+
this.$translate = $translate;
1620
this.CucCloudMessage = CucCloudMessage;
1721
this.Kubernetes = Kubernetes;
1822
this.OvhApiCloudProjectFlavor = OvhApiCloudProjectFlavor;
@@ -47,4 +51,29 @@ export default class KubernetesNodesCtrl {
4751
set(node, 'formattedFlavor', this.$translate.instant('kube_nodes_flavor_error'));
4852
});
4953
}
54+
55+
loadRowData(node) {
56+
return this.$q.all([
57+
this.getAssociatedFlavor(node),
58+
this.getBillingType(node),
59+
]);
60+
}
61+
62+
getBillingType(node) {
63+
return this.Kubernetes.getProjectInstances(this.projectId)
64+
.then((instances) => {
65+
const instance = find(instances, item => item.id === node.instanceId);
66+
const monthlyBilling = get(instance, 'monthlyBilling');
67+
if (isEmpty(monthlyBilling)) {
68+
set(node, 'billingType', 'hourly');
69+
} else if (monthlyBilling.status === 'ok') {
70+
set(node, 'billingType', 'monthly');
71+
} else {
72+
set(node, 'billingType', 'monthly_pending');
73+
}
74+
})
75+
.catch(() => {
76+
this.CucCloudMessage.error(this.$translate.instant('kube_nodes_instances_error'));
77+
});
78+
}
5079
}

packages/manager/modules/pci/src/projects/project/kubernetes/details/nodes/nodes.module.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import angular from 'angular';
22

3-
import routing from './nodes.routing';
4-
5-
import nodeComponents from './component';
63
import add from './add';
74
import deleteNode from './delete';
5+
import nodeComponents from './component';
6+
import routing from './nodes.routing';
7+
import switchBillingType from './billing-type';
88

99
const moduleName = 'ovhManagerPciProjectKubernetesNodes';
1010

1111
angular.module(moduleName, [
1212
add,
1313
deleteNode,
14+
switchBillingType,
1415
])
1516
.config(routing)
1617
.run(/* @ngTranslationsInject:json ./translations */)

packages/manager/modules/pci/src/projects/project/kubernetes/details/nodes/nodes.routing.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ export default /* @ngInject */ ($stateProvider) => {
2121
nodeId,
2222
}),
2323

24+
switchBillingType: /* @ngInject */ (
25+
$state, kubeId, projectId,
26+
) => (nodeId, nodeName, instanceId) => $state.go('pci.projects.project.kubernetes.details.nodes.billing-type', {
27+
instanceId,
28+
kubeId,
29+
projectId,
30+
nodeId,
31+
nodeName,
32+
}),
33+
2434
nodes: /* @ngInject */ (
2535
kubeId,
2636
OvhApiCloudProjectKube,

0 commit comments

Comments
 (0)