From f63248ba151e6f21fcbf98c51ba39d716be0ab5d Mon Sep 17 00:00:00 2001 From: agatha197 Date: Tue, 29 Oct 2024 13:43:11 +0900 Subject: [PATCH] feat: new image parsing --- .cspell.json | 10 +- react/data/schema.graphql | 41 ++++- react/src/components/ImageList.tsx | 232 +++++++++++++++-------------- resources/i18n/de.json | 4 +- resources/i18n/el.json | 4 +- resources/i18n/en.json | 4 +- resources/i18n/es.json | 4 +- resources/i18n/fi.json | 4 +- resources/i18n/fr.json | 4 +- resources/i18n/id.json | 4 +- resources/i18n/it.json | 4 +- resources/i18n/ja.json | 4 +- resources/i18n/ko.json | 4 +- resources/i18n/mn.json | 4 +- resources/i18n/ms.json | 4 +- resources/i18n/pl.json | 4 +- resources/i18n/pt-BR.json | 4 +- resources/i18n/pt.json | 4 +- resources/i18n/ru.json | 4 +- resources/i18n/th.json | 4 +- resources/i18n/tr.json | 4 +- resources/i18n/vi.json | 4 +- resources/i18n/zh-CN.json | 4 +- resources/i18n/zh-TW.json | 4 +- src/lib/backend.ai-client-esm.ts | 3 + 25 files changed, 232 insertions(+), 138 deletions(-) diff --git a/.cspell.json b/.cspell.json index 2391993bdb..04a05ad133 100644 --- a/.cspell.json +++ b/.cspell.json @@ -5,6 +5,7 @@ "Backendai", "backendaiclient", "backendaioptions", + "baseversion", "cssinjs", "cuda", "FGPU", @@ -19,17 +20,14 @@ "RNGD", "shmem", "superadmin", + "textbox", + "vaadin", "vfolder", "vfolders", "Warboy", "webcomponent", "webui", - "wsproxy", - "vfolders", - "vfolder", - "filebrowser", - "vaadin", - "textbox" + "wsproxy" ], "flagWords": [ "데이터레이크", diff --git a/react/data/schema.graphql b/react/data/schema.graphql index 18912ef865..a2a1eab78b 100644 --- a/react/data/schema.graphql +++ b/react/data/schema.graphql @@ -21,7 +21,18 @@ type Queries { group_node(id: String!): GroupNode """Added in 24.03.0.""" - group_nodes(filter: String, order: String, offset: Int, before: String, after: String, first: Int, last: Int): GroupConnection + group_nodes( + """Added in 24.09.0.""" + filter: String + + """Added in 24.09.0.""" + order: String + offset: Int + before: String + after: String + first: Int + last: Int + ): GroupConnection group( id: UUID! domain_name: String @@ -287,12 +298,24 @@ type ImageNode implements Node { """Added in 24.03.4. The undecoded id value stored in DB.""" row_id: UUID - name: String + name: String @deprecated(reason: "Deprecated since 24.09.1. use `namespace` instead") + + """Added in 24.09.1.""" + namespace: String + + """Added in 24.09.1.""" + base_image_name: String """Added in 24.03.10.""" project: String humanized_name: String tag: String + + """Added in 24.09.1.""" + tags: [KVPair] + + """Added in 24.09.1.""" + version: String registry: String architecture: String is_local: Boolean @@ -504,12 +527,24 @@ type Group { type Image { id: UUID - name: String + name: String @deprecated(reason: "Deprecated since 24.09.1. use `namespace` instead") + + """Added in 24.09.1.""" + namespace: String + + """Added in 24.09.1.""" + base_image_name: String """Added in 24.03.10.""" project: String humanized_name: String tag: String + + """Added in 24.09.1.""" + tags: [KVPair] + + """Added in 24.09.1.""" + version: String registry: String architecture: String is_local: Boolean diff --git a/react/src/components/ImageList.tsx b/react/src/components/ImageList.tsx index 53a556f165..40dd9f1839 100644 --- a/react/src/components/ImageList.tsx +++ b/react/src/components/ImageList.tsx @@ -1,6 +1,11 @@ import Flex from '../components/Flex'; -import { filterNonNullItems, getImageFullName } from '../helper'; -import { useBackendAIImageMetaData, useUpdatableState } from '../hooks'; +import { filterNonNullItems, getImageFullName, localeCompare } from '../helper'; +import { + useBackendAIImageMetaData, + useSuspendedBackendaiClient, + useUpdatableState, +} from '../hooks'; +import DoubleTag from './DoubleTag'; import ImageInstallModal from './ImageInstallModal'; import { ConstraintTags } from './ImageTags'; import ManageAppsModal from './ManageAppsModal'; @@ -52,13 +57,16 @@ const ImageList: React.FC<{ style?: React.CSSProperties }> = ({ style }) => { const [imageSearch, setImageSearch] = useState(''); const [isPendingRefreshTransition, startRefreshTransition] = useTransition(); const [isPendingSearchTransition, startSearchTransition] = useTransition(); + const baiClient = useSuspendedBackendaiClient(); + const supportExtendedImageInfo = + baiClient?.supports('extended-image-info') ?? false; const { images } = useLazyLoadQuery( graphql` query ImageListQuery { images { id - name + name @deprecatedSince(version: "24.09.1.") tag registry architecture @@ -74,6 +82,13 @@ const ImageList: React.FC<{ style?: React.CSSProperties }> = ({ style }) => { min max } + namespace @since(version: "24.09.1.") + base_image_name @since(version: "24.09.1.") + tags @since(version: "24.09.1.") { + key + value + } + version @since(version: "24.09.1.") } } `, @@ -122,136 +137,137 @@ const ImageList: React.FC<{ style?: React.CSSProperties }> = ({ style }) => { title: t('environment.Registry'), dataIndex: 'registry', key: 'registry', - sorter: (a, b) => - a?.registry && b?.registry ? a.registry.localeCompare(b.registry) : 0, - render: (text, row) => ( - {row.registry} + sorter: (a, b) => localeCompare(a?.registry, b?.registry), + render: (text) => ( + {text} ), }, { title: t('environment.Architecture'), dataIndex: 'architecture', key: 'architecture', - sorter: (a, b) => - a?.architecture && b?.architecture - ? a.architecture.localeCompare(b.architecture) - : 0, - render: (text, row) => ( - - {row.architecture} - + sorter: true, + render: (text) => ( + {text} ), }, { title: t('environment.Namespace'), key: 'namespace', - dataIndex: 'namespace', - sorter: (a, b) => { - const namespaceA = getNamespace(getImageFullName(a) || ''); - const namespaceB = getNamespace(getImageFullName(b) || ''); - return namespaceA && namespaceB - ? namespaceA.localeCompare(namespaceB) - : 0; - }, - render: (text, row) => ( - - {getNamespace(getImageFullName(row) || '')} - + dataIndex: supportExtendedImageInfo ? 'namespace' : 'name', + sorter: true, + render: (text) => ( + {text} ), }, { - title: t('environment.Language'), + title: supportExtendedImageInfo + ? t('environment.BaseImageName') + : t('environment.Language'), key: 'lang', - dataIndex: 'lang', - sorter: (a, b) => { - const langA = a?.name ? getLang(a?.name) : ''; - const langB = b?.name ? getLang(b?.name) : ''; - return langA && langB ? langA.localeCompare(langB) : 0; - }, - render: (text, row) => ( - - {row.name ? getLang(row.name) : null} - + dataIndex: supportExtendedImageInfo ? 'base_image_name' : 'lang', + sorter: true, + render: (text) => ( + {text} ), }, { title: t('environment.Version'), key: 'baseversion', - dataIndex: 'baseversion', - sorter: (a, b) => { - const baseversionA = getBaseVersion(getImageFullName(a) || ''); - const baseversionB = getBaseVersion(getImageFullName(b) || ''); - return baseversionA && baseversionB - ? baseversionA.localeCompare(baseversionB) - : 0; - }, + dataIndex: supportExtendedImageInfo ? 'version' : 'baseversion', + sorter: true, render: (text, row) => ( - {getBaseVersion(getImageFullName(row) || '')} + {supportExtendedImageInfo + ? text + : getBaseVersion(getImageFullName(row) || '')} ), }, - { - title: t('environment.Base'), - key: 'baseimage', - dataIndex: 'baseimage', - sorter: (a, b) => { - const baseimageA = - !a?.tag || !a?.name ? '' : getBaseImages(a?.tag, a?.name)[0] || ''; - const baseimageB = - !b?.tag || !b?.name ? '' : getBaseImages(b?.tag, b?.name)[0] || ''; - if (baseimageA === '' && baseimageB === '') return 0; - if (baseimageA === '') return -1; - if (baseimageB === '') return 1; - return baseimageA.localeCompare(baseimageB); - }, - render: (text, row) => ( - - {row?.tag && row?.name - ? getBaseImages(row.tag, row.name).map((baseImage) => ( - - - {baseImage} - - - )) - : null} - - ), - }, - { - title: t('environment.Constraint'), - key: 'constraint', - dataIndex: 'constraint', - sorter: (a, b) => { - const requirementA = - a?.tag && b?.labels - ? getConstraints( - a?.tag, - a?.labels as { key: string; value: string }[], - )[0] || '' - : ''; - const requirementB = - b?.tag && b?.labels - ? getConstraints( - b?.tag, - b?.labels as { key: string; value: string }[], - )[0] || '' - : ''; - if (requirementA === '' && requirementB === '') return 0; - if (requirementA === '') return -1; - if (requirementB === '') return 1; - return requirementA.localeCompare(requirementB); - }, - render: (text, row) => - row?.tag ? ( - - ) : null, - }, + ...(supportExtendedImageInfo + ? [ + { + title: t('environment.Tags'), + key: 'tags', + dataIndex: 'tags', + render: (text: Array<{ key: string; value: string }>) => { + return ( + + {_.map(text, (tag) => ( + + ))} + + ); + }, + }, + ] + : [ + { + title: t('environment.Base'), + key: 'baseimage', + dataIndex: 'baseimage', + sorter: (a: EnvironmentImage, b: EnvironmentImage) => { + const baseimageA = + !a?.tag || !a?.name + ? '' + : getBaseImages(a?.tag, a?.name)[0] || ''; + const baseimageB = + !b?.tag || !b?.name + ? '' + : getBaseImages(b?.tag, b?.name)[0] || ''; + if (baseimageA === '' && baseimageB === '') return 0; + if (baseimageA === '') return -1; + if (baseimageB === '') return 1; + return baseimageA.localeCompare(baseimageB); + }, + render: (text: string, row: EnvironmentImage) => ( + + {row?.tag && row?.name + ? getBaseImages(row.tag, row.name).map((baseImage) => ( + + + {baseImage} + + + )) + : null} + + ), + }, + { + title: t('environment.Constraint'), + key: 'constraint', + dataIndex: 'constraint', + sorter: (a: EnvironmentImage, b: EnvironmentImage) => { + const requirementA = + a?.tag && b?.labels + ? getConstraints( + a?.tag, + a?.labels as { key: string; value: string }[], + )[0] || '' + : ''; + const requirementB = + b?.tag && b?.labels + ? getConstraints( + b?.tag, + b?.labels as { key: string; value: string }[], + )[0] || '' + : ''; + if (requirementA === '' && requirementB === '') return 0; + if (requirementA === '') return -1; + if (requirementB === '') return 1; + return requirementA.localeCompare(requirementB); + }, + render: (text: string, row: EnvironmentImage) => + row?.tag ? ( + + ) : null, + }, + ]), { title: t('environment.Digest'), dataIndex: 'digest', diff --git a/resources/i18n/de.json b/resources/i18n/de.json index df10ec0bc7..6f2e5e3f7f 100644 --- a/resources/i18n/de.json +++ b/resources/i18n/de.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Installieren Sie ein Image?", "InstalledImagesAreExcluded": "Installierte Bilder sind davon ausgenommen.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Basisbildname", + "Tags": "Schlagworte" }, "resourcePreset": { "ResourcePresets": "Ressourcenvoreinstellungen", diff --git a/resources/i18n/el.json b/resources/i18n/el.json index 5f976050eb..fe5d6e65b6 100644 --- a/resources/i18n/el.json +++ b/resources/i18n/el.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Εγκαθιστώντας μια εικόνα;", "InstalledImagesAreExcluded": "Οι εγκατεστημένες εικόνες εξαιρούνται.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Όνομα εικόνας βάσης", + "Tags": "Ετικέτες" }, "resourcePreset": { "ResourcePresets": "Προεπιλογές πόρων", diff --git a/resources/i18n/en.json b/resources/i18n/en.json index e4c4607bd9..a2157f1a98 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -1027,7 +1027,9 @@ "CheckImageInstallation": "Installing an image?", "SearchImages": "Search images", "DescDownloadImage": "DescDownloadImage", - "DescSignificantDownloadTime": "DescSignificantDownloadTime" + "DescSignificantDownloadTime": "DescSignificantDownloadTime", + "BaseImageName": "Base image name", + "Tags": "Tags" }, "resourcePreset": { "ResourcePresets": "Resource Presets", diff --git a/resources/i18n/es.json b/resources/i18n/es.json index a19ee59ec3..db457f88f1 100644 --- a/resources/i18n/es.json +++ b/resources/i18n/es.json @@ -536,7 +536,9 @@ "CheckImageInstallation": "¿Instalar una imagen?", "InstalledImagesAreExcluded": "Se excluyen las imágenes instaladas.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nombre de la imagen base", + "Tags": "Etiquetas" }, "explorer": { "InputTooShort": "InputTooShort", diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json index 50d8417bf1..03e2e1151d 100644 --- a/resources/i18n/fi.json +++ b/resources/i18n/fi.json @@ -536,7 +536,9 @@ "CheckImageInstallation": "Kuvan asentaminen?", "InstalledImagesAreExcluded": "Asennettuja kuvia ei oteta huomioon.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Peruskuvan nimi", + "Tags": "Tunnisteet" }, "explorer": { "InputTooShort": "InputTooShort", diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json index 4a2798eb0a..e0079bbbbb 100644 --- a/resources/i18n/fr.json +++ b/resources/i18n/fr.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Installation d'une image ?", "InstalledImagesAreExcluded": "Les images installées sont exclues.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nom de l'image de base", + "Tags": "Balises" }, "resourcePreset": { "ResourcePresets": "Préréglages de ressources", diff --git a/resources/i18n/id.json b/resources/i18n/id.json index ca77b47454..f41fb019f3 100644 --- a/resources/i18n/id.json +++ b/resources/i18n/id.json @@ -898,7 +898,9 @@ "CheckImageInstallation": "Memasang gambar?", "InstalledImagesAreExcluded": "Gambar yang diinstal tidak termasuk.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nama gambar dasar", + "Tags": "Tag" }, "resourcePreset": { "ResourcePresets": "Preset Sumber Daya", diff --git a/resources/i18n/it.json b/resources/i18n/it.json index 695797233f..906b8888ad 100644 --- a/resources/i18n/it.json +++ b/resources/i18n/it.json @@ -898,7 +898,9 @@ "CheckImageInstallation": "Installare un'immagine?", "InstalledImagesAreExcluded": "Le immagini installate sono escluse.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nome dell'immagine di base", + "Tags": "Tag" }, "resourcePreset": { "ResourcePresets": "Preimpostazioni delle risorse", diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json index 0ef037ca0e..8c6768c162 100644 --- a/resources/i18n/ja.json +++ b/resources/i18n/ja.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "イメージのインストール?", "InstalledImagesAreExcluded": "インストールされたイメージは除く。", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "ベースイメージ名", + "Tags": "タグ" }, "resourcePreset": { "ResourcePresets": "リソースプリセット", diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json index 3c8c06599a..335e69ddeb 100644 --- a/resources/i18n/ko.json +++ b/resources/i18n/ko.json @@ -1013,7 +1013,9 @@ "CheckImageInstallation": "다음 이미지를 설치하시겠습니까?", "SearchImages": "이미지 검색", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "기본 이미지 이름", + "Tags": "태그" }, "resourcePreset": { "ResourcePresets": "자원 프리셋", diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json index d99ab550ba..f39b978b6d 100644 --- a/resources/i18n/mn.json +++ b/resources/i18n/mn.json @@ -898,7 +898,9 @@ "CheckImageInstallation": "Зураг суулгаж байна уу?", "InstalledImagesAreExcluded": "Суулгасан зургуудыг оруулаагүй болно.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Зургийн үндсэн нэр", + "Tags": "Шошго" }, "resourcePreset": { "ResourcePresets": "Нөөцийн урьдчилсан тохируулга", diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json index 930c559db5..aad37e3239 100644 --- a/resources/i18n/ms.json +++ b/resources/i18n/ms.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Memasang imej?", "InstalledImagesAreExcluded": "Imej yang dipasang dikecualikan.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nama imej asas", + "Tags": "Tag" }, "resourcePreset": { "ResourcePresets": "Pratetap Sumber", diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json index 0edb7706fe..4a3879dcd3 100644 --- a/resources/i18n/pl.json +++ b/resources/i18n/pl.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Instalowanie obrazu?", "InstalledImagesAreExcluded": "Zainstalowane obrazy są wykluczone.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Podstawowa nazwa obrazu", + "Tags": "Tagi" }, "resourcePreset": { "ResourcePresets": "Predefiniowane ustawienia zasobów", diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json index 01333073fa..8a17ebf207 100644 --- a/resources/i18n/pt-BR.json +++ b/resources/i18n/pt-BR.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Instalar uma imagem?", "InstalledImagesAreExcluded": "As imagens instaladas são excluídas.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nome da imagem base", + "Tags": "Etiquetas" }, "resourcePreset": { "ResourcePresets": "Predefinições de recursos", diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index f909e7087c..e531179fb0 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Instalar uma imagem?", "InstalledImagesAreExcluded": "As imagens instaladas são excluídas.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Nome da imagem base", + "Tags": "Etiquetas" }, "resourcePreset": { "ResourcePresets": "Predefinições de recursos", diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index 2c2942a7a5..8f01a5d916 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Установка образа?", "InstalledImagesAreExcluded": "Установленные образы исключены.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Имя базового изображения", + "Tags": "Теги" }, "resourcePreset": { "ResourcePresets": "Предустановки ресурсов", diff --git a/resources/i18n/th.json b/resources/i18n/th.json index e885039575..1bf257b88d 100644 --- a/resources/i18n/th.json +++ b/resources/i18n/th.json @@ -1011,7 +1011,9 @@ "CustomizedImageSuccessfullyDeleted": "ลบอิมเมจที่กำหนดเองสำเร็จแล้ว", "DescImageResourceModified": "แก้ไขขีดจำกัดทรัพยากรสำเร็จแล้ว", "DescImagePortsModified": "แก้ไขพอร์ตอิมเมจสำเร็จแล้ว", - "ModifyImageResourceLimitReinstallRequired": "

หากคุณแก้ไขอิมเมจที่ได้รับการติดตั้งแล้ว คุณจะต้องติดตั้งอิมเมจใหม่

การแก้ไขจะไม่มีผลจนกว่าจะมีการติดตั้งอิมเมจใหม่\n

" + "ModifyImageResourceLimitReinstallRequired": "

หากคุณแก้ไขอิมเมจที่ได้รับการติดตั้งแล้ว คุณจะต้องติดตั้งอิมเมจใหม่

การแก้ไขจะไม่มีผลจนกว่าจะมีการติดตั้งอิมเมจใหม่\n

", + "BaseImageName": "ชื่อภาพฐาน", + "Tags": "แท็ก" }, "resourcePreset": { "ResourcePresets": "ค่าที่กำหนดไว้ล่วงหน้าของทรัพยากร", diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index 4907a407c9..10c3f81b02 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Bir görüntü mü yüklüyorsunuz?", "InstalledImagesAreExcluded": "Yüklü görüntüler hariçtir.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Temel resim adı", + "Tags": "Etiketler" }, "resourcePreset": { "ResourcePresets": "Kaynak Ön Ayarları", diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json index 305eccfe07..7ccbda92d8 100644 --- a/resources/i18n/vi.json +++ b/resources/i18n/vi.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "Cài đặt một hình ảnh?", "InstalledImagesAreExcluded": "Hình ảnh được cài đặt được loại trừ.", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "Tên hình ảnh cơ sở", + "Tags": "Thẻ" }, "resourcePreset": { "ResourcePresets": "Cài đặt trước tài nguyên", diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json index f92f9b0f1c..4505f72008 100644 --- a/resources/i18n/zh-CN.json +++ b/resources/i18n/zh-CN.json @@ -897,7 +897,9 @@ "CheckImageInstallation": "安装图像?", "InstalledImagesAreExcluded": "不包括已安装的图像。", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "基础镜像名称", + "Tags": "标签" }, "resourcePreset": { "ResourcePresets": "资源预设", diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json index f363f03059..6dea6e1b9d 100644 --- a/resources/i18n/zh-TW.json +++ b/resources/i18n/zh-TW.json @@ -898,7 +898,9 @@ "CheckImageInstallation": "安装图像?", "InstalledImagesAreExcluded": "不包括已安装的图像。", "DescDownloadImage": "__NOT_TRANSLATED__", - "DescSignificantDownloadTime": "__NOT_TRANSLATED__" + "DescSignificantDownloadTime": "__NOT_TRANSLATED__", + "BaseImageName": "基礎鏡像名稱", + "Tags": "標籤" }, "resourcePreset": { "ResourcePresets": "資源預設", diff --git a/src/lib/backend.ai-client-esm.ts b/src/lib/backend.ai-client-esm.ts index a5d1c32211..17fd9672ba 100644 --- a/src/lib/backend.ai-client-esm.ts +++ b/src/lib/backend.ai-client-esm.ts @@ -717,6 +717,9 @@ class Client { if (this.isManagerVersionCompatibleWith('24.09')) { this._features['extend-login-session'] = true; } + if (this.isManagerVersionCompatibleWith('24.09.1')) { + this._features['extended-image-info'] = true; + } } /**