fix(region): 简化清理未使用的安全组 (#20724)

This commit is contained in:
屈轩
2024-07-05 11:03:18 +08:00
committed by GitHub
parent 4d608d59f4
commit 876f3de5a3
4 changed files with 38 additions and 31 deletions
+1
View File
@@ -34,4 +34,5 @@ func init() {
cmd.Perform("add-rule", &options.SecgroupsAddRuleOptions{})
cmd.Perform("change-owner", &options.SecgroupChangeOwnerOptions{})
cmd.Perform("import-rules", &options.SecgroupImportRulesOptions{})
cmd.PerformClass("clean", &options.SecgroupCleanOptions{})
}
+28 -28
View File
@@ -839,7 +839,7 @@ func (manager *SSecurityGroupManager) InitializeData() error {
}
}
guests := make([]SGuest, 0)
q := GuestManager.Query().Equals("hypervisor", api.HYPERVISOR_KVM).IsNullOrEmpty("secgrp_id")
q := GuestManager.Query().Equals("hypervisor", api.HYPERVISOR_KVM).IsNotEmpty("external_id").IsNullOrEmpty("secgrp_id")
err = db.FetchModelObjects(GuestManager, q, &guests)
if err != nil {
log.Errorf("fetch guests without secgroup fail %s", err)
@@ -851,36 +851,36 @@ func (manager *SSecurityGroupManager) InitializeData() error {
return nil
})
}
if options.Options.CleanUselessKvmSecurityGroup {
q := SecurityGroupManager.Query()
q = q.Filter(
sqlchemy.AND(
sqlchemy.Equals(q.Field("cloudregion_id"), api.DEFAULT_REGION_ID),
sqlchemy.NotEquals(q.Field("id"), api.SECGROUP_DEFAULT_ID),
sqlchemy.NotIn(q.Field("id"), GuestManager.Query("secgrp_id").IsNotNull("secgrp_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), GuestManager.Query("admin_secgrp_id").IsNotNull("admin_secgrp_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), GuestsecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), GuestsecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), DBInstanceSecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), ElasticcachesecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
),
)
secgroups := []SSecurityGroup{}
err := db.FetchModelObjects(SecurityGroupManager, q, &secgroups)
return nil
}
func (manager *SSecurityGroupManager) PerformClean(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
q := SecurityGroupManager.Query()
q = q.Filter(
sqlchemy.AND(
sqlchemy.Equals(q.Field("cloudregion_id"), api.DEFAULT_REGION_ID),
sqlchemy.NotEquals(q.Field("id"), api.SECGROUP_DEFAULT_ID),
sqlchemy.NotIn(q.Field("id"), GuestManager.Query("secgrp_id").IsNotNull("secgrp_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), GuestManager.Query("admin_secgrp_id").IsNotNull("admin_secgrp_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), GuestsecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), GuestsecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), DBInstanceSecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), ElasticcachesecgroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
sqlchemy.NotIn(q.Field("id"), LoadbalancerSecurityGroupManager.Query("secgroup_id").IsNotNull("secgroup_id").SubQuery()),
),
)
secgroups := []SSecurityGroup{}
err := db.FetchModelObjects(SecurityGroupManager, q, &secgroups)
if err != nil {
return nil, errors.Wrapf(err, "FetchModelObjects")
}
for i := range secgroups {
err = secgroups[i].RealDelete(ctx, userCred)
if err != nil {
return err
}
ctx := context.Background()
ctx = context.WithValue(ctx, "clean", "kvm security groups")
userCred := auth.GetAdminSession(ctx, options.Options.Region).GetToken()
for i := range secgroups {
err = secgroups[i].RealDelete(ctx, userCred)
if err != nil {
return err
}
return nil, errors.Wrapf(err, "delete %s", secgroups[i].Name)
}
}
return nil
return nil, nil
}
func (self *SSecurityGroup) GetRegionDriver() (IRegionDriver, error) {
+2 -3
View File
@@ -34,9 +34,8 @@ type ComputeOptions struct {
DefaultMemoryOvercommitBound float32 `default:"1.0" help:"Default memory overcommit bound for host, default to 1"`
DefaultStorageOvercommitBound float32 `default:"1.0" help:"Default storage overcommit bound for storage, default to 1"`
DefaultSecurityGroupId string `help:"Default security rules" default:"default"`
DefaultAdminSecurityGroupId string `help:"Default admin security rules" default:""`
CleanUselessKvmSecurityGroup bool `help:"Clean useless kvm security groups when service start"`
DefaultSecurityGroupId string `help:"Default security rules" default:"default"`
DefaultAdminSecurityGroupId string `help:"Default admin security rules" default:""`
DefaultDiskSizeMB int `default:"10240" help:"Default disk size in MB if not specified, default to 10GiB" json:"default_disk_size"`
+7
View File
@@ -180,3 +180,10 @@ func (opts *SecgroupImportRulesOptions) Params() (jsonutils.JSONObject, error) {
}
return jsonutils.Marshal(map[string]*jsonutils.JSONArray{"rules": rules}), nil
}
type SecgroupCleanOptions struct {
}
func (opts *SecgroupCleanOptions) Params() (jsonutils.JSONObject, error) {
return nil, nil
}