From 48cde51ff1fa71664f9d009b4eddc8cf2f2f81d2 Mon Sep 17 00:00:00 2001 From: mhalheli soufien Date: Tue, 7 May 2024 08:38:15 +0200 Subject: [PATCH 1/3] feat(dedicated): add slaac option to vrack ipv6 block ref: MANAGER-13715 Signed-off-by: mhalheli soufien --- .../vrack/src/dashboard/vrack.constant.js | 5 ++ .../ipv6/ipv6.controller.js | 79 ++++++++++++++++--- .../vrack-associated-services/ipv6/ipv6.html | 57 +++++++++++-- .../vrack-associated-services/ipv6/ipv6.less | 6 +- .../ipv6/ipv6.service.js | 27 +++++++ 5 files changed, 157 insertions(+), 17 deletions(-) diff --git a/packages/manager/modules/vrack/src/dashboard/vrack.constant.js b/packages/manager/modules/vrack/src/dashboard/vrack.constant.js index 2ce602184fbd..680f4dcfba95 100644 --- a/packages/manager/modules/vrack/src/dashboard/vrack.constant.js +++ b/packages/manager/modules/vrack/src/dashboard/vrack.constant.js @@ -46,6 +46,11 @@ export const STATUS = { delivered: 'delivered', }; +export const SLAAC_VALUES = { + enabled: true, + disabled: false, +}; + export const VRACK_DASHBOARD_TRACKING_PREFIX = 'vrack::dashboard'; export const VRACK_ACTIONS_SUFFIX = 'action'; diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js index 09c61d6cb774..0d7f2044de41 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js @@ -1,4 +1,4 @@ -import { POLLING_INTERVAL } from '../../dashboard/vrack.constant'; +import { POLLING_INTERVAL, SLAAC_VALUES } from '../../dashboard/vrack.constant'; export default class VrackAssignedIpCtrl { /* @ngInject */ @@ -21,7 +21,33 @@ export default class VrackAssignedIpCtrl { } $onInit() { - this.refreshData(); + this.vrackAssignedIpv6Service + .fetchAllBridgedSubrange(this.serviceName, this.ip.niceName) + .then(({ data }) => { + this.$q + .all( + data.map((bridgedSubrange) => { + return this.vrackAssignedIpv6Service + .getBridgedSubrange( + this.serviceName, + this.ip.niceName, + bridgedSubrange, + ) + .then((res) => { + return { + ...res.data, + model: SLAAC_VALUES[res.data.slaac], + loading: false, + }; + }); + }), + ) + .then((bridges) => { + this.bridgedSubranges = bridges; + }); + }); + + this.loadSubnet(); } openAddSubnetModal() { @@ -44,7 +70,10 @@ export default class VrackAssignedIpCtrl { nexthop, }) .then(({ data }) => { - this.watingTask(data.id); + this.loader = true; + this.watingTask(data.id, () => { + this.loadSubnet(); + }); }) .catch((err) => { this.CucCloudMessage.error( @@ -61,6 +90,34 @@ export default class VrackAssignedIpCtrl { }; } + toggleSubrang(bridgedSubrange) { + const bridged = bridgedSubrange; + bridged.loading = true; + const targetValue = !bridged.model; + this.CucCloudMessage.flushMessages('vrack'); + this.vrackAssignedIpv6Service + .updateBridgedSubrange( + this.serviceName, + this.ip.niceName, + bridged.bridgedSubrange, + targetValue, + ) + .then(({ data }) => { + this.watingTask(data.id, () => { + bridged.model = targetValue; + bridged.loading = false; + }); + }) + .catch((err) => { + this.CucCloudMessage.error( + [ + this.$translate.instant('vrack_error'), + err?.data?.message || err.message || '', + ].join(' '), + ); + }); + } + openDeleteSubnetModal(subnet) { this.deleteSubnetModalContext = { isOpenModal: true, @@ -70,7 +127,10 @@ export default class VrackAssignedIpCtrl { this.vrackAssignedIpv6Service .deleteIpVrackSubnet(this.serviceName, this.ip.niceName, subnet) .then(({ data }) => { - this.watingTask(data.id); + this.loader = true; + this.watingTask(data.id, () => { + this.loadSubnet(); + }); }) .catch((err) => { this.CucCloudMessage.error( @@ -87,16 +147,16 @@ export default class VrackAssignedIpCtrl { }; } - refreshData() { + loadSubnet() { this.vrackAssignedIpv6Service .getIpVrackSubnet(this.serviceName, this.ip.niceName) .then(({ data }) => { + this.loader = false; this.subnets = data; }); } - watingTask(taskId) { - this.loader = true; + watingTask(taskId, callback) { this.OvhApiVrack.v6() .task({ serviceName: this.serviceName, @@ -104,12 +164,11 @@ export default class VrackAssignedIpCtrl { }) .$promise.then(() => { this.$timeout(() => { - this.watingTask(taskId); + this.watingTask(taskId, callback); }, POLLING_INTERVAL); }) .catch(() => { - this.loader = false; - this.refreshData(); + if (callback) callback(); }); } } diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html index f0f324641841..1d45cb6c59f3 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html @@ -1,5 +1,5 @@ -
-
+
+
+ +
  • + + SLAAC + + + + + + + +
    • -
    • +
    • diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less index a3771fb4ffc2..49daf34eb646 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less @@ -1,14 +1,15 @@ @import '../../dashboard/vrack-mapper.less'; .vrack { - &__assigned-ip { + &__assigned-ipv6 { &__sub-item { display: flex; justify-content: end; flex-flow: wrap; } - &__subnet { + &__subnet, + &__subrang { list-style: none; padding: 0.625rem 0.9375rem; border-width: 1px; @@ -22,6 +23,7 @@ user-select: none; cursor: default; box-shadow: @vrack-service-box-shadow_selected; + overflow: hidden; &__title { text-overflow: ellipsis; diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.service.js b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.service.js index a79cacd2c946..b888d69319bb 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.service.js +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.service.js @@ -24,6 +24,33 @@ export default class VrackAssignedIpService { ); } + fetchAllBridgedSubrange(serviceName, ipBlock) { + return this.$http.get( + `/vrack/${encodeURIComponent(serviceName)}/ipv6/${encodeURIComponent( + ipBlock, + )}/bridgedSubrange`, + ); + } + + getBridgedSubrange(serviceName, ipBlock, bridgedSubrange) { + return this.$http.get( + `/vrack/${encodeURIComponent(serviceName)}/ipv6/${encodeURIComponent( + ipBlock, + )}/bridgedSubrange/${encodeURIComponent(bridgedSubrange)}`, + ); + } + + updateBridgedSubrange(serviceName, ipBlock, bridgedSubrange, status) { + return this.$http.put( + `/vrack/${encodeURIComponent(serviceName)}/ipv6/${encodeURIComponent( + ipBlock, + )}/bridgedSubrange/${encodeURIComponent(bridgedSubrange)}`, + { + slaac: status ? 'enabled' : 'disabled', + }, + ); + } + deleteIpVrackSubnet(serviceName, ipBlock, routedSubrange) { return this.$http.delete( `/vrack/${encodeURIComponent(serviceName)}/ipv6/${encodeURIComponent( From 449171d9399321efe895d25d362cbdf7593ed7ec Mon Sep 17 00:00:00 2001 From: mhalheli soufien Date: Thu, 9 May 2024 23:45:25 +0200 Subject: [PATCH 2/3] feat(dedicated): add slaac guides links --- .../vrack/src/dashboard/vrack.constant.js | 35 +++++++++++++++++++ .../ipv6/ipv6.controller.js | 10 +++++- .../vrack-associated-services/ipv6/ipv6.html | 3 +- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/manager/modules/vrack/src/dashboard/vrack.constant.js b/packages/manager/modules/vrack/src/dashboard/vrack.constant.js index 680f4dcfba95..b5237f72c823 100644 --- a/packages/manager/modules/vrack/src/dashboard/vrack.constant.js +++ b/packages/manager/modules/vrack/src/dashboard/vrack.constant.js @@ -26,6 +26,41 @@ export const VRACK_URLS = { }, }; +export const SLAAC_GUIDES_LINK = { + DE: + 'https://help.ovhcloud.com/csm/de-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062832', + ASIA: + 'https://help.ovhcloud.com/csm/asia-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062833', + AU: + 'https://help.ovhcloud.com/csm/en-au-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062836', + CA: + 'https://help.ovhcloud.com/csm/en-ca-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062827', + GB: + 'https://help.ovhcloud.com/csm/en-gb-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062828', + IE: + 'https://help.ovhcloud.com/csm/en-ie-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062826', + SG: + 'https://help.ovhcloud.com/csm/en-sg-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062829', + EN: + 'https://help.ovhcloud.com/csm/en-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062838', + ES: + 'https://help.ovhcloud.com/csm/es-es-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062830', + WS: + 'https://help.ovhcloud.com/csm/es-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062835', + QC: + 'https://help.ovhcloud.com/csm/fr-ca-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062834', + FR: + 'https://help.ovhcloud.com/csm/fr-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062825', + IT: + 'https://help.ovhcloud.com/csm/it-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062839', + PL: + 'https://help.ovhcloud.com/csm/pl-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062837', + PT: + 'https://help.ovhcloud.com/csm/pt-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062831', + DEFAULT: + 'https://help.ovhcloud.com/csm/en-ie-dedicated-servers-configure-an-ipv6-in-a-vrack?id=kb_article_view&sysparm_article=KB0062826', +}; + export const FEATURE_NAMES = { cloudProject: 'public-cloud', dedicatedCloud: 'dedicated-cloud', diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js index 0d7f2044de41..62791f2fd36f 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.controller.js @@ -1,4 +1,8 @@ -import { POLLING_INTERVAL, SLAAC_VALUES } from '../../dashboard/vrack.constant'; +import { + POLLING_INTERVAL, + SLAAC_VALUES, + SLAAC_GUIDES_LINK, +} from '../../dashboard/vrack.constant'; export default class VrackAssignedIpCtrl { /* @ngInject */ @@ -9,6 +13,7 @@ export default class VrackAssignedIpCtrl { vrackAssignedIpv6Service, $translate, OvhApiVrack, + coreConfig, ) { this.$q = $q; this.vrackAssignedIpv6Service = vrackAssignedIpv6Service; @@ -18,6 +23,9 @@ export default class VrackAssignedIpCtrl { this.$timeout = $timeout; this.loading = false; this.subnets = []; + this.user = coreConfig.getUser(); + this.slaacGuidesLink = + SLAAC_GUIDES_LINK[this.user.ovhSubsidiary] || SLAAC_GUIDES_LINK.DEFAULT; } $onInit() { diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html index 1d45cb6c59f3..5b471498a43c 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.html @@ -33,6 +33,7 @@ class="oui-popover-button" data-oui-popover="{{:: 'vrack__assigned-ipv6__subrang_slaac_help' | translate }}" data-oui-popover-placement="right" + data-oui-popover-scope="$ctrl" data-oui-popover-template="vrack__assigned-ipv6__subrang_slaac_help.html" > diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less index 49daf34eb646..bd1ddfcda50a 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/ipv6.less @@ -9,7 +9,7 @@ } &__subnet, - &__subrang { + &__subrange { list-style: none; padding: 0.625rem 0.9375rem; border-width: 1px; diff --git a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/translations/Messages_fr_FR.json b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/translations/Messages_fr_FR.json index 7872fd522c40..ab5765e909d7 100644 --- a/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/translations/Messages_fr_FR.json +++ b/packages/manager/modules/vrack/src/vrack-associated-services/ipv6/translations/Messages_fr_FR.json @@ -1,7 +1,7 @@ { "vrack__assigned-ipv6_add_subnet": "Ajouter un sous réseau", - "vrack__assigned-ipv6__subrang_slaac_help": "L'activation de SLAAC facilite l'adressage IPv6, mais évitez de l'utiliser avec plusieurs région utilisés par vRack", - "vrack__assigned-ipv6__subrang_slaac_help_tooltip_link": "Plus de détails", + "vrack__assigned-ipv6__subrange_slaac_help": "L'activation de SLAAC facilite l'adressage IPv6, mais évitez de l'utiliser avec plusieurs région utilisés par vRack", + "vrack__assigned-ipv6__subrange_slaac_help_tooltip_link": "Plus de détails", "vrack__assigned-ipv6__subnet_add_title": "Ajouter un sous-réseau", "vrack__assigned-ipv6__subnet_add_description": "Vous allez ajouter un nouveau sous-réseau routé /64 à votre vRack. Veuillez spécifier le préfixe (qui ne doit pas chevaucher un autre préfixe existant) ainsi que l'adresse next-hop qui doit faire partie du premier sous-réseau /64 (bridged) de votre bloc IPv6 additionnel.", "vrack__assigned-ipv6__subnet_add_subnet": "IPv6 subnet en format CIDR",