From b18035442ef8ebcca81a192bbb37f4a2371b40b3 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 19 May 2020 16:11:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96azure=20image=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/multicloud/azure/image.go | 64 ++++++++++++------ pkg/multicloud/azure/publisher.go | 104 ++++++++++++++++++++++++++++-- 2 files changed, 143 insertions(+), 25 deletions(-) diff --git a/pkg/multicloud/azure/image.go b/pkg/multicloud/azure/image.go index 45a92b2e8d..6330b75fab 100644 --- a/pkg/multicloud/azure/image.go +++ b/pkg/multicloud/azure/image.go @@ -341,21 +341,21 @@ func (self *SRegion) GetOfferedImageIDs(publishersFilter []string, offersFilter for _, publisher := range publishers { offers, err := self.getImageOffers(publisher, toLowerStringArray(offersFilter)) if err != nil { - return nil, err + log.Errorf("failed to found offers for publisher %s error: %v", publisher, err) + continue } for _, offer := range offers { skus, err := self.getImageSkus(publisher, offer, toLowerStringArray(skusFilter)) if err != nil { - return nil, err + log.Errorf("failed to found skus for publisher %s offer %s error: %v", publisher, offer, err) + continue } for _, sku := range skus { verFilter = toLowerStringArray(verFilter) - vers, err := self.getImageVersions(publisher, offer, sku, verFilter) + vers, err := self.getImageVersions(publisher, offer, sku, verFilter, latestVer) if err != nil { - return nil, err - } - if latestVer && len(vers) > 0 { - vers = []string{vers[len(vers)-1]} + log.Errorf("failed to found publisher %s offer %s sku %s version error: %v", publisher, offer, sku, err) + continue } for _, ver := range vers { idStr := strings.Join([]string{publisher, offer, sku, ver}, "/") @@ -463,27 +463,51 @@ func (region *SRegion) GetImagePublishers(filter []string) ([]string, error) { } func (region *SRegion) getImageOffers(publisher string, filter []string) ([]string, error) { - offsers := make([]SAzureImageResource, 0) - err := region.client.ListResources(fmt.Sprintf("Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers", region.Name, publisher), &offsers, nil) + ret := make([]string, 0) + if driver, ok := publisherDrivers[strings.ToLower(publisher)]; ok { + offers := driver.GetOffers() + if len(offers) > 0 { + for _, offer := range offers { + if len(filter) == 0 || utils.IsInStringArray(strings.ToLower(offer), filter) { + ret = append(ret, offer) + } + } + return offers, nil + } + } else { + log.Warningf("failed to get publisher %s driver", publisher) + } + offers := make([]SAzureImageResource, 0) + err := region.client.ListResources(fmt.Sprintf("Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers", region.Name, publisher), &offers, nil) if err != nil { return nil, err } - ret := make([]string, 0) - for i := range offsers { - if len(filter) == 0 || utils.IsInStringArray(strings.ToLower(offsers[i].Name), filter) { - ret = append(ret, offsers[i].Name) + for i := range offers { + if len(filter) == 0 || utils.IsInStringArray(strings.ToLower(offers[i].Name), filter) { + ret = append(ret, offers[i].Name) } } return ret, nil } -func (region *SRegion) getImageSkus(publisher string, offser string, filter []string) ([]string, error) { +func (region *SRegion) getImageSkus(publisher string, offer string, filter []string) ([]string, error) { + ret := make([]string, 0) + if driver, ok := publisherDrivers[strings.ToLower(publisher)]; ok { + skus := driver.GetSkus(offer) + if len(skus) > 0 { + for _, sku := range skus { + if len(filter) == 0 || utils.IsInStringArray(strings.ToLower(sku), filter) { + ret = append(ret, sku) + } + } + return ret, nil + } + } skus := make([]SAzureImageResource, 0) - err := region.client.ListResources(fmt.Sprintf("Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers/%s/skus", region.Name, publisher, offser), &skus, nil) + err := region.client.ListResources(fmt.Sprintf("Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers/%s/skus", region.Name, publisher, offer), &skus, nil) if err != nil { return nil, err } - ret := make([]string, 0) for i := range skus { if len(filter) == 0 || utils.IsInStringArray(strings.ToLower(skus[i].Name), filter) { ret = append(ret, skus[i].Name) @@ -492,9 +516,13 @@ func (region *SRegion) getImageSkus(publisher string, offser string, filter []st return ret, nil } -func (region *SRegion) getImageVersions(publisher string, offer string, sku string, filter []string) ([]string, error) { +func (region *SRegion) getImageVersions(publisher string, offer string, sku string, filter []string, latestVer bool) ([]string, error) { vers := make([]SAzureImageResource, 0) - err := region.client.ListResources(fmt.Sprintf("Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers/%s/skus/%s/versions", region.Name, publisher, offer, sku), &vers, nil) + resource := fmt.Sprintf("Microsoft.Compute/locations/%s/publishers/%s/artifacttypes/vmimage/offers/%s/skus/%s/versions", region.Name, publisher, offer, sku) + if latestVer { + resource = resource + "?$top=1&$orderby=name%20desc" + } + err := region.client.ListResources(resource, &vers, nil) if err != nil { return nil, err } diff --git a/pkg/multicloud/azure/publisher.go b/pkg/multicloud/azure/publisher.go index 47ae996163..ab6cfd2fe0 100644 --- a/pkg/multicloud/azure/publisher.go +++ b/pkg/multicloud/azure/publisher.go @@ -21,6 +21,8 @@ import ( type SPublisherDriver struct { OsType string + GetOffers func() []string + GetSkus func(offer string) []string GetOsDist func(offser, sku, version string) string GetOsVersion func(offser, sku, version string) string GetOsArch func(offser, sku, version string) string @@ -29,8 +31,19 @@ type SPublisherDriver struct { var publisherDrivers = map[string]SPublisherDriver{ // Microsoft Windows Server - "MicrosoftWindowsServer": { + "microsoftwindowsserver": { OsType: "Windows", + GetOffers: func() []string { + return []string{"WindowsServer", "2019-Datacenter"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "WindowsServer": + return []string{"2016-Datacenter", "2019-Datacenter"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { parts := strings.Split(sku, "-") return fmt.Sprintf("Windows Server %s", strings.Join(parts, " ")) @@ -47,8 +60,19 @@ var publisherDrivers = map[string]SPublisherDriver{ }, }, // RHEL - "RedHat": { + "redhat": { OsType: "Linux", + GetOffers: func() []string { + return []string{"rhel-75"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "rhel-75": + return []string{"standard"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "RHEL" }, @@ -63,8 +87,19 @@ var publisherDrivers = map[string]SPublisherDriver{ }, }, // Ubuntu - "Canonical": { + "canonical": { OsType: "Linux", + GetOffers: func() []string { + return []string{"UbuntuServer"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "UbuntuServer": + return []string{"14.04.5-LTS", "16.04-LTS", "17.10", "18.04-LTS", "18_04-lts-gen2", "19.04", "19_04-gen2"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "Ubuntu" }, @@ -79,8 +114,19 @@ var publisherDrivers = map[string]SPublisherDriver{ }, }, // CentOS - "OpenLogic": { + "openlogic": { OsType: "Linux", + GetOffers: func() []string { + return []string{"CentOS"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "CentOS": + return []string{"6.9", "7.3", "7.4", "7.5", "7.6", "7.7", "8.0", "7_4-gen2", "7_5-gen2", "7_6-gen2", "7_7-gen2", "8_0-gen2", "8_1-gen2"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "CentOS" }, @@ -95,8 +141,19 @@ var publisherDrivers = map[string]SPublisherDriver{ }, }, // SUSE - "SUSE": { + "suse": { OsType: "Linux", + GetOffers: func() []string { + return []string{"SLES"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "SLES": + return []string{"12-SP4", "12-SP4-gen2"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "SUSE" }, @@ -111,8 +168,19 @@ var publisherDrivers = map[string]SPublisherDriver{ }, }, // CoreOS - "CoreOS": { + "coreos": { OsType: "Linux", + GetOffers: func() []string { + return []string{"CoreOS"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "CoreOS": + return []string{"Alpha", "Beta", "Stable"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "CoreOS" }, @@ -129,6 +197,17 @@ var publisherDrivers = map[string]SPublisherDriver{ // Debian "credativ": { OsType: "Linux", + GetOffers: func() []string { + return []string{"Debian"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "Debian": + return []string{"8", "9"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "Debian" }, @@ -143,8 +222,19 @@ var publisherDrivers = map[string]SPublisherDriver{ }, }, // FreeBSD - "MicrosoftOSTC": { + "microsoftostc": { OsType: "FreeBSD", + GetOffers: func() []string { + return []string{"FreeBSD"} + }, + GetSkus: func(offer string) []string { + switch offer { + case "FreeBSD": + return []string{"10.4", "11.2", "12.0"} + default: + return []string{} + } + }, GetOsDist: func(offer, sku, version string) string { return "FreeBSD" },