From f8fa51bad16c345cdbfec8685d9735cd1f0b026f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 30 Aug 2023 20:30:26 +0800 Subject: [PATCH] fix(region): esxi name and tag sync (#17884) --- go.mod | 2 +- go.sum | 4 +- pkg/compute/guestdrivers/esxi.go | 4 -- vendor/modules.txt | 2 +- .../pkg/multicloud/esxi/virtualmachine.go | 70 ++++++++++++++++++- 5 files changed, 71 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index d2eae99f14..4d9385e463 100644 --- a/go.mod +++ b/go.mod @@ -83,7 +83,7 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230829080506-5b975c64c67c + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230830094721-0de402b6b61e yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19 yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361 diff --git a/go.sum b/go.sum index 8b110e56d0..98d255f698 100644 --- a/go.sum +++ b/go.sum @@ -1174,8 +1174,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230829080506-5b975c64c67c h1:QVorptnv2PtZPQEEbFl4kugZrC/g9HsBOwTr2ufwQ/0= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230829080506-5b975c64c67c/go.mod h1:2sgCN7nRPQL3woLfdgqLDd92vwAHqtlz3KKiHxC5BAw= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230830094721-0de402b6b61e h1:ZzUdPfGtUTtRnObm1VV3/tdNwnvoLwJwM5vAYiE+Zs0= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230830094721-0de402b6b61e/go.mod h1:2sgCN7nRPQL3woLfdgqLDd92vwAHqtlz3KKiHxC5BAw= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index c004cc27c3..73699906aa 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -780,7 +780,3 @@ func (self *SESXiGuestDriver) StartDeleteGuestTask(ctx context.Context, userCred params.Add(jsonutils.JSONTrue, "delete_snapshots") return self.SBaseGuestDriver.StartDeleteGuestTask(ctx, userCred, guest, params, parentTaskId) } - -func (self *SESXiGuestDriver) RequestRemoteUpdate(ctx context.Context, guest *models.SGuest, userCred mcclient.TokenCredential, replaceTags bool) error { - return nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index ce2446b686..b3d5ba2655 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1437,7 +1437,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230829080506-5b975c64c67c +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230830094721-0de402b6b61e ## explicit; go 1.18 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/virtualmachine.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/virtualmachine.go index 68ab75f421..5307a98fbd 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/virtualmachine.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/virtualmachine.go @@ -124,19 +124,83 @@ func (svm *SVirtualMachine) GetTags() (map[string]string, error) { }{} jsonutils.Update(&value, val) _, ok := ret[value.Key] - if ok { + if ok && len(value.Value) > 0 { result[ret[value.Key]] = value.Value } } for _, key := range ret { _, ok := result[key] if !ok { - result[key] = "" + delete(result, key) } } return result, nil } +func (svm *SVirtualMachine) SetTags(tags map[string]string, replace bool) error { + oldTags, err := svm.GetTags() + if err != nil { + return errors.Wrapf(err, "GetTags") + } + + added, removed := map[string]string{}, map[string]string{} + for k, v := range tags { + oldValue, ok := oldTags[k] + if !ok { + added[k] = v + } else if oldValue != v { + removed[k] = oldValue + added[k] = v + } + } + if replace { + for k, v := range oldTags { + newValue, ok := tags[k] + if !ok { + removed[k] = v + } else if v != newValue { + added[k] = newValue + removed[k] = v + } + } + } + + cfm := object.NewCustomFieldsManager(svm.manager.client.Client) + ctx := context.Background() + + for k := range removed { + id, err := cfm.FindKey(ctx, k) + if err != nil { + if !strings.Contains(err.Error(), "not found") { + return errors.Wrapf(err, "FindKey %s", k) + } + continue + } + err = cfm.Set(ctx, svm.object.Reference(), id, "") + if err != nil { + return errors.Wrapf(err, "Set") + } + } + for k, v := range added { + id, err := cfm.FindKey(ctx, k) + if err != nil { + if !strings.Contains(err.Error(), "not found") { + return errors.Wrapf(err, "FindKey %s", k) + } + ref, err := cfm.Add(ctx, k, "VirtualMachine", nil, nil) + if err != nil { + return errors.Wrapf(err, "Add %s", k) + } + id = ref.Key + } + err = cfm.Set(ctx, svm.object.Reference(), id, v) + if err != nil { + return errors.Wrapf(err, "Set") + } + } + return nil +} + func (svm *SVirtualMachine) getVirtualMachine() *mo.VirtualMachine { return svm.object.(*mo.VirtualMachine) } @@ -231,7 +295,7 @@ func (svm *SVirtualMachine) rebuildDisk(ctx context.Context, disk *SVirtualDisk, } func (svm *SVirtualMachine) UpdateVM(ctx context.Context, name string) error { - return cloudprovider.ErrNotImplemented + return svm.DoRename(ctx, name) } // TODO: detach disk to a separate directory, so as to keep disk independent of VM