Skip to content

Commit da1dd86

Browse files
author
Chen, Taiyue
committed
<fix>[account]: transfer all resources to admin when deleting users
Background: Unlike ZStack Cloud which has strong multi-tenant isolation with dedicated resource lifecycle per tenant, ZSphere adopts a different model where resources should be preserved when an account is deleted. Instead of cascading deletion to all owned resources, we want to maintain the resources and transfer their ownership to the admin user. This commit removes AccountVO.class.getSimpleName() from getEdgeNames() in all CascadeExtension classes across both core and premium modules, preventing the cascade deletion framework from triggering resource deletion when an account is deleted. After this change, deleting an account will no longer trigger cascade deletion of associated resources. The resources will remain in the system and can be adopted by the admin user through the existing adminAdoptAllOrphanedResource() mechanism. Resolves: ZSV-11415 Change-Id: I64756a6578776f646e6262696a62756e7173766c
1 parent 421e9c8 commit da1dd86

14 files changed

Lines changed: 35 additions & 19 deletions

File tree

compute/src/main/java/org/zstack/compute/vm/VmCascadeExtension.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,7 @@ public List<String> getEdgeNames() {
540540
IpRangeVO.class.getSimpleName(),
541541
PrimaryStorageVO.class.getSimpleName(),
542542
L2NetworkVO.class.getSimpleName(),
543-
InstanceOfferingVO.class.getSimpleName(),
544-
AccountVO.class.getSimpleName());
543+
InstanceOfferingVO.class.getSimpleName());
545544
}
546545

547546
@Override

configuration/src/main/java/org/zstack/configuration/DiskOfferingCascadeExtension.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.zstack.utils.logging.CLogger;
2424

2525
import java.util.ArrayList;
26-
import java.util.Arrays;
26+
import java.util.Collections;
2727
import java.util.List;
2828

2929
/**
@@ -102,7 +102,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
102102

103103
@Override
104104
public List<String> getEdgeNames() {
105-
return Arrays.asList(AccountVO.class.getSimpleName());
105+
return Collections.emptyList();
106106
}
107107

108108
@Override

configuration/src/main/java/org/zstack/configuration/InstanceOfferingCascadeExtension.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.zstack.utils.logging.CLogger;
2424

2525
import java.util.ArrayList;
26-
import java.util.Arrays;
26+
import java.util.Collections;
2727
import java.util.List;
2828

2929
/**
@@ -101,7 +101,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
101101

102102
@Override
103103
public List<String> getEdgeNames() {
104-
return Arrays.asList(AccountVO.class.getSimpleName());
104+
return Collections.emptyList();
105105
}
106106

107107
@Override

identity/src/main/java/org/zstack/identity/AccountBase.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,16 @@ public void fail(ErrorCode errorCode) {
201201
}
202202
});
203203

204+
flow(new NoRollbackFlow() {
205+
String __name__ = "transfer-account-resource-to-admin";
206+
207+
@Override
208+
public void run(FlowTrigger trigger, Map data) {
209+
transferAllOwnedResourcesToAdmin();
210+
trigger.next();
211+
}
212+
});
213+
204214
done(new FlowDoneHandler(completion) {
205215
@Override
206216
public void handle(Map data) {
@@ -248,6 +258,15 @@ public void fail(ErrorCode errorCode) {
248258
});
249259
}
250260

261+
private void transferAllOwnedResourcesToAdmin() {
262+
SQL.New(AccountResourceRefVO.class)
263+
.eq(AccountResourceRefVO_.accountUuid, self.getUuid())
264+
.eq(AccountResourceRefVO_.type, AccessLevel.Own)
265+
.set(AccountResourceRefVO_.accountUuid, AccountConstant.INITIAL_SYSTEM_ADMIN_UUID)
266+
.update();
267+
}
268+
269+
251270
private void deleteRelatedResources() {
252271
new SQLBatch() {
253272
@Override

image/src/main/java/org/zstack/image/ImageCascadeExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
105105

106106
@Override
107107
public List<String> getEdgeNames() {
108-
return Arrays.asList(BackupStorageVO.class.getSimpleName(), AccountVO.class.getSimpleName());
108+
return Arrays.asList(BackupStorageVO.class.getSimpleName());
109109
}
110110

111111
@Override

network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
214214

215215
@Override
216216
public List<String> getEdgeNames() {
217-
return Arrays.asList(ZoneVO.class.getSimpleName(), AccountVO.class.getSimpleName());
217+
return Arrays.asList(ZoneVO.class.getSimpleName());
218218
}
219219

220220
@Override

network/src/main/java/org/zstack/network/l3/L3NetworkCascadeExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
132132

133133
@Override
134134
public List<String> getEdgeNames() {
135-
return Arrays.asList(L2NetworkVO.class.getSimpleName(), AccountVO.class.getSimpleName());
135+
return Arrays.asList(L2NetworkVO.class.getSimpleName());
136136
}
137137

138138
@Override

plugin/acl/src/main/java/org/zstack/acl/AccessControlListCascadeExtension.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.zstack.utils.Utils;
2121
import org.zstack.utils.logging.CLogger;
2222

23-
import java.util.Arrays;
23+
import java.util.Collections;
2424
import java.util.List;
2525

2626
public class AccessControlListCascadeExtension extends AbstractAsyncCascadeExtension {
@@ -87,7 +87,7 @@ private void handleDeletionCleanup(CascadeAction action, Completion completion)
8787

8888
@Override
8989
public List<String> getEdgeNames() {
90-
return Arrays.asList(AccountVO.class.getSimpleName());
90+
return Collections.emptyList();
9191
}
9292

9393
@Override

plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,8 +642,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
642642
@Override
643643
public List<String> getEdgeNames() {
644644
return Arrays.asList(HostVO.class.getSimpleName(), L3NetworkVO.class.getSimpleName(),
645-
IpRangeVO.class.getSimpleName(), PrimaryStorageVO.class.getSimpleName(), L2NetworkVO.class.getSimpleName(),
646-
AccountVO.class.getSimpleName());
645+
IpRangeVO.class.getSimpleName(), PrimaryStorageVO.class.getSimpleName(), L2NetworkVO.class.getSimpleName());
647646
}
648647

649648
@Override

plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) {
203203
@Override
204204
public List<String> getEdgeNames() {
205205
List<String> ret = new ArrayList<>();
206-
ret.add(AccountVO.class.getSimpleName());
207206
ret.add(VipVO.class.getSimpleName());
208207
ret.add(AccessControlListVO.class.getSimpleName());
209208
return ret;

0 commit comments

Comments
 (0)