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 @@ + + + + + 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 @@ + + + + +