Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
3b6b638
테스트
Dajeong-Park Feb 25, 2026
461fb9a
Update UserVmManagerImpl.java
Dajeong-Park Feb 25, 2026
c54d0e7
Update UserVmManagerImpl.java
Dajeong-Park Feb 25, 2026
0ca1041
Update UserVmManagerImpl.java
Dajeong-Park Feb 25, 2026
fed3ef1
Update UserVmManagerImpl.java
Dajeong-Park Feb 25, 2026
05f3c29
Update UserVmManagerImpl.java
Dajeong-Park Feb 25, 2026
1d6855e
Update UserVmManagerImpl.java
Dajeong-Park Feb 25, 2026
f8acd03
Update KVMStorageProcessor.java
Dajeong-Park Feb 25, 2026
fa9300b
Update KVMStorageProcessor.java
Dajeong-Park Feb 26, 2026
4143ebe
test
Dajeong-Park Feb 26, 2026
5241405
Update CloneVM.vue
Dajeong-Park Feb 26, 2026
e162798
Update UserVmManagerImpl.java
Dajeong-Park Feb 26, 2026
b7456ab
Update UserVmManagerImpl.java
Dajeong-Park Feb 26, 2026
4e1edd7
Merge branch 'ablecloud-team:ablestack-europa' into ablestack-europa
Dajeong-Park Mar 16, 2026
2617414
Merge branch 'ablecloud-team:ablestack-europa' into ablestack-europa
Dajeong-Park Apr 1, 2026
e1d2e15
백업 스케줄 구성시 가상머신 선택에 따른 설정 초기화 오류 수정
Dajeong-Park Apr 1, 2026
046f65a
1차 커밋
Dajeong-Park Apr 1, 2026
296ee63
Update FormSchedule.vue
Dajeong-Park Apr 2, 2026
e249dfe
vm_id 컬럼 추가
Dajeong-Park Apr 2, 2026
0982a5a
nasbackup.sh 파일 수정
Dajeong-Park Apr 2, 2026
6dff426
Update BackupManager.java
Dajeong-Park Apr 2, 2026
4b445f0
Update nasbackup.sh
Dajeong-Park Apr 2, 2026
f35c1f6
Update nasbackup.sh
Dajeong-Park Apr 2, 2026
a05c3c0
Update nasbackup.sh
Dajeong-Park Apr 2, 2026
0908acd
rbd의 경우에도 도메인 정보 백업
Dajeong-Park Apr 2, 2026
95e51b8
Update nasbackup.sh
Dajeong-Park Apr 2, 2026
670541e
추가 적용
Dajeong-Park Apr 2, 2026
4ae4535
크로스존 활성화된 경우 고려
Dajeong-Park Apr 2, 2026
085b62a
백업 체인 길이 설정 및 VM스냅샷 관련 예외처리 추가
Dajeong-Park Apr 2, 2026
6bda058
Update CommvaultBackupProvider.java
Dajeong-Park Apr 2, 2026
4075b5f
RBD타입인 경우 파일명 변경
Dajeong-Park Apr 3, 2026
0718ba7
Update NASBackupProvider.java
Dajeong-Park Apr 3, 2026
b32d609
Update LibvirtRestoreBackupCommandWrapper.java
Dajeong-Park Apr 3, 2026
88f6d64
타임아웃 추가
Dajeong-Park Apr 3, 2026
41053d7
raw타입이면 Import하도록 명령어 변경
Dajeong-Park Apr 3, 2026
04568fd
재복원시 오류 수정
Dajeong-Park Apr 3, 2026
17359f6
볼륨 복원 및 연결시 오류 수정
Dajeong-Park Apr 3, 2026
f51db15
Update NASBackupProvider.java
Dajeong-Park Apr 3, 2026
22b3e90
Update NASBackupProvider.java
Dajeong-Park Apr 3, 2026
b7f9614
Update LibvirtRestoreBackupCommandWrapper.java
Dajeong-Park Apr 3, 2026
23ad6cf
UI 빌드오류 및 백업에서 새 인스턴스 생성 시 네트워크 목록 선택오류 수정
Dajeong-Park Apr 3, 2026
c920790
백업에서 새 인스턴스 생성시 네트워크 목록 초기화 오류 수정
Dajeong-Park Apr 6, 2026
d6e3082
쉘 스크립트 -> java로 변경
Dajeong-Park Apr 6, 2026
d7bd12b
스크립트 수정
Dajeong-Park Apr 6, 2026
9872e86
재정리
Dajeong-Park Apr 6, 2026
dd39cc6
쉘 적용
Dajeong-Park Apr 6, 2026
dc9ef2b
로그수정
Dajeong-Park Apr 6, 2026
8755d24
재수정
Dajeong-Park Apr 6, 2026
3f5957d
재수정
Dajeong-Park Apr 6, 2026
ace4606
로그 추가
Dajeong-Park Apr 6, 2026
63a18a8
테스트 로그 추가
Dajeong-Park Apr 6, 2026
b5aa28a
테스트용
Dajeong-Park Apr 6, 2026
fb34740
테스트용
Dajeong-Park Apr 6, 2026
768d6e3
로그 수정
Dajeong-Park Apr 6, 2026
320e9c4
Update nasbackup.sh
Dajeong-Park Apr 6, 2026
a4b3726
Update nasbackup.sh
Dajeong-Park Apr 6, 2026
f44828d
Update nasbackup.sh
Dajeong-Park Apr 6, 2026
dc0e66a
rbd의 경우 meta형식으로 저장
Dajeong-Park Apr 7, 2026
f2e71a0
백업본을 복원하여 스냅샷이 없는 경우 강제 FULL 백업 실행하도록 변경
Dajeong-Park Apr 8, 2026
5f5b174
Update CommvaultBackupProvider.java
Dajeong-Park Apr 8, 2026
baa3bd0
백업삭제시 details 도 삭제되도록 변경
Dajeong-Park Apr 8, 2026
5d19daf
Incremental 백업 시도시 parent 없는 경우 FULL 백업 강제할때 실패한 백업 리스트 삭제하도록 변경
Dajeong-Park Apr 8, 2026
fc4c24f
Update CommvaultBackupProvider.java
Dajeong-Park Apr 8, 2026
a2f878d
중간체인 복원시 diff 못읽어오는 오류 수정
Dajeong-Park Apr 8, 2026
83992e4
복원시 스냅샷 재구성
Dajeong-Park Apr 8, 2026
3278df8
백업 모달에서 Commvault에도 백업 이름과 설명 표시되도록 변경
Dajeong-Park Apr 8, 2026
2aa9970
commvault 백업 삭제시 rbd인 경우 스냅샷 삭제 부분 추가, 백업 체인 있는 경우 삭제 예외처리 추가
Dajeong-Park Apr 9, 2026
b8c1ce0
체크포인트 네임 통일
Dajeong-Park Apr 9, 2026
290dc6b
commvault 복원 오류 수정
Dajeong-Park Apr 9, 2026
47654fb
Update CommvaultBackupProvider.java
Dajeong-Park Apr 9, 2026
b657a39
Update CommvaultBackupProvider.java
Dajeong-Park Apr 9, 2026
1555795
새 인스턴스 생성 시 네트워크 항목 오류 수정
Dajeong-Park Apr 9, 2026
40d16e3
복원 관련 코드 수정
Dajeong-Park Apr 9, 2026
7777bf0
syncBackups 오류수정
Dajeong-Park Apr 9, 2026
adc6550
증분 백업 미적용 오류로 콘텐츠 경로 수정
Dajeong-Park Apr 9, 2026
8acfcb3
중간 체인 복원시 오류 수정
Dajeong-Park Apr 10, 2026
5a6bbf0
증분체인 복원시 특정파일이 아닌 가상머신 전체 폴더 복원되도록 변경 테스트
Dajeong-Park Apr 10, 2026
482c8b4
체인이 다른 호스트에 흩어진 경우 모아서 복원 호출
Dajeong-Park Apr 10, 2026
c8cb8b9
복원시 파라미터 변경
Dajeong-Park Apr 10, 2026
84153ce
클래스 분리
Dajeong-Park Apr 10, 2026
cf7257d
Update AblestackCommvaultRestoreBackupCommand.java
Dajeong-Park Apr 10, 2026
cc82481
pom 변경
Dajeong-Park Apr 10, 2026
4467f5b
재적용
Dajeong-Park Apr 10, 2026
0ce28d2
재수정
Dajeong-Park Apr 10, 2026
c83796d
nas 의 경우 ablestack-nas 소스 타도록 변경
Dajeong-Park Apr 10, 2026
29dd89d
백업 유지갯수에 따라 증분 백업 체인 결정
Dajeong-Park Apr 10, 2026
9022925
Update AblestackNasRestoreBackupCommand.java
Dajeong-Park Apr 10, 2026
2ecf18b
중간체인 복원시 폴더별로 보내도록 변경 테스트
Dajeong-Park Apr 10, 2026
25e05c3
Update LibvirtAblestackNasBackupHelper.java
Dajeong-Park Apr 10, 2026
2ae6e71
빌드오류 수정
Dajeong-Park Apr 10, 2026
5c7ab1a
빌드오류 수정
Dajeong-Park Apr 10, 2026
0f86291
Update AblestackNasBackupProvider.java
Dajeong-Park Apr 10, 2026
3d2849c
빌드오류 수정
Dajeong-Park Apr 10, 2026
ae0103b
재수정
Dajeong-Park Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.backup.BackupManager;
import org.apache.cloudstack.backup.BackupProvider;
import org.apache.cloudstack.backup.BackupProviderNameUtils;

import com.cloud.user.Account;

Expand Down Expand Up @@ -70,11 +71,12 @@ private void setupResponse(final List<BackupProvider> providers) {
final ListResponse<BackupProviderResponse> response = new ListResponse<>();
final List<BackupProviderResponse> responses = new ArrayList<>();
for (final BackupProvider provider : providers) {
if (provider == null || (getName() != null && !provider.getName().equals(getName()))) {
final String displayName = provider == null ? null : BackupProviderNameUtils.toDisplayName(provider.getName());
if (provider == null || (getName() != null && !displayName.equalsIgnoreCase(getName()))) {
continue;
}
final BackupProviderResponse backupProviderResponse = new BackupProviderResponse();
backupProviderResponse.setName(provider.getName());
backupProviderResponse.setName(displayName);
backupProviderResponse.setDescription(provider.getDescription());
backupProviderResponse.setObjectName("providers");
responses.add(backupProviderResponse);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.backup.BackupManager;
import org.apache.cloudstack.backup.BackupProvider;
import org.apache.cloudstack.backup.BackupProviderNameUtils;

import com.cloud.user.Account;

Expand Down Expand Up @@ -75,7 +76,7 @@ private void setupResponse(final List<BackupProvider> providers) {
continue;
}
final BackupProviderResponse backupProviderResponse = new BackupProviderResponse();
backupProviderResponse.setName(provider.getName());
backupProviderResponse.setName(BackupProviderNameUtils.toDisplayName(provider.getName()));
backupProviderResponse.setDescription(provider.getDescription());
backupProviderResponse.setObjectName("providers");
responses.add(backupProviderResponse);
Expand Down
32 changes: 19 additions & 13 deletions api/src/main/java/org/apache/cloudstack/backup/BackupManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import org.apache.cloudstack.api.command.user.backup.ListBackupsCmd;
import org.apache.cloudstack.api.response.BackupResponse;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.ValidatedConfigKey;
import org.apache.cloudstack.framework.config.Configurable;

import com.cloud.exception.ResourceUnavailableException;
Expand All @@ -54,11 +53,10 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
"false",
"Is backup and recovery framework enabled.", false, ConfigKey.Scope.Zone);

ConfigKey<String> BackupProviderPlugin = new ValidatedConfigKey<>("Advanced", String.class,
ConfigKey<String> BackupProviderPlugin = new ConfigKey<>("Advanced", String.class,
"backup.framework.provider.plugin",
"dummy",
"The backup and recovery provider plugin. Valid plugin values: dummy, veeam, networker and nas",
true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key(), value -> validateBackupProviderConfig((String)value));
"The backup and recovery provider plugin.", true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key());

ConfigKey<Long> BackupSyncPollingInterval = new ConfigKey<>("Advanced", Long.class,
"backup.framework.sync.interval",
Expand All @@ -70,6 +68,23 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
"false",
"Enable volume attach/detach operations for VMs that are assigned to Backup Offerings.", true);

ConfigKey<Boolean> KvmIncrementalBackup = new ConfigKey<>("Advanced", Boolean.class,
"kvm.incremental.backup",
"false",
"Enable KVM incremental backups for supported backup providers.",
false,
ConfigKey.Scope.Cluster,
null);

ConfigKey<Integer> BackupDeltaMax = new ConfigKey<>(Integer.class,
"backup.delta.max",
"Advanced",
"10",
"Max incremental backups between two full backups for KVM backup providers.",
true,
ConfigKey.Scope.Global,
null);

ConfigKey<Long> DefaultMaxAccountBackups = new ConfigKey<Long>("Account Defaults", Long.class,
"max.account.backups",
"20",
Expand Down Expand Up @@ -253,13 +268,4 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer

void checkAndRemoveBackupOfferingBeforeExpunge(VirtualMachine vm);

static void validateBackupProviderConfig(String value) {
if (value != null && (value.contains(",") || value.trim().contains(" "))) {
throw new IllegalArgumentException("Multiple backup provider plugins are not supported. Please provide a single plugin value.");
}
List<String> validPlugins = List.of("dummy", "veeam", "networker", "nas");
if (value != null && !validPlugins.contains(value)) {
throw new IllegalArgumentException("Invalid backup provider plugin: " + value + ". Valid plugin values are: " + String.join(", ", validPlugins));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package org.apache.cloudstack.backup;

import org.apache.commons.lang3.StringUtils;

public final class BackupProviderNameUtils {
public static final String NAS = "nas";
public static final String COMMVAULT = "commvault";
public static final String ABLESTACK_NAS = "ablestack-nas";
public static final String ABLESTACK_COMMVAULT = "ablestack-commvault";

private BackupProviderNameUtils() {
}

public static String canonicalize(final String providerName) {
if (StringUtils.isBlank(providerName)) {
return providerName;
}
if (NAS.equalsIgnoreCase(providerName) || ABLESTACK_NAS.equalsIgnoreCase(providerName)) {
return ABLESTACK_NAS;
}
if (COMMVAULT.equalsIgnoreCase(providerName) || ABLESTACK_COMMVAULT.equalsIgnoreCase(providerName)) {
return ABLESTACK_COMMVAULT;
}
return providerName;
}

public static String toDisplayName(final String providerName) {
if (StringUtils.isBlank(providerName)) {
return providerName;
}
if (ABLESTACK_NAS.equalsIgnoreCase(providerName) || NAS.equalsIgnoreCase(providerName)) {
return NAS;
}
if (ABLESTACK_COMMVAULT.equalsIgnoreCase(providerName) || COMMVAULT.equalsIgnoreCase(providerName)) {
return COMMVAULT;
}
return providerName;
}

public static boolean isNasFamily(final String providerName) {
return ABLESTACK_NAS.equalsIgnoreCase(canonicalize(providerName));
}

public static boolean isCommvaultFamily(final String providerName) {
return ABLESTACK_COMMVAULT.equalsIgnoreCase(canonicalize(providerName));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@

import java.util.List;

public class CommvaultRestoreBackupCommand extends Command {
public class AblestackCommvaultRestoreBackupCommand extends Command {
private String vmName;
private String backupPath;
private List<String> backupVolumesUUIDs;
private List<String> backupFiles;
private List<String> backupFileChains;
private List<PrimaryDataStoreTO> restoreVolumePools;
private List<String> restoreVolumePaths;
private String diskType;
Expand All @@ -39,8 +41,9 @@ public class CommvaultRestoreBackupCommand extends Command {
private Integer timeout;
private String cacheMode;
private String hostName;
private List<String> backupSourceHosts;

protected CommvaultRestoreBackupCommand() {
protected AblestackCommvaultRestoreBackupCommand() {
super();
}

Expand Down Expand Up @@ -124,6 +127,22 @@ public void setBackupVolumesUUIDs(List<String> backupVolumesUUIDs) {
this.backupVolumesUUIDs = backupVolumesUUIDs;
}

public List<String> getBackupFiles() {
return backupFiles;
}

public void setBackupFiles(List<String> backupFiles) {
this.backupFiles = backupFiles;
}

public List<String> getBackupFileChains() {
return backupFileChains;
}

public void setBackupFileChains(List<String> backupFileChains) {
this.backupFileChains = backupFileChains;
}

public Integer getTimeout() {
return this.timeout == null ? 0 : this.timeout;
}
Expand All @@ -147,4 +166,12 @@ public String getHostName() {
public void setHostName(String hostName) {
this.hostName = hostName;
}

public List<String> getBackupSourceHosts() {
return backupSourceHosts;
}

public void setBackupSourceHosts(List<String> backupSourceHosts) {
this.backupSourceHosts = backupSourceHosts;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,20 @@

import java.util.List;

public class CommvaultTakeBackupCommand extends Command {
public class AblestackCommvaultTakeBackupCommand extends Command {
private String vmName;
private String backupPath;
private List<PrimaryDataStoreTO> volumePools;
private List<String> volumePaths;
private Boolean quiesce;

public CommvaultTakeBackupCommand(String vmName, String backupPath) {
private String backupType;
private String checkpointName;
private String parentBackupPath;
private String parentCheckpointName;
private String parentCheckpointPath;
private List<String> backupFiles;

public AblestackCommvaultTakeBackupCommand(String vmName, String backupPath) {
super();
this.vmName = vmName;
this.backupPath = backupPath;
Expand Down Expand Up @@ -77,6 +83,54 @@ public void setQuiesce(Boolean quiesce) {
this.quiesce = quiesce;
}

public String getBackupType() {
return backupType;
}

public void setBackupType(String backupType) {
this.backupType = backupType;
}

public String getCheckpointName() {
return checkpointName;
}

public void setCheckpointName(String checkpointName) {
this.checkpointName = checkpointName;
}

public String getParentBackupPath() {
return parentBackupPath;
}

public void setParentBackupPath(String parentBackupPath) {
this.parentBackupPath = parentBackupPath;
}

public String getParentCheckpointName() {
return parentCheckpointName;
}

public void setParentCheckpointName(String parentCheckpointName) {
this.parentCheckpointName = parentCheckpointName;
}

public String getParentCheckpointPath() {
return parentCheckpointPath;
}

public void setParentCheckpointPath(String parentCheckpointPath) {
this.parentCheckpointPath = parentCheckpointPath;
}

public List<String> getBackupFiles() {
return backupFiles;
}

public void setBackupFiles(List<String> backupFiles) {
this.backupFiles = backupFiles;
}

@Override
public boolean executeInSequence() {
return true;
Expand Down
Loading
Loading