diff --git a/src/react/ISV/modules/index.tsx b/src/react/ISV/modules/index.tsx
index c61369695..e22149741 100644
--- a/src/react/ISV/modules/index.tsx
+++ b/src/react/ISV/modules/index.tsx
@@ -3,6 +3,7 @@ import { ISVPlatformConfig } from '../types';
import styled from 'styled-components';
import Joi from '@hapi/joi';
import { Commvault } from './commvault';
+import { VeeamVBO } from './veeam-vbo';
export const ListItem = styled.li`
padding: 0.5rem;
@@ -21,6 +22,6 @@ export const checkDecimals = (value: number, helpers: Joi.CustomHelpers) => {
return value;
};
-export const isvModules: ISVPlatformConfig[] = [Veeam, Commvault];
+export const isvModules: ISVPlatformConfig[] = [Veeam, Commvault, VeeamVBO];
export type { ISVPlatformConfig };
diff --git a/src/react/ISV/modules/veeam-vbo/index.tsx b/src/react/ISV/modules/veeam-vbo/index.tsx
new file mode 100644
index 000000000..21dce531c
--- /dev/null
+++ b/src/react/ISV/modules/veeam-vbo/index.tsx
@@ -0,0 +1,162 @@
+import { ISVPlatformConfig } from '../../types';
+import { VeeamLogo } from '../../../ui-elements/Veeam/VeeamLogo';
+import Joi from '@hapi/joi';
+import { Text } from '@scality/core-ui';
+import { checkDecimals, ListItem } from '../index';
+import { accountNameValidationSchema } from '../../../account/AccountCreate';
+import { bucketNameValidationSchema } from '../../../databrowser/buckets/BucketCreate';
+import { VEEAM_BACKUP_REPLICATION_XML_VALUE } from '../../../ui-elements/Veeam/VeeamConstants';
+
+const AccountTooltip = () => {
+ return (
+
+
+ Enter a unique ARTESCA account name, where your S3 & IAM Veeam resources
+ will be structured.
+
+
+ This information won’t be required by the Veeam console.
+
+
+ );
+};
+
+const ApplicationTooltip = () => {
+ return (
+
+ Choose the Veeam application you're setting up.
+
+ Features such as Immutable Backup and Max Repository Capacity (that
+ provides notification via Smart Object Storage API) are only supported
+ in Veeam Backup and Replication, and not in Veeam Backup for Microsoft
+ 365.
+
+
+ );
+};
+
+const BucketNameTooltip = () => {
+ return (
+
+
+ This bucket is your future Veeam destination. You'll need it when
+ setting up your Veeam application. We'll also include this in the
+ summary provided by our Veeam assistant at the end.
+
+
+ The bucket name should follow few constraints:
+
+ - Must be unique,
+ - Cannot be modified after creation
+ -
+ Bucket names can include only lowercase letters, numbers, dots (.),
+ and hyphens (-).
+
+
+
+
+ );
+};
+
+const CapacityTooltip = () => {
+ return (
+
+ - Set the maximum capacity for your Veeam backup repository
+ - This will help monitor and manage your storage usage
+
+ );
+};
+
+const EnableImmutableBackupTooltip = () => {
+ return (
+
+
+ Veeam's Immutable Backup feature enhances data protection by using S3
+ Object-lock technology.
+
+
+ By selecting the Immutable Backup feature, the ARTESCA bucket is created
+ with Object-lock enabled.
+
+
+ Data backed up to your ARTESCA S3 bucket via Veeam will be immutable.
+
+
+ );
+};
+
+export const VeeamVBO: ISVPlatformConfig = {
+ id: 'veeam-vbo',
+ name: 'Veeam',
+ logo: ,
+ description: 'Prepare ARTESCA for ',
+ bucketTag: 'veeam-backup',
+ skipModalContent: (
+
+ To start Veeam assistant configuration again, you can go to the{' '}
+ Accounts page. If the platform doesn't have any accounts, it will
+ also prompt you on your next login.
+
+ ),
+ fieldOverrides: [
+ {
+ name: 'accountName',
+ label: 'Account',
+ placeholder: 'Enter account name',
+ tooltip: ,
+ },
+ {
+ name: 'application',
+ label: 'Veeam application',
+ placeholder: 'Select Veeam application',
+ tooltip: ,
+ },
+ {
+ name: 'bucketName',
+ label: 'Bucket name',
+ placeholder: 'Enter bucket name',
+ tooltip: ,
+ },
+ {
+ name: 'capacity',
+ label: 'Repository Capacity',
+ placeholder: 'Enter capacity',
+ tooltip: ,
+ },
+ {
+ name: 'enableImmutableBackup',
+ label: 'Immutable Backup',
+ tooltip: ,
+ },
+ ],
+ validator: Joi.object({
+ accountName: accountNameValidationSchema,
+ accountNameType: Joi.string().required(),
+ IAMUserName: accountNameValidationSchema,
+ IAMUserNameType: Joi.string().required(),
+ generateKey: Joi.boolean().required(),
+ application: Joi.string().required(),
+ enableImmutableBackup: Joi.boolean().required(),
+ buckets: Joi.array().items(
+ Joi.object({
+ name: bucketNameValidationSchema,
+ tag: Joi.string(),
+ capacity: Joi.when('application', {
+ is: Joi.equal(VEEAM_BACKUP_REPLICATION_XML_VALUE),
+ then: Joi.number()
+ .required()
+ .min(1)
+ .max(1024)
+ .custom((value, helpers) => checkDecimals(value, helpers)),
+ otherwise: Joi.valid(),
+ }),
+ capacityUnit: Joi.when('application', {
+ is: Joi.equal(VEEAM_BACKUP_REPLICATION_XML_VALUE),
+ then: Joi.string().required(),
+ otherwise: Joi.valid(),
+ }),
+ capacityBytes: Joi.number().required(),
+ }),
+ ),
+ }),
+};
diff --git a/src/react/ISV/types/index.ts b/src/react/ISV/types/index.ts
index 47f46393b..eee190d58 100644
--- a/src/react/ISV/types/index.ts
+++ b/src/react/ISV/types/index.ts
@@ -1,6 +1,6 @@
import Joi from '@hapi/joi';
-export type ISVPlatform = 'veeam' | 'commvault';
+export type ISVPlatform = 'veeam' | 'commvault' | 'veeam-vbo';
export type ISVConfig = {
accountName: string;
diff --git a/src/react/ui-elements/PartnerApp/ISVList.tsx b/src/react/ui-elements/PartnerApp/ISVList.tsx
index d42ca14ea..7ed5e5f19 100644
--- a/src/react/ui-elements/PartnerApp/ISVList.tsx
+++ b/src/react/ui-elements/PartnerApp/ISVList.tsx
@@ -14,16 +14,16 @@ import React from 'react';
export const ISVList = [
{
id: 'veeam',
-
name: 'Veeam',
logo: ,
type: VEEAM_BACKUP_REPLICATION,
},
- // {
- // name: 'Veeam VBO',
- // logo: ,
- // type: 'Veeam Backup for Microsoft 365',
- // },
+ {
+ id: 'veeam-vbo',
+ name: 'Veeam VBO',
+ logo: ,
+ type: 'Veeam Backup for Microsoft 365',
+ },
{ id: 'commvault', name: 'Commvault', logo: },
];