diff --git a/@xen-orchestra/lite/CHANGELOG.md b/@xen-orchestra/lite/CHANGELOG.md
index 6f5aa925b..c9075e534 100644
--- a/@xen-orchestra/lite/CHANGELOG.md
+++ b/@xen-orchestra/lite/CHANGELOG.md
@@ -7,6 +7,7 @@
- Added tooltip on CPU provisioning warning icon (PR [#7223](https://github.com/vatesfr/xen-orchestra/pull/7223))
- Add indeterminate state on FormToggle component (PR [#7230](https://github.com/vatesfr/xen-orchestra/pull/7230))
- Add new UiStatusPanel component (PR [#7227](https://github.com/vatesfr/xen-orchestra/pull/7227))
+- XOA quick deploy (PR [#7245](https://github.com/vatesfr/xen-orchestra/pull/7245))
- Fix infinite loader when no stats on pool dashboard (PR [#7236](https://github.com/vatesfr/xen-orchestra/pull/7236))
## **0.1.6** (2023-11-30)
diff --git a/@xen-orchestra/lite/src/assets/base.css b/@xen-orchestra/lite/src/assets/base.css
index b5b04ac86..e4cde218f 100644
--- a/@xen-orchestra/lite/src/assets/base.css
+++ b/@xen-orchestra/lite/src/assets/base.css
@@ -21,7 +21,8 @@ a {
}
code,
-code * {
+code *,
+pre {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
}
diff --git a/@xen-orchestra/lite/src/assets/xo.svg b/@xen-orchestra/lite/src/assets/xo.svg
new file mode 100644
index 000000000..a369b8cf2
--- /dev/null
+++ b/@xen-orchestra/lite/src/assets/xo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/@xen-orchestra/lite/src/components/AppHeader.vue b/@xen-orchestra/lite/src/components/AppHeader.vue
index b09b78bf1..6b28a804e 100644
--- a/@xen-orchestra/lite/src/components/AppHeader.vue
+++ b/@xen-orchestra/lite/src/components/AppHeader.vue
@@ -13,6 +13,9 @@
+
+ {{ $t("deploy-xoa") }}
+
@@ -22,14 +25,20 @@
import AccountButton from "@/components/AccountButton.vue";
import PoolOverrideWarning from "@/components/PoolOverrideWarning.vue";
import TextLogo from "@/components/TextLogo.vue";
+import UiButton from "@/components/ui/UiButton.vue";
import UiIcon from "@/components/ui/icon/UiIcon.vue";
import { useNavigationStore } from "@/stores/navigation.store";
+import { useRouter } from "vue-router";
import { useUiStore } from "@/stores/ui.store";
-import { faBars } from "@fortawesome/free-solid-svg-icons";
+import { faBars, faDownload } from "@fortawesome/free-solid-svg-icons";
import { storeToRefs } from "pinia";
+const router = useRouter();
+
+const openXoaDeploy = () => router.push({ name: "xoa.deploy" });
+
const uiStore = useUiStore();
-const { isMobile } = storeToRefs(uiStore);
+const { isMobile, isDesktop } = storeToRefs(uiStore);
const navigationStore = useNavigationStore();
const { trigger: navigationTrigger } = storeToRefs(navigationStore);
@@ -62,5 +71,6 @@ const { trigger: navigationTrigger } = storeToRefs(navigationStore);
.right {
display: flex;
align-items: center;
+ gap: 2rem;
}
diff --git a/@xen-orchestra/lite/src/components/modals/InvalidFieldModal.vue b/@xen-orchestra/lite/src/components/modals/InvalidFieldModal.vue
new file mode 100644
index 000000000..af51fc7cb
--- /dev/null
+++ b/@xen-orchestra/lite/src/components/modals/InvalidFieldModal.vue
@@ -0,0 +1,34 @@
+
+
+
+ {{ $t("invalid-field") }}
+
+
+ {{ message }}
+
+
+
+
+ {{ $t("ok") }}
+
+
+
+
+
+
+
+
+
diff --git a/@xen-orchestra/lite/src/components/ui/UiRaw.vue b/@xen-orchestra/lite/src/components/ui/UiRaw.vue
new file mode 100644
index 000000000..5c2742cbd
--- /dev/null
+++ b/@xen-orchestra/lite/src/components/ui/UiRaw.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/@xen-orchestra/lite/src/libs/xen-api/xen-api.types.ts b/@xen-orchestra/lite/src/libs/xen-api/xen-api.types.ts
index 2d695ca0f..66afcbc11 100644
--- a/@xen-orchestra/lite/src/libs/xen-api/xen-api.types.ts
+++ b/@xen-orchestra/lite/src/libs/xen-api/xen-api.types.ts
@@ -54,6 +54,7 @@ type ObjectTypeToRecordMapping = {
host: XenApiHost;
host_metrics: XenApiHostMetrics;
message: XenApiMessage;
+ network: XenApiNetwork;
pool: XenApiPool;
sr: XenApiSr;
vm: XenApiVm;
@@ -113,9 +114,11 @@ export interface XenApiHost extends XenApiRecord<"host"> {
}
export interface XenApiSr extends XenApiRecord<"sr"> {
+ content_type: string;
name_label: string;
physical_size: number;
physical_utilisation: number;
+ shared: boolean;
}
export interface XenApiVm extends XenApiRecord<"vm"> {
diff --git a/@xen-orchestra/lite/src/locales/en.json b/@xen-orchestra/lite/src/locales/en.json
index 48a8e8557..296843ded 100644
--- a/@xen-orchestra/lite/src/locales/en.json
+++ b/@xen-orchestra/lite/src/locales/en.json
@@ -1,9 +1,13 @@
{
"about": "About",
+ "access-xoa": "Access XOA",
"add": "Add",
"add-filter": "Add filter",
"add-or": "+OR",
"add-sort": "Add sort",
+ "admin-login": "Admin login",
+ "admin-password": "Admin password",
+ "admin-password-confirm": "Confirm admin password",
"alarm-type": {
"cpu_usage": "CPU usage exceeds {n}%",
"disk_usage": "Disk usage exceeds {n}%",
@@ -26,12 +30,14 @@
"backup": "Backup",
"cancel": "Cancel",
"change-state": "Change state",
+ "check-errors": "Check out the errors:",
"click-to-display-alarms": "Click to display alarms:",
"click-to-return-default-pool": "Click here to return to the default pool",
"close": "Close",
"coming-soon": "Coming soon!",
"community": "Community",
"community-name": "{name} community",
+ "configuration": "Configuration",
"confirm-cancel": "Are you sure you want to cancel?",
"confirm-delete": "You're about to delete {0}",
"console": "Console",
@@ -43,14 +49,28 @@
"dashboard": "Dashboard",
"delete": "Delete",
"delete-vms": "Delete 1 VM | Delete {n} VMs",
+ "deploy": "Deploy",
+ "deploy-xoa": "Deploy XOA",
+ "deploy-xoa-available-on-desktop": "XOA deployment is available on your desktop interface",
+ "deploy-xoa-status": {
+ "configuring": "Configuring XOA…",
+ "importing": "Importing XOA…",
+ "not-responding": "XOA is not responding",
+ "ready": "XOA is ready!",
+ "starting": "Starting XOA…",
+ "waiting": "Waiting for XOA to respond…"
+ },
"descending": "descending",
"description": "Description",
+ "dhcp": "DHCP",
"disabled": "Disabled",
"display": "Display",
+ "dns": "DNS",
"do-you-have-needs": "You have needs and/or expectations? Let us know",
"documentation": "Documentation",
"documentation-name": "{name} documentation",
"edit-config": "Edit config",
+ "enabled": "Enabled",
"error-no-data": "Error, can't collect data.",
"error-occurred": "An error has occurred",
"export": "Export",
@@ -84,11 +104,16 @@
"force-shutdown": "Force shutdown",
"fullscreen": "Fullscreen",
"fullscreen-leave": "Leave fullscreen",
+ "gateway": "Gateway",
+ "n-gb-left": "{n} GB left",
+ "n-gb-required": "{n} GB required",
"go-back": "Go back",
"gzip": "gzip",
"here": "Here",
"hosts": "Hosts",
+ "invalid-field": "Invalid field",
"keep-me-logged": "Keep me logged in",
+ "keep-page-open": "Do not refresh or quit tab before end of deployment.",
"language": "Language",
"last-week": "Last week",
"learn-more": "Learn more",
@@ -104,6 +129,7 @@
"n-missing": "{n} missing",
"n-vms": "1 VM | {n} VMs",
"name": "Name",
+ "netmask": "Netmask",
"network": "Network",
"network-download": "Download",
"network-throughput": "Network throughput",
@@ -119,6 +145,7 @@
"not-found": "Not found",
"object": "Object",
"object-not-found": "Object {id} can't be found…",
+ "ok": "OK",
"on-object": "on {object}",
"open-console-in-new-tab": "Open console in new tab",
"or": "Or",
@@ -154,14 +181,23 @@
"selected-vms-in-execution": "Some selected VMs are running",
"send-ctrl-alt-del": "Send Ctrl+Alt+Del",
"send-us-feedback": "Send us feedback",
+ "select": {
+ "network": "Select a network",
+ "storage": "Select a storage"
+ },
"settings": "Settings",
"shutdown": "Shutdown",
"snapshot": "Snapshot",
"sort-by": "Sort by",
+ "ssh-account": "SSH account",
+ "ssh-login": "SSH login",
+ "ssh-password": "SSH password",
+ "ssh-password-confirm": "Confirm SSH password",
"stacked-cpu-usage": "Stacked CPU usage",
"stacked-ram-usage": "Stacked RAM usage",
"start": "Start",
"start-on-host": "Start on specific host",
+ "static-ip": "Static IP",
"stats": "Stats",
"status": "Status",
"storage": "Storage",
@@ -193,6 +229,15 @@
"vm-is-running": "The VM is running",
"vms": "VMs",
"xo-lite-under-construction": "XOLite is under construction",
+ "xoa-admin-account": "XOA admin account",
+ "xoa-deploy": "XOA deployment",
+ "xoa-deploy-failed": "Sorry, deployment failed!",
+ "xoa-deploy-retry": "Try again to deploy XOA",
+ "xoa-deploy-successful": "XOA deployment successful!",
+ "xoa-ip": "XOA IP address",
+ "xoa-password-confirm-different": "XOA password confirmation is different",
+ "xoa-ssh-account": "XOA SSH account",
+ "xoa-ssh-password-confirm-different": "SSH password confirmation is different",
"you-are-currently-on": "You are currently on: {0}",
"zstd": "zstd"
}
diff --git a/@xen-orchestra/lite/src/locales/fr.json b/@xen-orchestra/lite/src/locales/fr.json
index 7144d1188..ef54db858 100644
--- a/@xen-orchestra/lite/src/locales/fr.json
+++ b/@xen-orchestra/lite/src/locales/fr.json
@@ -1,9 +1,13 @@
{
"about": "À propos",
+ "access-xoa": "Accéder à la XOA",
"add": "Ajouter",
"add-filter": "Ajouter un filtre",
"add-or": "+OU",
"add-sort": "Ajouter un tri",
+ "admin-login": "Nom d'utilisateur administrateur",
+ "admin-password": "Mot de passe administrateur",
+ "admin-password-confirm": "Confirmer le mot de passe administrateur",
"alarm-type": {
"cpu_usage": "L'utilisation du CPU dépasse {n}%",
"disk_usage": "L'utilisation du disque dépasse {n}%",
@@ -26,12 +30,14 @@
"backup": "Sauvegarde",
"cancel": "Annuler",
"change-state": "Changer l'état",
+ "check-errors": "Consultez les erreurs :",
"click-to-display-alarms": "Cliquer pour afficher les alarmes :",
"click-to-return-default-pool": "Cliquer ici pour revenir au pool par défaut",
"close": "Fermer",
"coming-soon": "Bientôt disponible !",
"community": "Communauté",
"community-name": "Communauté {name}",
+ "configuration": "Configuration",
"confirm-cancel": "Êtes-vous sûr de vouloir annuler ?",
"confirm-delete": "Vous êtes sur le point de supprimer {0}",
"console": "Console",
@@ -43,14 +49,28 @@
"dashboard": "Tableau de bord",
"delete": "Supprimer",
"delete-vms": "Supprimer 1 VM | Supprimer {n} VMs",
+ "deploy": "Déployer",
+ "deploy-xoa": "Déployer XOA",
+ "deploy-xoa-available-on-desktop": "Le déploiement de la XOA est disponible sur ordinateur",
+ "deploy-xoa-status": {
+ "configuring": "Configuration de la XOA…",
+ "importing": "Importation de la XOA…",
+ "not-responding": "La XOA ne répond pas",
+ "ready": "La XOA est prête !",
+ "starting": "Démarrage de la XOA…",
+ "waiting": "En attente de réponse de la XOA…"
+ },
"descending": "descendant",
"description": "Description",
+ "dhcp": "DHCP",
+ "dns": "DNS",
"disabled": "Désactivé",
"display": "Affichage",
"do-you-have-needs": "Vous avez des besoins et/ou des attentes ? Faites le nous savoir",
"documentation": "Documentation",
"documentation-name": "Documentation {name}",
"edit-config": "Modifier config",
+ "enabled": "Activé",
"error-no-data": "Erreur, impossible de collecter les données.",
"error-occurred": "Une erreur est survenue",
"export": "Exporter",
@@ -84,11 +104,16 @@
"force-shutdown": "Forcer l'arrêt",
"fullscreen": "Plein écran",
"fullscreen-leave": "Quitter plein écran",
+ "gateway": "Passerelle",
+ "n-gb-left": "{n} Go libres",
+ "n-gb-required": "{n} Go requis",
"go-back": "Revenir en arrière",
"gzip": "gzip",
"here": "Ici",
"hosts": "Hôtes",
+ "invalid-field": "Champ invalide",
"keep-me-logged": "Rester connecté",
+ "keep-page-open": "Ne pas rafraichir ou quitter cette page avant la fin du déploiement.",
"language": "Langue",
"last-week": "Semaine dernière",
"learn-more": "En savoir plus",
@@ -104,6 +129,7 @@
"n-missing": "{n} manquant | {n} manquants",
"n-vms": "1 VM | {n} VMs",
"name": "Nom",
+ "netmask": "Masque réseau",
"network": "Réseau",
"network-download": "Descendant",
"network-throughput": "Débit du réseau",
@@ -119,6 +145,7 @@
"not-found": "Non trouvé",
"object": "Objet",
"object-not-found": "L'objet {id} est introuvable…",
+ "ok": "OK",
"on-object": "sur {object}",
"open-console-in-new-tab": "Ouvrir la console dans un nouvel onglet",
"or": "Ou",
@@ -154,14 +181,23 @@
"selected-vms-in-execution": "Certaines VMs sélectionnées sont en cours d'exécution",
"send-ctrl-alt-del": "Envoyer Ctrl+Alt+Suppr",
"send-us-feedback": "Envoyez-nous vos commentaires",
+ "select": {
+ "network": "Sélectionner un réseau",
+ "storage": "Sélectionner un SR"
+ },
"settings": "Paramètres",
"shutdown": "Arrêter",
"snapshot": "Instantané",
"sort-by": "Trier par",
+ "ssh-account": "Compte SSH",
+ "ssh-login": "Nom d'utilisateur SSH",
+ "ssh-password": "Mot de passe SSH",
+ "ssh-password-confirm": "Confirmer le mot de passe SSH",
"stacked-cpu-usage": "Utilisation CPU empilée",
"stacked-ram-usage": "Utilisation RAM empilée",
"start": "Démarrer",
"start-on-host": "Démarrer sur un hôte spécifique",
+ "static-ip": "IP statique",
"stats": "Stats",
"status": "Statut",
"storage": "Stockage",
@@ -193,6 +229,15 @@
"vm-is-running": "La VM est en cours d'exécution",
"vms": "VMs",
"xo-lite-under-construction": "XOLite est en construction",
+ "xoa-admin-account": "Compte administrateur de la XOA",
+ "xoa-deploy": "Déploiement de la XOA",
+ "xoa-deploy-failed": "Erreur lors du déploiement de la XOA !",
+ "xoa-deploy-retry": "Ré-essayer de déployer une XOA",
+ "xoa-deploy-successful": "XOA deployée avec succès !",
+ "xoa-ip": "XOA IP address",
+ "xoa-password-confirm-different": "La confirmation du mot de passe XOA est différente",
+ "xoa-ssh-account": "Compte SSH de la XOA",
+ "xoa-ssh-password-confirm-different": "La confirmation du mot de passe SSH est différente",
"you-are-currently-on": "Vous êtes actuellement sur : {0}",
"zstd": "zstd"
}
diff --git a/@xen-orchestra/lite/src/router/index.ts b/@xen-orchestra/lite/src/router/index.ts
index 5178f7ea4..c68f34135 100644
--- a/@xen-orchestra/lite/src/router/index.ts
+++ b/@xen-orchestra/lite/src/router/index.ts
@@ -12,6 +12,11 @@ const router = createRouter({
name: "home",
component: HomeView,
},
+ {
+ path: "/xoa-deploy",
+ name: "xoa.deploy",
+ component: () => import("@/views/xoa-deploy/XoaDeployView.vue"),
+ },
{
path: "/settings",
name: "settings",
diff --git a/@xen-orchestra/lite/src/stores/xen-api/network.store.ts b/@xen-orchestra/lite/src/stores/xen-api/network.store.ts
new file mode 100644
index 000000000..460aa279a
--- /dev/null
+++ b/@xen-orchestra/lite/src/stores/xen-api/network.store.ts
@@ -0,0 +1,9 @@
+import { useXenApiStoreSubscribableContext } from "@/composables/xen-api-store-subscribable-context.composable";
+import { createUseCollection } from "@/stores/xen-api/create-use-collection";
+import { defineStore } from "pinia";
+
+export const useNetworkStore = defineStore("xen-api-network", () => {
+ return useXenApiStoreSubscribableContext("network");
+});
+
+export const useNetworkCollection = createUseCollection(useNetworkStore);
diff --git a/@xen-orchestra/lite/src/views/xoa-deploy/XoaDeployView.vue b/@xen-orchestra/lite/src/views/xoa-deploy/XoaDeployView.vue
new file mode 100644
index 000000000..b7a119d33
--- /dev/null
+++ b/@xen-orchestra/lite/src/views/xoa-deploy/XoaDeployView.vue
@@ -0,0 +1,674 @@
+
+ {{ $t("deploy-xoa") }}
+
+

+
+
+
+
+
{{ $t("xoa-deploy-failed") }}
+
+
+
+ {{ $t("check-errors") }}
+ {{ error }}
+
+
+ {{ $t("xoa-deploy-retry") }}
+
+
+
+
+
+
+
{{ $t("xoa-deploy-successful") }}
+
+
+
+ {{ $t("access-xoa") }}
+
+
+
+
+
+
+
{{ $t("xoa-deploy") }}
+
+
{{ status }}
+
+
+
+ {{ $t("keep-page-open") }}
+
+
+ {{ $t("cancel") }}
+
+
+
+
+
+
{{ $t("deploy-xoa-available-on-desktop") }}
+
+
+
+
+
+
+
+