From fc9b61c2a94ca5463558f7a1be2ce7af03647951 Mon Sep 17 00:00:00 2001 From: rainzm Date: Fri, 25 Sep 2020 20:17:58 +0800 Subject: [PATCH] fix:(region) correct syncSchedtags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.把extTagName存到metadata里面,这样就算修改tag的name,也能在metadata里面拿到。 2.已经创建的schedtag就不要重复创建了。 --- pkg/compute/models/hosts.go | 61 +++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 698706c58c..ec74fefbee 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -1773,10 +1773,27 @@ func (self *SHost) syncWithCloudPrepaidVM(extVM cloudprovider.ICloudVM, host *SH } var ( - METADATA_EXT_SCHEDTAG_KEY = "ext:schedtag" - METADATA_EXT_SCHEDTAG_VALUE = "yes" + METADATA_EXT_SCHEDTAG_KEY = "ext:schedtag" ) +func (s *SHost) getAllSchedtagsWithExtSchedtagKey(ctx context.Context, userCred mcclient.TokenCredential) (map[string]*SSchedtag, error) { + q := SchedtagManager.Query().Equals("resource_type", HostManager.KeywordPlural()) + sts := make([]SSchedtag, 0, 5) + err := db.FetchModelObjects(SchedtagManager, q, &sts) + if err != nil { + return nil, err + } + stMap := make(map[string]*SSchedtag) + for i := range sts { + extTagName := sts[i].GetMetadata(METADATA_EXT_SCHEDTAG_KEY, userCred) + if len(extTagName) == 0 { + continue + } + stMap[extTagName] = &sts[i] + } + return stMap, nil +} + func (s *SHost) syncSchedtags(ctx context.Context, userCred mcclient.TokenCredential, extHost cloudprovider.ICloudHost) error { stq := SchedtagManager.Query() subq := HostschedtagManager.Query("schedtag_id").Equals("host_id", s.Id).SubQuery() @@ -1795,31 +1812,43 @@ func (s *SHost) syncSchedtags(ctx context.Context, userCred mcclient.TokenCreden removedIds := make([]string, 0) for i := range schedtags { stag := &schedtags[i] - if v := stag.GetMetadata(METADATA_EXT_SCHEDTAG_KEY, userCred); v != METADATA_EXT_SCHEDTAG_VALUE { + extTagName := stag.GetMetadata(METADATA_EXT_SCHEDTAG_KEY, userCred) + if len(extTagName) == 0 { continue } - if !extStStrSet.Has(stag.GetName()) { + if !extStStrSet.Has(extTagName) { removed = append(removed, stag) removedIds = append(removedIds, stag.GetId()) } else { - extStStrSet.Delete(stag.GetName()) + extStStrSet.Delete(extTagName) } } added := extStStrSet.UnsortedList() - for _, stStr := range added { - st := &SSchedtag{ - ResourceType: HostManager.KeywordPlural(), - } - st.DomainId = s.DomainId - st.Name = stStr - st.Description = "Sync from cloud" - err := SchedtagManager.TableSpec().Insert(ctx, st) + var stagMap map[string]*SSchedtag + if len(added) > 0 { + stagMap, err = s.getAllSchedtagsWithExtSchedtagKey(ctx, userCred) if err != nil { - return errors.Wrapf(err, "unable to create schedtag %q", stStr) + return errors.Wrap(err, "getAllSchedtagsWithExtSchedtagKey") + } + } + + for _, stStr := range added { + st, ok := stagMap[stStr] + if !ok { + st = &SSchedtag{ + ResourceType: HostManager.KeywordPlural(), + } + st.DomainId = s.DomainId + st.Name = stStr + st.Description = "Sync from cloud" + err := SchedtagManager.TableSpec().Insert(ctx, st) + if err != nil { + return errors.Wrapf(err, "unable to create schedtag %q", stStr) + } + st.SetModelManager(SchedtagManager, st) + st.SetMetadata(ctx, METADATA_EXT_SCHEDTAG_KEY, stStr, userCred) } - st.SetModelManager(SchedtagManager, st) - st.SetMetadata(ctx, METADATA_EXT_SCHEDTAG_KEY, METADATA_EXT_SCHEDTAG_VALUE, userCred) // attach hostschedtag := &SHostschedtag{ HostId: s.GetId(),