@@ -9,7 +9,7 @@ import (
|
||||
)
|
||||
|
||||
// 本文件实现 VCN 的级联删除:OCI 要求 VCN 删除前先清空其子网、网关、
|
||||
// 非默认路由表 / 安全列表 / DHCP 选项,顺序参照控制台删除向导。
|
||||
// 网络安全组(NSG)与非默认路由表 / 安全列表 / DHCP 选项,顺序参照控制台删除向导。
|
||||
// 子网仍被 VNIC 占用(实例未终止)时 OCI 返回 409 IncorrectState,
|
||||
// 该错误经 api 层提炼后提示用户先终止实例,不在此做实例级清理。
|
||||
|
||||
@@ -32,6 +32,9 @@ func deleteVcnCascade(ctx context.Context, vn core.VirtualNetworkClient, vcnID s
|
||||
if err := deleteVcnSecondaries(ctx, vn, comp, vcnID, vcnResp.Vcn); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := deleteVcnNsgs(ctx, vn, vcnID); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := vn.DeleteVcn(ctx, core.DeleteVcnRequest{VcnId: &vcnID}); err != nil {
|
||||
return fmt.Errorf("delete vcn %s: %w", vcnID, err)
|
||||
}
|
||||
@@ -183,3 +186,25 @@ func deleteVcnSecondaries(ctx context.Context, vn core.VirtualNetworkClient, com
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// deleteVcnNsgs 删除 VCN 下全部网络安全组:遗留 NSG 会使 DeleteVcn 报
|
||||
// 409 associated with NSG。仅按 VcnId 过滤,跨 compartment 的 NSG 也能覆盖;
|
||||
// 子网删除后 VNIC 已不存在,NSG 不再有关联,可直接删除。
|
||||
func deleteVcnNsgs(ctx context.Context, vn core.VirtualNetworkClient, vcnID string) error {
|
||||
resp, err := vn.ListNetworkSecurityGroups(ctx, core.ListNetworkSecurityGroupsRequest{VcnId: &vcnID})
|
||||
if err != nil {
|
||||
return fmt.Errorf("list network security groups: %w", err)
|
||||
}
|
||||
for _, g := range resp.Items {
|
||||
if g.LifecycleState == core.NetworkSecurityGroupLifecycleStateTerminated ||
|
||||
g.LifecycleState == core.NetworkSecurityGroupLifecycleStateTerminating {
|
||||
continue
|
||||
}
|
||||
if _, err := vn.DeleteNetworkSecurityGroup(ctx, core.DeleteNetworkSecurityGroupRequest{
|
||||
NetworkSecurityGroupId: g.Id,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("delete network security group %s: %w", deref(g.DisplayName), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user