mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #6453 from ioito/hotfix/qx-azure-image-sync-optimized
fix: 优化azure image同步逻辑
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user