diff --git a/api/src/main/java/org/apache/cloudstack/storage/object/BucketApiService.java b/api/src/main/java/org/apache/cloudstack/storage/object/BucketApiService.java index b0a28b7ddc15..bd35d510e0f7 100644 --- a/api/src/main/java/org/apache/cloudstack/storage/object/BucketApiService.java +++ b/api/src/main/java/org/apache/cloudstack/storage/object/BucketApiService.java @@ -76,14 +76,6 @@ public interface BucketApiService { ConfigKey.Scope.Global, null); - ConfigKey ObjectStorePresignedUrlExpirySeconds = new ConfigKey("Advanced", Long.class, - "objectstore.presigned.url.expiry.seconds", - "86400", - "The expiry time, in seconds, for object store presigned URLs generated by the UI.", - true, - ConfigKey.Scope.Global, - null); - /** * Creates the database object for a Bucket based on the given criteria * diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java index 35633bc5aa3a..90d6d9303b20 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -506,18 +506,7 @@ private void enforceBaselineThenDeleteLastVersionIfNeeded(final CloudStackVersio try { final Connection conn = txn.getConnection(); - // 0) DB 최신버전 == 코드버전이면 삭제/삽입 모두 스킵 - final boolean sameAsCode = (dbLatestVersion != null - && currentVersion != null - && dbLatestVersion.compareTo(currentVersion) == 0); - if (sameAsCode) { - LOGGER.info("DB latest version equals code version (db={}, code={}). Skipping baseline insert and deletion.", - dbLatestVersion, currentVersion); - txn.commit(); - return; - } - - // 1) sameAsCode == false 인 경우에만 베이스라인 보장 (없으면 삽입) + // 1) 베이스라인 보장 (없으면 삽입) final String insertIfMissingSql = "INSERT INTO `cloud`.`version` (`version`, `step`, `updated`) " + "SELECT ?, 'Complete', NOW() FROM DUAL " + @@ -534,9 +523,8 @@ private void enforceBaselineThenDeleteLastVersionIfNeeded(final CloudStackVersio } // 2) 삭제 대상: dbLatestVersion 의 최신 1건 (단, 베이스라인이면 삭제 금지) + // DB 최신 버전과 코드 버전이 같아도 최신 버전 row를 삭제해 동일 버전 업그레이드를 재실행한다. if (dbLatestVersion != null - && currentVersion != null - && dbLatestVersion.compareTo(currentVersion) != 0 && !BASELINE_VERSION.equals(dbLatestVersion.toString())) { final String deleteLatestOneSql = @@ -554,7 +542,8 @@ private void enforceBaselineThenDeleteLastVersionIfNeeded(final CloudStackVersio delLatest.setString(1, dbLatestVersion.toString()); int deleted = delLatest.executeUpdate(); if (deleted > 0) { - LOGGER.warn("Deleted {} latest row for version {}", deleted, dbLatestVersion.toString()); + LOGGER.warn("Deleted {} latest row for DB version {} before upgrade check with code version {}", + deleted, dbLatestVersion.toString(), currentVersion); txn.commit(); return; } else { diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42010to42100.sql b/engine/schema/src/main/resources/META-INF/db/schema-42010to42100.sql index 39379ffc31c8..5464d8482335 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42010to42100.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-42010to42100.sql @@ -30,11 +30,11 @@ CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.console_session', 'console_endpoint_ CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.console_session', 'client_address', 'VARCHAR(45)'); CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.backup_schedule', 'uuid', 'VARCHAR(40) NOT NULL'); -UPDATE `cloud`.`backup_schedule` SET uuid = UUID() WHERE uuid IS NULL; +UPDATE `cloud`.`backup_schedule` SET uuid = UUID() WHERE uuid IS NULL OR uuid = ''; -- Add columns name, description and backup_interval_type to backup table CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.backups', 'name', 'VARCHAR(255) NULL COMMENT "name of the backup"'); -UPDATE `cloud`.`backups` backup INNER JOIN `cloud`.`vm_instance` vm ON backup.vm_id = vm.id SET backup.name = vm.name; +UPDATE `cloud`.`backups` backup INNER JOIN `cloud`.`vm_instance` vm ON backup.vm_id = vm.id SET backup.name = vm.name WHERE backup.name IS NULL OR backup.name = ''; CALL `cloud`.`IDEMPOTENT_CHANGE_COLUMN`('cloud.backups','name','name','VARCHAR(255) NOT NULL'); CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.backups', 'description', 'VARCHAR(1024) COMMENT "description for the backup"'); CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.backups', 'backup_interval_type', 'int(5) COMMENT "type of backup, e.g. manual, recurring - hourly, daily, weekly or monthly"'); @@ -62,7 +62,8 @@ SET b.backed_volumes = ( FROM `cloud`.`volumes` v LEFT JOIN `cloud`.`disk_offering` doff ON v.disk_offering_id = doff.id WHERE v.instance_id = vm.id -); +) +WHERE b.backed_volumes IS NULL OR b.backed_volumes = '' OR b.backed_volumes NOT LIKE '%"diskOfferingId"%'; -- Add diskOfferingId, deviceId, minIops and maxIops to backup_volumes in vm_instance table UPDATE `cloud`.`vm_instance` vm @@ -87,7 +88,8 @@ SET vm.backup_volumes = ( LEFT JOIN `cloud`.`disk_offering` doff ON v.disk_offering_id = doff.id WHERE v.instance_id = vm.id ) -WHERE vm.backup_offering_id IS NOT NULL; +WHERE vm.backup_offering_id IS NOT NULL +AND (vm.backup_volumes IS NULL OR vm.backup_volumes = '' OR vm.backup_volumes NOT LIKE '%"diskOfferingId"%'); -- Add column allocated_size to object_store table. Rename column 'used_bytes' to 'used_size' CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.object_store', 'allocated_size', 'bigint unsigned COMMENT "allocated size in bytes"'); diff --git a/server/src/main/java/org/apache/cloudstack/storage/object/BucketApiServiceImpl.java b/server/src/main/java/org/apache/cloudstack/storage/object/BucketApiServiceImpl.java index 5144e30f460e..9080a9a57559 100644 --- a/server/src/main/java/org/apache/cloudstack/storage/object/BucketApiServiceImpl.java +++ b/server/src/main/java/org/apache/cloudstack/storage/object/BucketApiServiceImpl.java @@ -109,8 +109,7 @@ public ConfigKey[] getConfigKeys() { DefaultMaxProjectBuckets, DefaultMaxProjectObjectStorage, DefaultMaxDomainBuckets, - DefaultMaxDomainObjectStorage, - ObjectStorePresignedUrlExpirySeconds + DefaultMaxDomainObjectStorage }; } diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 4af540600a17..4deac6d51823 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -612,6 +612,7 @@ "label.copy": "Copy", "label.copy.clipboard": "Copy to clipboard", "label.copy.consoleurl": "Copy console URL to clipboard", +"label.copy.share.url": "Copy share URL", "label.copyid": "Copy ID", "label.copy.password": "Copy password", "label.core": "Core", @@ -687,6 +688,8 @@ "label.datetime.filter.up.to": "Up to {endDate}.", "label.day": "Day", "label.days": "Days", +"label.hours": "Hours", +"label.minutes": "Minutes", "label.day.of.month": "Day of month", "label.day.of.week": "Day of week", "label.db.usage.metrics": "DB/Usage server", @@ -1658,6 +1661,8 @@ "label.objectstoragelimit": "Object Storage Limits (GiB)", "label.object.presigned.url": "Presigned URL", "label.object.presigned.url.description": "Presigned URL of the object in order to access it without authentication.", +"label.object.presigned.url.expiry.description": "The copied share URL is valid only for the selected time.", +"label.object.open.url": "Open URL", "label.object.url.description": "URL of the object", "label.objectstore": "Object Storage", "label.objectstore.search": "Prefix based search in current directory", @@ -2078,6 +2083,7 @@ "label.scope": "Scope", "label.scope.tooltip": "Primary Storage Pool Scope", "label.search": "Search", +"label.seconds": "Seconds", "label.secondary.isolated.vlan.type.isolated": "Isolated", "label.secondary.isolated.vlan.type.promiscuous": "Promiscuous", "label.secondary.storage": "Secondary storage", diff --git a/ui/public/locales/ko_KR.json b/ui/public/locales/ko_KR.json index 2969723b525a..83031e0a16f5 100644 --- a/ui/public/locales/ko_KR.json +++ b/ui/public/locales/ko_KR.json @@ -125,11 +125,11 @@ "label.action.delete.template": "\ud15c\ud50c\ub9bf \uc0ad\uc81c", "label.action.delete.tungsten.router.table": "\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c Tungsten Fabric \uacbd\ub85c \ud14c\uc774\ube14 \uc81c\uac70", "label.action.delete.user": "\uc0ac\uc6a9\uc790 \uc0ad\uc81c", -"label.action.delete.volume": "\ubcfc\ub968 \uc0ad\uc81c", +"label.action.delete.volume": "\ubcfc\ub968 \uc601\uad6c \uc0ad\uc81c", "label.action.delete.zone": "Zone \uc0ad\uc81c", -"label.action.destroy.instance": "\uac00\uc0c1\uba38\uc2e0 \ud30c\uae30", +"label.action.destroy.instance": "\uac00\uc0c1\uba38\uc2e0 \uc0ad\uc81c", "label.action.destroy.systemvm": "\uc2dc\uc2a4\ud15c VM \ud30c\uae30", -"label.action.destroy.volume": "\ubcfc\ub968 \ud30c\uae30", +"label.action.destroy.volume": "\ubcfc\ub968 \uc0ad\uc81c", "label.action.detach.disk": "\ub514\uc2a4\ud06c \ubd84\ub9ac", "label.action.detach.iso": "ISO \ubd84\ub9ac", "label.action.disable.account": "\uacc4\uc815 \ube44\ud65c\uc131\ud654", @@ -168,7 +168,7 @@ "label.action.enable.static.nat": "Static NAT \ud65c\uc131\ud654", "label.action.enable.user": "\uc0ac\uc6a9\uc790 \ud65c\uc131\ud654", "label.action.enable.zone": "Zone \ud65c\uc131\ud654", -"label.action.expunge.instance": "\uac00\uc0c1\uba38\uc2e0 \uc81c\uac70", +"label.action.expunge.instance": "\uac00\uc0c1\uba38\uc2e0 \uc601\uad6c \uc0ad\uc81c", "label.action.force.reconnect": "\uac15\uc81c \uc7ac\uc5f0\uacb0", "label.action.generate.keys": "\ud0a4 \uc0dd\uc131", "label.action.generate.api.secret.keys": "API/Secret \ud0a4 \uc2e0\uaddc \uc0dd\uc131", @@ -612,6 +612,7 @@ "label.copy": "\ubcf5\uc0ac", "label.copy.clipboard": "\ud074\ub9bd\ubcf4\ub4dc\uc5d0 \ubcf5\uc0ac", "label.copy.consoleurl": "\ucf58\uc194 URL \ubcf5\uc0ac", +"label.copy.share.url": "\uacf5\uc720 URL \ubcf5\uc0ac", "label.copyid": "\uc544\uc774\ub514 \ubcf5\uc0ac", "label.copy.password": "\ube44\ubc00\ubc88\ud638 \ubcf5\uc0ac", "label.core": "Core", @@ -687,6 +688,8 @@ "label.datetime.filter.up.to": "{endDate}\uae4c\uc9c0", "label.day": "\uc77c", "label.days": "\uc77c", +"label.hours": "\uc2dc\uac04", +"label.minutes": "\ubd84", "label.day.of.month": "\uc77c\uc790", "label.day.of.week": "\uc694\uc77c", "label.db.usage.metrics": "DB/Usage \uc11c\ubc84", @@ -989,10 +992,10 @@ "label.example.plugin": "\ud50c\ub7ec\uadf8\uc778 \uc608", "label.existing": "\uae30\uc874", "label.execute": "\uc2e4\ud589", -"label.expunge": "\uc81c\uac70", +"label.expunge": "\uc601\uad6c \uc0ad\uc81c", "label.expunge.sharedfs": "\uacf5\uc720 \ud30c\uc77c \uc2dc\uc2a4\ud15c \uc0ad\uc81c", "label.expungevmgraceperiod": "VM \uc0ad\uc81c \uc720\uc608 \uae30\uac04(\ucd08)", -"label.expunged": "\uc81c\uac70\ub428", +"label.expunged": "\uc601\uad6c \uc0ad\uc81c\ub428", "label.expunging": "\uc81c\uac70\ud558\ub294 \uc911...", "label.export.rules": "Export \uaddc\uce59", "label.ext.hostname.tooltip": "\uc678\ubd80 \ud638\uc2a4\ud2b8 \uc774\ub984 \ub610\ub294 IP \uc8fc\uc18c", @@ -1655,6 +1658,8 @@ "label.object.storage": "Object \uc2a4\ud1a0\ub9ac\uc9c0", "label.object.presigned.url": "\ubbf8\ub9ac \uc11c\uba85\ub41c URL", "label.object.presigned.url.description": "\uc778\uc99d \uc5c6\uc774 \uc811\uadfc\ud558\uae30 \uc704\ud55c Object\uc758 \ubbf8\ub9ac \uc11c\uba85\ub41c URL\uc785\ub2c8\ub2e4.", +"label.object.presigned.url.expiry.description": "\uc120\ud0dd\ud55c \uc2dc\uac04 \ub3d9\uc548\ub9cc \uacf5\uc720 URL\uc774 \uc720\ud6a8\ud569\ub2c8\ub2e4.", +"label.object.open.url": "URL \uc5f4\uae30", "label.object.url.description": "Object\uc758 URL", "label.objectstore": "Object \uc800\uc7a5\uc18c", "label.objectstore.search": "\ud604\uc7ac \ub514\ub809\ud130\ub9ac\uc758 \uc811\ub450\uc0ac \uae30\ubc18 \uac80\uc0c9", @@ -2075,6 +2080,7 @@ "label.scope": "\ubc94\uc704", "label.scope.tooltip": "\uae30\ubcf8 \uc800\uc7a5\uc18c \ud480 \ubc94\uc704", "label.search": "\uac80\uc0c9", +"label.seconds": "\ucd08", "label.secondary.isolated.vlan.type.isolated": "isolated", "label.secondary.isolated.vlan.type.promiscuous": "\ube44\uaddc\uce59", "label.secondary.storage": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0", @@ -2740,14 +2746,14 @@ "message.action.delete.snapshot": "\ud604\uc7ac \uc2a4\ub0c5\uc0f7\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "message.action.delete.template": "\ud604\uc7ac \ud15c\ud50c\ub9bf\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "message.action.delete.tungsten.router.table": "\uc774 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ub77c\uc6b0\ud305 \ud14c\uc774\ube14\uc744 \uc81c\uac70\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.", -"message.action.delete.volume": "\ud604\uc7ac \ubcfc\ub968\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \ucc38\uace0 : \uacf5\uc720 \ubcfc\ub968\uc778 \uacbd\uc6b0 \uc774\ubbf8\uc9c0\ub294 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc73c\uba70, \ubc18\ub4dc\uc2dc \uc218\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud574\uc57c\ud569\ub2c8\ub2e4.", +"message.action.delete.volume": "\ud604\uc7ac \ubcfc\ub968\uc744 \uc601\uad6c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uc774 \uc791\uc5c5\uc740 \ub418\ub3cc\ub9b4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
\ucc38\uace0: \uacf5\uc720 \ubcfc\ub968\uc778 \uacbd\uc6b0 \uc774\ubbf8\uc9c0\ub294 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc73c\uba70, \ubc18\ub4dc\uc2dc \uc218\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud574\uc57c \ud569\ub2c8\ub2e4.", "message.action.delete.vpn.user": "VPN \uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.", "message.action.delete.zone": "\ud604\uc7ac Zone\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "message.action.destroy.sharedfs": "\uc774 \uacf5\uc720 \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc744 \ud30c\uad34\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud574 \uc8fc\uc138\uc694.
\uc8fc\uc758: \uc774\ub807\uac8c \ud558\uba74 \uacf5\uc720 \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc758 \ubaa8\ub4e0 \ub370\uc774\ud130\ub3c4 \uc0ad\uc81c\ub429\ub2c8\ub2e4.", -"message.action.destroy.instance": "\ud604\uc7ac \uac00\uc0c1\uba38\uc2e0\uc744 \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", -"message.action.destroy.instance.with.backups": "\uc778\uc2a4\ud134\uc2a4\ub97c \uc0ad\uc81c\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624. \ud574\ub2f9 \uc778\uc2a4\ud134\uc2a4\uc640 \uc5f0\uacb0\ub41c \ubc31\uc5c5\uc774 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", +"message.action.destroy.instance": "\ud604\uc7ac \uac00\uc0c1\uba38\uc2e0\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uc0ad\uc81c\ub41c \uac00\uc0c1\uba38\uc2e0\uc740 \ubcf5\uad6c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc601\uad6c \uc0ad\uc81c\ud558\ub824\uba74 \uc601\uad6c \uc0ad\uc81c \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc138\uc694.", +"message.action.destroy.instance.with.backups": "\ud604\uc7ac \uac00\uc0c1\uba38\uc2e0\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uc0ad\uc81c\ub41c \uac00\uc0c1\uba38\uc2e0\uc740 \ubcf5\uad6c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc601\uad6c \uc0ad\uc81c\ud558\ub824\uba74 \uc601\uad6c \uc0ad\uc81c \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc138\uc694. \ud574\ub2f9 \uac00\uc0c1\uba38\uc2e0\uacfc \uc5f0\uacb0\ub41c \ubc31\uc5c5\uc774 \uc788\uc744 \uc218 \uc788\uc73c\uba70, \ubc31\uc5c5\uc740 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", "message.action.destroy.systemvm": "\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", -"message.action.destroy.volume": "\uc774 \ubcfc\ub968\uc744 \uc81c\uac70 \ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624. \ucc38\uace0 : \uacf5\uc720 \ubcfc\ub968\uc778 \uacbd\uc6b0 \uc774\ubbf8\uc9c0\ub294 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc73c\uba70, \ubc18\ub4dc\uc2dc \uc218\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud574\uc57c\ud569\ub2c8\ub2e4.", +"message.action.destroy.volume": "\ud604\uc7ac \ubcfc\ub968\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uc0ad\uc81c\ub41c \ubcfc\ub968\uc740 \ubcf5\uad6c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc601\uad6c \uc0ad\uc81c\ud558\ub824\uba74 \uc601\uad6c \uc0ad\uc81c \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc138\uc694.
\ucc38\uace0: \uacf5\uc720 \ubcfc\ub968\uc778 \uacbd\uc6b0 \uc774\ubbf8\uc9c0\ub294 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc73c\uba70, \ubc18\ub4dc\uc2dc \uc218\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud574\uc57c \ud569\ub2c8\ub2e4.", "message.action.disable.2FA.user.auth": "\uc0ac\uc6a9\uc790 \uc774\uc911 \uc778\uc99d\uc744 \ube44\ud65c\uc131\ud654\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.", "message.action.about.mandate.and.disable.2FA.user.auth": "\uc0ac\uc6a9\uc790\uc5d0\uac8c 2\ub2e8\uacc4 \uc778\uc99d\uc774 \ud544\uc218\uc785\ub2c8\ub2e4. \uc774 \uae30\ub2a5\uc744 \ube44\ud65c\uc131\ud654\ud558\uba74 \uc774\uc81c \uc0ac\uc6a9\uc790\ub294 \ub2e4\uc74c \ub85c\uadf8\uc778 \uc2dc 2\ub2e8\uacc4 \uc778\uc99d\uc744 \ub2e4\uc2dc \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.

\ube44\ud65c\uc131\ud654\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.", "message.action.disable.cluster": "\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \ube44\ud65c\uc131\ud654 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", @@ -2771,8 +2777,8 @@ "message.action.enable.pod": "\ud604\uc7ac Pod\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "message.action.enable.zone": "\ud604\uc7ac Zone\uc744 \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "message.action.expunge.sharedfs": "\uc774 \uacf5\uc720 \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc744 \uc0ad\uc81c\ud560\uc9c0 \ud655\uc778\ud574 \uc8fc\uc138\uc694.", -"message.action.expunge.instance": "\uc774 \uac00\uc0c1\uba38\uc2e0\uc744 \uc81c\uac70\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc138\uc694.", -"message.action.expunge.instance.with.backups": "\uc774 \uc778\uc2a4\ud134\uc2a4\ub97c \uc601\uad6c \uc0ad\uc81c\ud560 \uac83\uc778\uc9c0 \ud655\uc778\ud558\uc138\uc694. \ud574\ub2f9 \uc778\uc2a4\ud134\uc2a4\uc640 \uc5f0\uacb0\ub41c \ubc31\uc5c5\uc774 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", +"message.action.expunge.instance": "\ud604\uc7ac \uac00\uc0c1\uba38\uc2e0\uc744 \uc601\uad6c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uc774 \uc791\uc5c5\uc740 \ub418\ub3cc\ub9b4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", +"message.action.expunge.instance.with.backups": "\ud604\uc7ac \uac00\uc0c1\uba38\uc2e0\uc744 \uc601\uad6c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uc774 \uc791\uc5c5\uc740 \ub418\ub3cc\ub9b4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \uac00\uc0c1\uba38\uc2e0\uacfc \uc5f0\uacb0\ub41c \ubc31\uc5c5\uc774 \uc788\uc744 \uc218 \uc788\uc73c\uba70, \ubc31\uc5c5\uc740 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", "message.action.host.enable.maintenance.mode": "\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74, \uc774 \ud638\uc2a4\ud2b8\ub85c \uc2e4\ud589 \uc911\uc778 \ubaa8\ub4e0 \uac00\uc0c1\uba38\uc2e0\uc744 \ub2e4\ub978 \uc0ac\uc6a9 \uac00\ub2a5 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc2e4\uc2dc\uac04 \ub9c8\uc774\uadf8\ub808\uc774\uc158\ub429\ub2c8\ub2e4.", "message.action.instance.reset.password": "\ud604\uc7ac \uac00\uc0c1\uba38\uc2e0 \ub8e8\ud2b8 \ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", "message.action.manage.cluster": "\ud074\ub7ec\uc2a4\ud130\ub97c \uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", @@ -3833,8 +3839,8 @@ "message.volume.state.creating": "\ubcfc\ub968\uc774 \uc0dd\uc131\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4.", "message.volume.state.destroy": "\ubcfc\ub968\uc774 \ud30c\uae30\ub418\uc5b4 \ubcf5\uad6c \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", "message.volume.state.destroying": "\ubcfc\ub968\uc774 \ud30c\uae30\ub418\uace0 \uc788\uc73c\uba70 \ubcf5\uad6c \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", -"message.volume.state.expunged": "\ubcfc\ub968\uc774 \uc81c\uac70\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", -"message.volume.state.expunging": "\ubcfc\ub968\uc774 \uc81c\uac70\uc911\uc785\ub2c8\ub2e4.", +"message.volume.state.expunged": "\ubcfc\ub968\uc774 \uc601\uad6c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", +"message.volume.state.expunging": "\ubcfc\ub968\uc744 \uc601\uad6c \uc0ad\uc81c\ud558\ub294 \uc911\uc785\ub2c8\ub2e4.", "message.volume.state.migrating": "\ubcfc\ub968\uc774 \ub2e4\ub978 \uc2a4\ud1a0\ub9ac\uc9c0 \ud480\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158 \uc911\uc785\ub2c8\ub2e4.", "message.volume.state.notuploaded": "\ubcfc\ub968 \ud56d\ubaa9\uc774 DB\uc5d0 \uc0dd\uc131\ub418\uc5c8\uc9c0\ub9cc \uc544\uc9c1 \uc5c5\ub85c\ub4dc\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.", "message.volume.state.ready": "\ubcfc\ub968\uc744 \uc0ac\uc6a9\ud560 \uc900\ube44\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", @@ -4137,7 +4143,7 @@ "vm.migrate": "\uac00\uc0c1\uba38\uc2e0 \ub9c8\uc774\uadf8\ub808\uc774\uc158", "vm.move": "\uac00\uc0c1\uba38\uc2e0 \uc774\ub3d9", "vm.restore": "\uac00\uc0c1\uba38\uc2e0 \ubcf5\uc6d0", -"vm.expunge": "\uac00\uc0c1\uba38\uc2e0 \uc0ad\uc81c", +"vm.expunge": "\uac00\uc0c1\uba38\uc2e0 \uc601\uad6c \uc0ad\uc81c", "vm.import": "\uac00\uc0c1\uba38\uc2e0 \uac00\uc838\uc624\uae30", "vm.unmanage": "\uac00\uc0c1\uba38\uc2e0 \uad00\ub9ac\ud574\uc81c", "vm.recover": "\uac00\uc0c1\uba38\uc2e0 \ubcf5\uad6c", diff --git a/ui/src/components/view/DetailsTab.vue b/ui/src/components/view/DetailsTab.vue index c57332d484ec..3b3ea8871a2e 100644 --- a/ui/src/components/view/DetailsTab.vue +++ b/ui/src/components/view/DetailsTab.vue @@ -77,6 +77,12 @@
{{ dataResource[item] === 'Not Installed' ? $t('label.state.qemuagentversion.notinstalled') : dataResource[item]}}
+
+ {{ activeNicAddresses('ipaddress') }} +
+
+ {{ activeNicAddresses('ip6address') }} +
{{ dctemplate.name }} @@ -347,7 +353,7 @@ export default { } const managementIps = [] for (const nic of this.resource.nic) { - if (managementDeviceIds.includes(parseInt(nic.deviceid)) && nic.ipaddress) { + if (managementDeviceIds.includes(parseInt(nic.deviceid)) && nic.linkstate !== false && nic.ipaddress) { managementIps.push(nic.ipaddress) if (nic.publicip) { managementIps.push(nic.publicip) @@ -391,7 +397,7 @@ export default { }, ipV6Address () { if (this.dataResource.nic && this.dataResource.nic.length > 0) { - return this.dataResource.nic.filter(e => { return e.ip6address }).map(e => { return e.ip6address }).join(', ') + return this.dataResource.nic.filter(e => e.linkstate !== false && e.ip6address).map(e => e.ip6address).join(', ') } return null }, @@ -506,6 +512,13 @@ export default { if (val < 1024 * 1024 * 1024 * 1024) return `${(val / 1024 / 1024 / 1024).toFixed(2)} TB` return val }, + activeNicAddresses (field) { + if (!this.dataResource.nic || this.dataResource.nic.length === 0) { + return this.dataResource[field] + } + + return this.dataResource.nic.filter(e => e.linkstate !== false && e[field]).map(e => e[field]).join(', ') + }, getUserSourceLabel (source) { if (source === 'saml2') { source = 'saml' diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index cfc1bf520500..1b1363d05fd3 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -1275,7 +1275,7 @@ export default { }, setData () { if (this.resource.nic && this.resource.nic.length > 0) { - this.ipaddress = this.resource.nic.filter(e => { return e.ipaddress }).map(e => { return e.ipaddress }).join(', ') + this.ipaddress = this.resource.nic.filter(e => e.linkstate !== false && e.ipaddress).map(e => e.ipaddress).join(', ') } else { this.ipaddress = this.resource.ipaddress } diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index 4866ce6a6a9b..0dee8297f97d 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -182,9 +182,9 @@