Skip to content

Commit

Permalink
fix: 优化azure image同步逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
Qu Xuan committed May 19, 2020
1 parent 1bb2ef9 commit b180354
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 25 deletions.
64 changes: 46 additions & 18 deletions pkg/multicloud/azure/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -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}, "/")
Expand Down Expand Up @@ -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)
Expand All @@ -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
}
Expand Down
104 changes: 97 additions & 7 deletions pkg/multicloud/azure/publisher.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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, " "))
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand Down

0 comments on commit b180354

Please sign in to comment.