From 4b5f8b8d5cd0ca59efff5a466cbb3d345f3a9983 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 19 May 2020 19:33:29 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E6=8C=87=E5=AE=9A?= =?UTF-8?q?resource=20group?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudprovider/instance.go | 2 + pkg/compute/guestdrivers/managedvirtual.go | 17 ++++++ pkg/compute/models/cloudproviders.go | 10 ++++ pkg/multicloud/azure/azure.go | 65 ++++++++++++++++------ pkg/multicloud/azure/host.go | 3 + pkg/multicloud/azure/region.go | 4 ++ 6 files changed, 85 insertions(+), 16 deletions(-) diff --git a/pkg/cloudprovider/instance.go b/pkg/cloudprovider/instance.go index 6532a9c9ed..f43b6619a4 100644 --- a/pkg/cloudprovider/instance.go +++ b/pkg/cloudprovider/instance.go @@ -62,6 +62,8 @@ type SManagedVMCreateConfig struct { Account string Password string UserData string + ProjectId string + ProjectName string BillingCycle *billing.SBillingCycle } diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 630d4eb2a8..3b8d5333a8 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -73,6 +73,23 @@ func (self *SManagedVirtualizedGuestDriver) GetJsonDescAtHost(ctx context.Contex config.IpAddr = nics[0].IpAddr } + provider := host.GetCloudprovider() + projects, _ := provider.GetExternalProjects() + if projects != nil && len(projects) > 0 { + for _, project := range projects { + config.ProjectId = project.ExternalId + config.ProjectName = project.Name + if project.ProjectId == guest.ProjectId { + break + } + } + } else { + project, _ := db.TenantCacheManager.FetchById(guest.ProjectId) + if project != nil { + config.ProjectName = project.GetName() + } + } + disks := guest.GetDisks() config.DataDisks = []cloudprovider.SDiskInfo{} diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index ee04aaa6cd..95c0bd6ad2 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1597,3 +1597,13 @@ func (provider *SCloudprovider) GetChangeOwnerCandidateDomainIds() []string { } return []string{} } + +func (self *SCloudprovider) GetExternalProjects() ([]SExternalProject, error) { + q := ExternalProjectManager.Query().Equals("manager_id", self.Id) + projects := []SExternalProject{} + err := db.FetchModelObjects(ExternalProjectManager, q, &projects) + if err != nil { + return nil, errors.Wrap(err, "FetchModelObjects") + } + return projects, nil +} diff --git a/pkg/multicloud/azure/azure.go b/pkg/multicloud/azure/azure.go index ca7670e3a3..373d5ea4dc 100644 --- a/pkg/multicloud/azure/azure.go +++ b/pkg/multicloud/azure/azure.go @@ -49,10 +49,11 @@ type SAzureClient struct { domain string baseUrl string - ressourceGroups []SResourceGroup - fetchResourceGroups bool - env azureenv.Environment - authorizer autorest.Authorizer + ressourceGroups []SResourceGroup + currentResourceGroup string + fetchResourceGroups bool + env azureenv.Environment + authorizer autorest.Authorizer iregions []cloudprovider.ICloudRegion iBuckets []cloudprovider.ICloudBucket @@ -388,6 +389,27 @@ func (self *SAzureClient) PerformAction(resourceId string, action string, body s return jsonRequest(cli, "POST", self.domain, url, self.subscriptionId, body) } +func (self *SAzureClient) createAndSetResourceGroup(resourceGroup, location string) error { + cli, err := self.getDefaultClient() + if err != nil { + return errors.Wrap(err, "getDefaultClient") + } + //Create Default resourceGroup + _url := fmt.Sprintf("/subscriptions/%s/resourcegroups/%s", self.subscriptionId, resourceGroup) + body, err := jsonRequest(cli, "PUT", self.domain, _url, self.subscriptionId, fmt.Sprintf(`{"name": "%s", "location": "%s"}`, resourceGroup, location)) + if err != nil { + return err + } + group := SResourceGroup{} + err = body.Unmarshal(&resourceGroup) + if err != nil { + return err + } + self.ressourceGroups = []SResourceGroup{group} + self.currentResourceGroup = resourceGroup + return nil +} + func (self *SAzureClient) fetchResourceGroup(cli *autorest.Client, location string) error { if !self.fetchResourceGroups { err := self.List("resourcegroups", &self.ressourceGroups) @@ -398,18 +420,9 @@ func (self *SAzureClient) fetchResourceGroup(cli *autorest.Client, location stri self.fetchResourceGroups = true } if len(self.ressourceGroups) == 0 { - //Create Default resourceGroup - _url := fmt.Sprintf("/subscriptions/%s/resourcegroups/Default", self.subscriptionId) - body, err := jsonRequest(cli, "PUT", self.domain, _url, self.subscriptionId, fmt.Sprintf(`{"name": "Default", "location": "%s"}`, location)) - if err != nil { - return err - } - resourceGroup := SResourceGroup{} - err = body.Unmarshal(&resourceGroup) - if err != nil { - return err - } - self.ressourceGroups = []SResourceGroup{resourceGroup} + return self.createAndSetResourceGroup("Default", location) + } else { + self.currentResourceGroup = self.ressourceGroups[0].Name } return nil } @@ -464,6 +477,26 @@ func (self *SAzureClient) getUniqName(cli *autorest.Client, resourceType, name s return "", "", fmt.Errorf("not find uniq name for %s[%s]", resourceType, name) } +func (self *SAzureClient) CreateAndSetResourceGroup(resourceGroup, location string) error { + cli, err := self.getDefaultClient() + if err != nil { + return errors.Wrap(err, "getDefaultClient") + } + if !self.fetchResourceGroups { + err := self.fetchResourceGroup(cli, location) + if err != nil { + return errors.Wrap(err, "fetchResourceGroup") + } + } + for _, group := range self.ressourceGroups { + if group.Name == resourceGroup { + self.currentResourceGroup = resourceGroup + return nil + } + } + return self.createAndSetResourceGroup(resourceGroup, location) +} + func (self *SAzureClient) Create(body jsonutils.JSONObject, retVal interface{}) error { cli, err := self.getDefaultClient() if err != nil { diff --git a/pkg/multicloud/azure/host.go b/pkg/multicloud/azure/host.go index ad8bf8cef0..c3989f35dc 100644 --- a/pkg/multicloud/azure/host.go +++ b/pkg/multicloud/azure/host.go @@ -146,6 +146,9 @@ func (self *SHost) _createVM(desc *cloudprovider.SManagedVMCreateConfig, nicId s if len(computeName) > 15 { computeName = computeName[:15] } + if len(desc.ProjectName) > 0 { + self.zone.region.CreateAndSetResourceGroup(desc.ProjectName) + } instance := SInstance{ Name: desc.Name, Location: self.zone.region.Name, diff --git a/pkg/multicloud/azure/region.go b/pkg/multicloud/azure/region.go index eec9752dbd..29f8a0bd79 100644 --- a/pkg/multicloud/azure/region.go +++ b/pkg/multicloud/azure/region.go @@ -689,3 +689,7 @@ func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket func (region *SRegion) GetCapabilities() []string { return region.client.GetCapabilities() } + +func (region *SRegion) CreateAndSetResourceGroup(resourceGroup string) error { + return region.client.CreateAndSetResourceGroup(resourceGroup, region.Name) +} From f9b1466f4491159931371597114e8c7b4882c476 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 19 May 2020 20:45:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E5=85=AC=E6=9C=89?= =?UTF-8?q?=E4=BA=91=E6=8C=87=E5=AE=9A=E8=B5=84=E6=BA=90=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/managedvirtual.go | 9 +++--- pkg/hostman/hostdeployer/apis/deploy.pb.go | 3 +- pkg/multicloud/azure/azure.go | 32 +++++++--------------- pkg/multicloud/azure/host.go | 11 ++++++-- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 3b8d5333a8..eee3760d25 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -75,15 +75,16 @@ func (self *SManagedVirtualizedGuestDriver) GetJsonDescAtHost(ctx context.Contex provider := host.GetCloudprovider() projects, _ := provider.GetExternalProjects() - if projects != nil && len(projects) > 0 { + if projects != nil { for _, project := range projects { - config.ProjectId = project.ExternalId - config.ProjectName = project.Name if project.ProjectId == guest.ProjectId { + config.ProjectId = project.ExternalId + config.ProjectName = project.Name break } } - } else { + } + if len(config.ProjectName) == 0 { project, _ := db.TenantCacheManager.FetchById(guest.ProjectId) if project != nil { config.ProjectName = project.GetName() diff --git a/pkg/hostman/hostdeployer/apis/deploy.pb.go b/pkg/hostman/hostdeployer/apis/deploy.pb.go index 6c4f358b25..3522372d20 100644 --- a/pkg/hostman/hostdeployer/apis/deploy.pb.go +++ b/pkg/hostman/hostdeployer/apis/deploy.pb.go @@ -6,11 +6,12 @@ package apis import ( context "context" fmt "fmt" + math "math" + proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - math "math" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/pkg/multicloud/azure/azure.go b/pkg/multicloud/azure/azure.go index 373d5ea4dc..fa0958e02c 100644 --- a/pkg/multicloud/azure/azure.go +++ b/pkg/multicloud/azure/azure.go @@ -394,18 +394,12 @@ func (self *SAzureClient) createAndSetResourceGroup(resourceGroup, location stri if err != nil { return errors.Wrap(err, "getDefaultClient") } - //Create Default resourceGroup + //Create resourceGroup _url := fmt.Sprintf("/subscriptions/%s/resourcegroups/%s", self.subscriptionId, resourceGroup) - body, err := jsonRequest(cli, "PUT", self.domain, _url, self.subscriptionId, fmt.Sprintf(`{"name": "%s", "location": "%s"}`, resourceGroup, location)) + _, err = jsonRequest(cli, "PUT", self.domain, _url, self.subscriptionId, fmt.Sprintf(`{"name": "%s", "location": "%s"}`, resourceGroup, location)) if err != nil { return err } - group := SResourceGroup{} - err = body.Unmarshal(&resourceGroup) - if err != nil { - return err - } - self.ressourceGroups = []SResourceGroup{group} self.currentResourceGroup = resourceGroup return nil } @@ -419,11 +413,6 @@ func (self *SAzureClient) fetchResourceGroup(cli *autorest.Client, location stri } self.fetchResourceGroups = true } - if len(self.ressourceGroups) == 0 { - return self.createAndSetResourceGroup("Default", location) - } else { - self.currentResourceGroup = self.ressourceGroups[0].Name - } return nil } @@ -456,7 +445,7 @@ func (e *AzureError) Error() string { } func (self *SAzureClient) getUniqName(cli *autorest.Client, resourceType, name string, body jsonutils.JSONObject) (string, string, error) { - url := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s", self.subscriptionId, self.ressourceGroups[0].Name, resourceType, name) + url := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s", self.subscriptionId, self.currentResourceGroup, resourceType, name) if _, err := jsonRequest(cli, "GET", self.domain, url, self.subscriptionId, ""); err != nil { if err == cloudprovider.ErrNotFound { return url, body.String(), nil @@ -464,7 +453,7 @@ func (self *SAzureClient) getUniqName(cli *autorest.Client, resourceType, name s return "", "", err } for i := 0; i < 20; i++ { - url = fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s-%d", self.subscriptionId, self.ressourceGroups[0].Name, resourceType, name, i) + url = fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s-%d", self.subscriptionId, self.currentResourceGroup, resourceType, name, i) if _, err := jsonRequest(cli, "GET", self.domain, url, self.subscriptionId, ""); err == cloudprovider.ErrNotFound { if err == cloudprovider.ErrNotFound { data := body.(*jsonutils.JSONDict) @@ -489,7 +478,7 @@ func (self *SAzureClient) CreateAndSetResourceGroup(resourceGroup, location stri } } for _, group := range self.ressourceGroups { - if group.Name == resourceGroup { + if strings.ToLower(group.Name) == strings.ToLower(resourceGroup) { self.currentResourceGroup = resourceGroup return nil } @@ -509,12 +498,11 @@ func (self *SAzureClient) Create(body jsonutils.JSONObject, retVal interface{}) if err != nil { return fmt.Errorf("Azure create resource failed: %s", err.Error()) } - err = self.fetchResourceGroup(cli, params["location"]) - if err != nil { - return err - } - if len(self.ressourceGroups) == 0 { - return fmt.Errorf("Create Default resourceGroup error?") + if len(self.currentResourceGroup) == 0 { + err = self.CreateAndSetResourceGroup("Default", params["location"]) + if err != nil { + return errors.Wrap(err, "CreateAndSetResourceGroup") + } } url, reqString, err := self.getUniqName(cli, params["type"], params["name"], body) diff --git a/pkg/multicloud/azure/host.go b/pkg/multicloud/azure/host.go index c3989f35dc..8f4f22fd70 100644 --- a/pkg/multicloud/azure/host.go +++ b/pkg/multicloud/azure/host.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/osprofile" "yunion.io/x/pkg/utils" @@ -86,6 +87,13 @@ func (self *SHost) searchNetorkInterface(IPAddr string, networkId string, secgro } func (self *SHost) CreateVM(desc *cloudprovider.SManagedVMCreateConfig) (cloudprovider.ICloudVM, error) { + if len(desc.ProjectName) > 0 { + err := self.zone.region.CreateAndSetResourceGroup(desc.ProjectName) + if err != nil { + return nil, errors.Wrapf(err, "CreateAndSetResourceGroup(%s)", desc.ProjectName) + } + } + net := self.zone.getNetworkById(desc.ExternalNetworkId) if net == nil { return nil, fmt.Errorf("invalid network ID %s", desc.ExternalNetworkId) @@ -146,9 +154,6 @@ func (self *SHost) _createVM(desc *cloudprovider.SManagedVMCreateConfig, nicId s if len(computeName) > 15 { computeName = computeName[:15] } - if len(desc.ProjectName) > 0 { - self.zone.region.CreateAndSetResourceGroup(desc.ProjectName) - } instance := SInstance{ Name: desc.Name, Location: self.zone.region.Name,