Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/manager/modules/pci/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"globals": {
"moment": true
},
"rules": {
"class-methods-use-this": "off"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,23 @@ import keys from 'lodash/keys';
import partition from 'lodash/partition';
import reduce from 'lodash/reduce';
import some from 'lodash/some';
import groupBy from 'lodash/groupBy';

import { IMAGE_ASSETS } from './images.constants';
import { DISTANT_BACKUP_FEATURE } from '../../../projects/project/instances/instances.constants';

export default class ImagesListController {
/* @ngInject */
constructor(
$q,
OvhApiCloudProjectImage,
OvhApiCloudProjectSnapshot,
PciProjectsProjectInstanceService,
PciProjectImages,
ovhFeatureFlipping,
) {
this.$q = $q;
this.OvhApiCloudProjectImage = OvhApiCloudProjectImage;
this.OvhApiCloudProjectSnapshot = OvhApiCloudProjectSnapshot;
this.PciProjectsProjectInstanceService = PciProjectsProjectInstanceService;
this.PciProjectImages = PciProjectImages;
this.ovhFeatureFlipping = ovhFeatureFlipping;

this.IMAGE_ASSETS = IMAGE_ASSETS;
}
Expand All @@ -33,8 +35,11 @@ export default class ImagesListController {
this.isLoading = true;

return this.$q
.all([this.getImages(), this.getSnapshots()])
.then(() => this.findDefaultImage())
.all([this.getImages(), this.getSnapshots(), this.loadSnapshotRegions()])
.then(() => {
this.computeUnavailableSnapshots();
this.findDefaultImage();
})
.finally(() => {
this.isLoading = false;
});
Expand Down Expand Up @@ -112,15 +117,48 @@ export default class ImagesListController {
getSnapshots() {
return this.PciProjectImages.getSnapshots(this.serviceName).then(
(snapshots) => {
this.snapshots = snapshots;
this.unavailableSnapshotsPresent = some(
snapshots,
(snapshot) => !this.isCompatible(snapshot),
this.snapshots = groupBy(snapshots, (s) =>
s.region === this.region ? 'local' : 'distant',
);
},
);
}

loadSnapshotRegions() {
return this.$q
.all([
this.PciProjectsProjectInstanceService.getProductAvailability(
this.serviceName,
undefined,
'snapshot',
),
this.ovhFeatureFlipping.checkFeatureAvailability(
DISTANT_BACKUP_FEATURE,
),
])
.then(([productAvailability, feature]) => {
this.snapshotsPlans = productAvailability.plans.filter((p) =>
p.code.startsWith('snapshot.consumption'),
);
this.distantBackupAvailability = feature.isFeatureAvailable(
DISTANT_BACKUP_FEATURE,
);
});
}

computeUnavailableSnapshots() {
this.unavailableSnapshotsPresent = {
local: some(
this.snapshots.local,
(snapshot) => !this.isCompatible(snapshot),
),
distant: some(
this.snapshots.distant,
(snapshot) => !this.isCompatible(snapshot),
),
};
}

findDefaultImage() {
if (this.defaultImageId) {
// To cover case where image is deprecated
Expand Down Expand Up @@ -162,12 +200,12 @@ export default class ImagesListController {
}

if (!this.image) {
const snapshot = find(this.snapshots, {
const snapshot = find(this.snapshots.local, {
region: this.region,
id: this.defaultImageId,
});
if (snapshot) {
this.selectedTab = 'snapshots';
this.selectedTab = 'snapshots-local';
this.image = snapshot;

this.onImageChange(snapshot);
Expand Down Expand Up @@ -199,10 +237,13 @@ export default class ImagesListController {
}

isCompatible(image) {
return (
image.isAvailableInRegion(this.region) &&
image.isCompatibleWithFlavor(this.flavorType) &&
image.isCompatibleWithOsTypes(this.osTypes)
return this.PciProjectImages.isImageCompatible(
image,
this.region,
this.flavorType,
this.osTypes,
this.snapshotsPlans,
this.distantBackupAvailability,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,16 @@
</oui-tabs-item>

<oui-tabs-item
data-id="snapshots"
data-ng-if="$ctrl.snapshots.length > 0"
data-heading="{{:: 'pci_project_instances_shapshots' | translate }}"
data-on-active="$ctrl.onTabChange({ tab: 'snapshots' })"
data-ng-repeat="(localisation, snapshots) in $ctrl.snapshots track by localisation"
data-id="snapshots-{{localisation}}"
data-ng-if="snapshots.length > 0 && (localisation !== 'distant' || $ctrl.distantBackupAvailability)"
data-heading="{{:: 'pci_project_instances_shapshots_' + localisation | translate }}"
data-on-active="$ctrl.onTabChange({ tab: 'snapshots-' + localisation })"
>
<div class="container-fluid px-0">
<div class="row">
<oui-select-picker
data-ng-repeat="snapshot in $ctrl.snapshots track by snapshot.id"
data-ng-repeat="snapshot in snapshots track by snapshot.id"
class="d-inline-block col-md-6 col-xl-4 my-3"
data-name="{{:: snapshot.id }}"
data-label="{{:: snapshot.name }}"
Expand All @@ -143,7 +144,7 @@
</oui-select-picker>
</div>
<oui-checkbox
data-ng-if="$ctrl.unavailableSnapshotsPresent"
data-ng-if="$ctrl.unavailableSnapshotsPresent[localisation]"
data-model="$ctrl.showNonAvailable"
>
<span
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import filter from 'lodash/filter';
import groupBy from 'lodash/groupBy';
import map from 'lodash/map';
import pick from 'lodash/pick';
Expand All @@ -8,6 +7,10 @@ import uniq from 'lodash/uniq';

import Image from './images.class';
import { IMAGES_REGEX, REGEX_PREFIX_BAREMETAL } from './images.constants';
import {
ONE_AZ_REGION,
THREE_AZ_REGION,
} from '../../../projects/project/project.constants';

function getDistribution(name, type) {
const os = IMAGES_REGEX[type];
Expand Down Expand Up @@ -96,12 +99,40 @@ export default class ImagesList {
);
}

static getCompatibleImages(images, region, flavorType) {
return filter(
images,
(image) =>
image.isAvailableInRegion(region) &&
image.isCompatibleWithFlavor(flavorType),
// eslint-disable-next-line class-methods-use-this
isImageCompatible(
image,
targetRegionName,
flavorType,
osTypes,
snapshotsPlans,
distantBackupAvailability,
) {
if (image.isBackup()) {
const targetRegion = snapshotsPlans
.flatMap((p) => p.regions)
.find((r) => r.name === targetRegionName);

if (targetRegionName !== image.region) {
if (!distantBackupAvailability) return false;

if (![ONE_AZ_REGION, THREE_AZ_REGION].includes(targetRegion.type))
return false;

const imageRegion = snapshotsPlans
.find((p) => p.code === image.planCode)
.regions.find((r) => r.name === image.region);

if (![ONE_AZ_REGION, THREE_AZ_REGION].includes(imageRegion.type))
return false;
}
} else if (!image.isAvailableInRegion(targetRegionName)) {
return false;
}

return (
image.isCompatibleWithFlavor(flavorType) &&
image.isCompatibleWithOsTypes(osTypes)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
"pci_project_instances_distribution_baremetal_ubuntu": "Ubuntu",
"pci_project_instances_distribution_baremetal_windows_server_2012": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_server_2016": "Windows Server 2016",
"pci_project_instances_distribution_baremetal_windows_other": "Andere Windows-Distributionen"
"pci_project_instances_distribution_baremetal_windows_other": "Andere Windows-Distributionen",
"pci_project_instances_shapshots_local": "Lokales Backup",
"pci_project_instances_shapshots_distant": "Remote-Backup"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
"pci_project_instances_distribution_baremetal_ubuntu": "Ubuntu",
"pci_project_instances_distribution_baremetal_windows_server_2012": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_server_2016": "Windows Server 2016",
"pci_project_instances_distribution_baremetal_windows_other": "Other Windows operating systems"
"pci_project_instances_distribution_baremetal_windows_other": "Other Windows operating systems",
"pci_project_instances_shapshots_local": "Local Backup",
"pci_project_instances_shapshots_distant": "Remote Backup"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
"pci_project_instances_distribution_baremetal_ubuntu": "Ubuntu",
"pci_project_instances_distribution_baremetal_windows_server_2012": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_server_2016": "Windows Server 2016",
"pci_project_instances_distribution_baremetal_windows_other": "Otras distribuciones Windows"
"pci_project_instances_distribution_baremetal_windows_other": "Otras distribuciones Windows",
"pci_project_instances_shapshots_local": "Backup local",
"pci_project_instances_shapshots_distant": "Backup remoto"
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
"pci_project_instances_os_baremetal-linux": "Bare Metal distributions",
"pci_project_instances_distribution_unknown": "Bare Metal distributions",
"pci_project_instances_apps": "Distributions + Apps",
"pci_project_instances_shapshots": "Backups",
"pci_project_instances_shapshots_local": "Backup Local",
"pci_project_instances_shapshots_distant": "Backup Distant",
"pci_project_instances_licence": "L'utilisation d'une image est soumise à l'acceptation préalable du Contrat de license utilisateur du fournisseur.",
"pci_project_instances_distribution_linux": "Linux",
"pci_project_instances_distribution_linux_other": "Arch Linux",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
"pci_project_instances_os_baremetal-linux": "Bare Metal distributions",
"pci_project_instances_distribution_unknown": "Bare Metal distributions",
"pci_project_instances_apps": "Distributions + Apps",
"pci_project_instances_shapshots": "Backups",
"pci_project_instances_shapshots_local": "Backup Local",
"pci_project_instances_shapshots_distant": "Backup Distant",
"pci_project_instances_licence": "L'utilisation d'une image est soumise à l'acceptation préalable du Contrat de license utilisateur du fournisseur.",
"pci_project_instances_distribution_linux": "Linux",
"pci_project_instances_distribution_linux_other": "Arch Linux",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
"pci_project_instances_distribution_baremetal_ubuntu": "Ubuntu",
"pci_project_instances_distribution_baremetal_windows_server_2012": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_server_2016": "Windows Server 2016",
"pci_project_instances_distribution_baremetal_windows_other": "Altre distribuzioni Windows"
"pci_project_instances_distribution_baremetal_windows_other": "Altre distribuzioni Windows",
"pci_project_instances_shapshots_local": "Backup locale",
"pci_project_instances_shapshots_distant": "Backup remoto"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
"pci_project_instances_distribution_baremetal_ubuntu": "Ubuntu",
"pci_project_instances_distribution_baremetal_windows_server_2012": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_server_2016": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_other": "Inne dystrybucje Windows"
"pci_project_instances_distribution_baremetal_windows_other": "Inne dystrybucje Windows",
"pci_project_instances_shapshots_local": "Lokalny backup",
"pci_project_instances_shapshots_distant": "Zdalny backup"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@
"pci_project_instances_distribution_baremetal_ubuntu": "Ubuntu",
"pci_project_instances_distribution_baremetal_windows_server_2012": "Windows Server 2012",
"pci_project_instances_distribution_baremetal_windows_server_2016": "Windows Server 2016",
"pci_project_instances_distribution_baremetal_windows_other": "Outras distribuições Windows"
"pci_project_instances_distribution_baremetal_windows_other": "Outras distribuições Windows",
"pci_project_instances_shapshots_local": "Backup local",
"pci_project_instances_shapshots_distant": "Backup remoto"
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ export default {
includeCategories: '<?',
projectId: '@',
privateNetworks: '<',
publicNetwork: '<',
regions: '<',
prices: '<',
quotaLink: '<',
Expand Down
Loading
Loading