diff --git a/go.mod b/go.mod index f434a2e618..ca3a8b969d 100644 --- a/go.mod +++ b/go.mod @@ -81,7 +81,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.20221228030216-7840b7140ffa + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221229033822-9125be57abc8 yunion.io/x/executor v0.0.0-20211018100936-39a2cd966656 yunion.io/x/jsonutils v1.0.1-0.20220819091305-3bab322ab4fd yunion.io/x/log v1.0.0 diff --git a/go.sum b/go.sum index d76fa7c67c..66fd6d0125 100644 --- a/go.sum +++ b/go.sum @@ -1158,8 +1158,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.20221228030216-7840b7140ffa h1:w31Dhfg8D9fufpOP3WD15VpIKBQnBqGGB/kVUkYgH0M= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221228030216-7840b7140ffa/go.mod h1:yEMFtIKPyIdIfPzsw7oTcH41JXc8G5StUAQw3ZoGj5I= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221229033822-9125be57abc8 h1:mwfMHctVw2QGMIt9HWgY8BshxB1vXXxJtBqXtJ8Lm1g= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221229033822-9125be57abc8/go.mod h1:yEMFtIKPyIdIfPzsw7oTcH41JXc8G5StUAQw3ZoGj5I= yunion.io/x/executor v0.0.0-20211018100936-39a2cd966656 h1:0zlZD5uhZoIHgLVAWCz2aHaYk2ZrNsACCYD7R6EIBII= yunion.io/x/executor v0.0.0-20211018100936-39a2cd966656/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/models/external_projects.go b/pkg/compute/models/external_projects.go index 135b265f8a..b52c5a30b5 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -267,7 +267,42 @@ func (self *SExternalProject) SyncWithCloudProject(ctx context.Context, userCred } return nil } - if account.AutoCreateProject && options.Options.EnableAutoRenameProject { + pm, _ := account.GetProjectMapping() + if pm != nil && pm.Enabled.IsTrue() && pm.IsNeedProjectSync() && self.ProjectSrc != string(apis.OWNER_SOURCE_LOCAL) { + extTags, err := ext.GetTags() + if err != nil { + return errors.Wrapf(err, "extModel.GetTags") + } + find := false + if pm.Rules != nil { + for _, rule := range *pm.Rules { + domainId, projectId, newProj, isMatch := rule.IsMatchTags(extTags) + if isMatch && len(newProj) > 0 { + domainId, projectId, err = account.getOrCreateTenant(context.TODO(), newProj, "", "", "auto create from tag") + if err != nil { + log.Errorf("getOrCreateTenant(%s) error: %v", newProj, err) + continue + } + if len(domainId) > 0 && len(projectId) > 0 { + self.DomainId = domainId + self.ProjectId = projectId + find = true + break + } + } + } + } + if !find && account.AutoCreateProject { + desc := fmt.Sprintf("auto create from cloud project %s (%s)", self.Name, self.ExternalId) + domainId, projectId, err := account.getOrCreateTenant(ctx, self.Name, self.DomainId, "", desc) + if err != nil { + log.Errorf("failed to get or create tenant %s(%s) %v", self.Name, self.ExternalId, err) + } else { + self.DomainId = domainId + self.ProjectId = projectId + } + } + } else if account.AutoCreateProject && options.Options.EnableAutoRenameProject { tenant, err := db.TenantCacheManager.FetchTenantById(ctx, self.ProjectId) if err != nil { return errors.Wrapf(err, "TenantCacheManager.FetchTenantById(%s)", self.ProjectId) diff --git a/vendor/modules.txt b/vendor/modules.txt index 68bba9d0df..d94cdaf21c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1439,7 +1439,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.20221228030216-7840b7140ffa +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221229033822-9125be57abc8 ## 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/azure/azure.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/azure.go index 9f72d1de8e..cf333f79e1 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/azure.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/azure/azure.go @@ -977,8 +977,8 @@ func getResourceGroup(id string) string { break } } - if idx > 0 && idx < len(info)-1 { - return fmt.Sprintf("%s/%s", info[1], info[idx]) + if idx > 0 && idx < len(info)-2 { + return fmt.Sprintf("%s/%s", info[2], info[idx]) } return "" } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/monitor.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/monitor.go index 37aa2652ec..c9c74ebd1f 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/monitor.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/monitor.go @@ -96,12 +96,12 @@ func (self *SESXiClient) getEcsMetrics(metricName string, metricType cloudprovid sample, err := perfManager.Query(self.context, queries) if err != nil { - return nil, err + return nil, errors.Wrap(err, "Query") } result, err := perfManager.ToMetricSeries(self.context, sample) if err != nil { - return nil, err + return nil, errors.Wrap(err, "ToMetricSeries") } ret := []cloudprovider.MetricValues{} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/storagecache.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/storagecache.go index 4eb9927528..019293476b 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/storagecache.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/storagecache.go @@ -155,7 +155,7 @@ func (self *SDatastoreImageCache) GetIImageInImagecache() ([]cloudprovider.IClou var ErrTimeConsuming = errors.Error("time consuming") func (self *SDatastoreImageCache) getTemplateVMsFromCache() ([]*SVirtualMachine, error) { - ihosts, err := self.datastore.datacenter.GetIHosts() + ihosts, err := self.datastore.getCachedAttachedHosts() if err != nil { return nil, err } 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 ea6c255f8a..a481797dc9 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/virtualmachine.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/esxi/virtualmachine.go @@ -53,7 +53,7 @@ var ( vmLayoutExProps = []string{"layoutEx.file"} ) -var VIRTUAL_MACHINE_PROPS = []string{"name", "parent", "resourcePool", "snapshot", "config", "availableField"} +var VIRTUAL_MACHINE_PROPS = []string{"name", "parent", "resourcePool", "snapshot", "config", "availableField", "datastore"} func init() { VIRTUAL_MACHINE_PROPS = append(VIRTUAL_MACHINE_PROPS, vmSummaryProps...) @@ -1588,3 +1588,32 @@ func (self *SVirtualMachine) ResetToInstanceSnapshot(ctx context.Context, idStr } return object.NewTask(self.manager.client.Client, res.Returnval).Wait(ctx) } + +func (vm *SVirtualMachine) GetDatastores() ([]*SDatastore, error) { + dsList := make([]*SDatastore, 0) + dss := vm.getVirtualMachine().Datastore + for i := range dss { + var moStore mo.Datastore + err := vm.manager.reference2Object(dss[i].Reference(), DATASTORE_PROPS, &moStore) + if err != nil { + log.Errorf("datastore reference2Object %s", err) + return nil, errors.Wrap(err, "reference2Object") + } + ds := NewDatastore(vm.manager, &moStore, vm.datacenter) + dsList = append(dsList, ds) + } + return dsList, nil +} + +func (vm *SVirtualMachine) GetDatastoreNames() []string { + dss, err := vm.GetDatastores() + if err != nil { + log.Errorf("GetDatastores fail %s", err) + return nil + } + names := make([]string, 0, len(dss)) + for i := range dss { + names = append(names, dss[i].GetName()) + } + return names +}