imageowners.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package aws
  15. import (
  16. "fmt"
  17. "regexp"
  18. "strconv"
  19. "strings"
  20. "yunion.io/x/pkg/util/regutils"
  21. "yunion.io/x/cloudmux/pkg/cloudprovider"
  22. )
  23. func getSystemOwnerIds() []string {
  24. keys := make([]string, len(awsImagePublishers))
  25. idx := 0
  26. for key := range awsImagePublishers {
  27. keys[idx] = key
  28. idx += 1
  29. }
  30. return keys
  31. }
  32. func imageOwnerTypes2Strings(owners []TImageOwnerType, rawIds []string) []string {
  33. ownerIds := make([]string, 0)
  34. for i := range owners {
  35. switch owners[i] {
  36. case ImageOwnerTypeSelf:
  37. ownerIds = append(ownerIds, "self")
  38. case ImageOwnerTypeSystem:
  39. sysOwnerIds := getSystemOwnerIds()
  40. ownerIds = append(ownerIds, sysOwnerIds...)
  41. }
  42. }
  43. ownerIds = append(ownerIds, rawIds...)
  44. return ownerIds
  45. }
  46. type SAWSImagePublisherInfo struct {
  47. GetOSType func(image SImage) string
  48. GetOSDist func(image SImage) string
  49. GetOSVersion func(image SImage) string
  50. GetOSBuildID func(image SImage) string
  51. CompareBuilds func(v1, v2 string) int
  52. }
  53. var rhel = SAWSImagePublisherInfo{
  54. GetOSType: func(image SImage) string {
  55. return "Linux"
  56. },
  57. GetOSDist: func(image SImage) string {
  58. return "RHEL"
  59. },
  60. GetOSVersion: func(image SImage) string {
  61. parts := strings.Split(image.ImageName, "-")
  62. if len(parts) >= 2 {
  63. parts = strings.Split(parts[1], "_")
  64. version := strings.Split(parts[0], ".")
  65. if len(version) >= 2 {
  66. return fmt.Sprintf("%s.%s", version[0], version[1])
  67. }
  68. return parts[0]
  69. }
  70. return ""
  71. },
  72. GetOSBuildID: func(image SImage) string {
  73. parts := strings.Split(image.ImageName, "-")
  74. if len(parts) >= 2 {
  75. return parts[2] + image.CreationTime.Format("20060102150405")
  76. }
  77. return ""
  78. },
  79. }
  80. var (
  81. debianDatePattern = regexp.MustCompile(`-\d{4}-\d{2}-\d{2}-`)
  82. )
  83. var debian = SAWSImagePublisherInfo{
  84. GetOSType: func(image SImage) string {
  85. return "Linux"
  86. },
  87. GetOSDist: func(image SImage) string {
  88. return "Debian"
  89. },
  90. GetOSVersion: func(image SImage) string {
  91. parts := strings.Split(image.ImageName, "-")
  92. if len(parts) >= 5 {
  93. return parts[1]
  94. }
  95. return ""
  96. },
  97. GetOSBuildID: func(image SImage) string {
  98. dateStr := debianDatePattern.FindString(image.ImageName)
  99. if len(dateStr) > 2 {
  100. return dateStr[1 : len(dateStr)-1]
  101. }
  102. return ""
  103. },
  104. }
  105. var (
  106. centosDatePattern = regexp.MustCompile(`\s+\d{4,8}(_\d+)?`)
  107. )
  108. var centos = SAWSImagePublisherInfo{
  109. GetOSType: func(image SImage) string {
  110. return "Linux"
  111. },
  112. GetOSDist: func(image SImage) string {
  113. if strings.Index(image.ImageName, "Atomic") > 0 {
  114. return "CentOS Atomic"
  115. } else {
  116. return "CentOS"
  117. }
  118. },
  119. GetOSVersion: func(image SImage) string {
  120. parts := strings.Split(image.ImageName, " ")
  121. if strings.Index(image.ImageName, "Atomic") > 0 {
  122. if regutils.MatchInteger(parts[3]) {
  123. return parts[3]
  124. } else {
  125. return "7"
  126. }
  127. } else if strings.HasPrefix(image.ImageName, "CentOS Linux ") {
  128. return parts[2]
  129. } else {
  130. return parts[1]
  131. }
  132. },
  133. GetOSBuildID: func(image SImage) string {
  134. build := centosDatePattern.FindString(image.ImageName)
  135. build = strings.TrimSpace(build)
  136. if strings.HasPrefix(build, "201") {
  137. build = build[2:]
  138. }
  139. return build
  140. },
  141. }
  142. var ubuntuReleases = map[string]string{
  143. "warty": "4.10",
  144. "hoary": "5.04",
  145. "breezy": "5.10",
  146. "dapper": "6.06",
  147. "edgy": "6.10",
  148. "feisty": "7.04",
  149. "gutsy": "7.10",
  150. "hardy": "8.04",
  151. "intrepid": "8.10",
  152. "jaunty": "9.04",
  153. "karmic": "9.10",
  154. "lucid": "10.04",
  155. "maverick": "10.10",
  156. "natty": "11.04",
  157. "oneiric": "11.10",
  158. "precise": "12.04",
  159. "quantal": "12.10",
  160. "raring": "13.04",
  161. "saucy": "13.10",
  162. "trusty": "14.04",
  163. "utopic": "14.10",
  164. "vivid": "15.04",
  165. "wily": "15.10",
  166. "xenial": "16.04",
  167. "yakkety": "16.10",
  168. "zesty": "17.04",
  169. "artful": "17.10",
  170. "bionic": "18.04",
  171. "cosmic": "18.10",
  172. "disco": "19.04",
  173. "focal": "20.04",
  174. "jammy": "22.04",
  175. "lunar": "23.04",
  176. }
  177. var ubuntuReleasePattern = regexp.MustCompile(`-\d+\.\d+-`)
  178. var ubuntu = SAWSImagePublisherInfo{
  179. GetOSType: func(image SImage) string {
  180. return "Linux"
  181. },
  182. GetOSDist: func(image SImage) string {
  183. if strings.HasPrefix(image.ImageName, "ubuntu-minimal/") {
  184. return "Ubuntu Minimal"
  185. }
  186. if strings.HasPrefix(image.ImageName, "ubuntu/") {
  187. return "Ubuntu"
  188. }
  189. if strings.HasPrefix(image.ImageName, "ubuntu-rolling-") || strings.HasPrefix(image.ImageName, "ubuntu-core") || strings.Index(image.ImageName, "core-edge") > 0 {
  190. return "Ubuntu Core"
  191. }
  192. return "Ubuntu"
  193. },
  194. GetOSVersion: func(image SImage) string {
  195. relStr := ubuntuReleasePattern.FindString(image.ImageName)
  196. if len(relStr) > 2 {
  197. return relStr[1 : len(relStr)-1]
  198. }
  199. parts := strings.Split(image.ImageName, "/")
  200. if len(parts) >= 4 {
  201. parts = strings.Split(parts[3], "-")
  202. if len(parts) >= 2 {
  203. relName := strings.ToLower(parts[1])
  204. if _, ok := ubuntuReleases[relName]; ok {
  205. return ubuntuReleases[relName]
  206. } else {
  207. return relName
  208. }
  209. }
  210. }
  211. if strings.HasPrefix(image.ImageName, "ubuntu-rolling-") {
  212. parts := strings.Split(image.ImageName, "-")
  213. if len(parts) > 3 {
  214. return strings.ToLower(parts[2])
  215. }
  216. }
  217. return ""
  218. },
  219. GetOSBuildID: func(image SImage) string {
  220. parts := strings.Split(image.ImageName, "-")
  221. return parts[len(parts)-1] + image.CreationTime.Format("20060102150405")
  222. },
  223. }
  224. var (
  225. SUSE_SLES = regexp.MustCompile(`suse-sles-\d+-v?\d+-`)
  226. SUSE_SLES_SP = regexp.MustCompile(`suse-sles-\d+-sp\d+-v?\d+-`)
  227. SUSE_SLES_RIGHTLINK = regexp.MustCompile(`suse-sles-\d+-rightscale-v?\d+-`)
  228. SUSE_SLES_RIGHTLINK_SP = regexp.MustCompile(`suse-sles-\d+-sp\d+-rightscale-v?\d+-`)
  229. SUSE_SLES_SAPCAL = regexp.MustCompile(`suse-sles-\d+-sapcal-v?\d+-`)
  230. SUSE_SLES_SAPCAL_SP = regexp.MustCompile(`suse-sles-\d+-sp\d+-sapcal-v?\d+-`)
  231. SUSE_SLES_BYOS = regexp.MustCompile(`suse-sles-\d+-byos-v?\d+-`)
  232. SUSE_SLES_BYOS_SP = regexp.MustCompile(`suse-sles-\d+-sp\d+-byos-v?\d+-`)
  233. SUSE_SLES_SAP = regexp.MustCompile(`suse-sles-sap-\d+-v\d+-`)
  234. SUSE_SLES_SAP_SP = regexp.MustCompile(`suse-sles-sap-\d+-sp\d+-v\d+-`)
  235. SUSE_SLES_SAP_BYOS = regexp.MustCompile(`suse-sles-sap-\d+-byos-v?\d+-`)
  236. SUSE_SLES_SAP_BYOS_SP = regexp.MustCompile(`suse-sles-sap-\d+-sp\d+-byos-v?\d+-`)
  237. SUSE_CAASP_CLUSTER_BYOS = regexp.MustCompile(`suse-caasp-\d+-\d+-cluster-byos-v?\d+-`)
  238. SUSE_CAASP_ADMIN_BYOS = regexp.MustCompile(`suse-caasp-\d+-\d+-admin-byos-v?\d+-`)
  239. SUSE_MANAGER_SERVER_BYOS = regexp.MustCompile(`suse-manager-\d+-\d+-server-byos-v?\d+-`)
  240. SUSE_MANAGER_PROXY_BYOS = regexp.MustCompile(`suse-manager-\d+-\d+-proxy-byos-v?\d+-`)
  241. )
  242. func getBuildId(ver string) string {
  243. if ver[0] == 'v' {
  244. return ver[1:]
  245. } else {
  246. return ver
  247. }
  248. }
  249. var suse = SAWSImagePublisherInfo{
  250. GetOSType: func(image SImage) string {
  251. return "Linux"
  252. },
  253. GetOSDist: func(image SImage) string {
  254. switch {
  255. case SUSE_SLES.MatchString(image.ImageName), SUSE_SLES_SP.MatchString(image.ImageName):
  256. return "SUSE Linux Enterpise Server"
  257. case SUSE_SLES_RIGHTLINK.MatchString(image.ImageName), SUSE_SLES_RIGHTLINK_SP.MatchString(image.ImageName):
  258. return "SUSE Linux Enterpise Server with RightLink"
  259. case SUSE_SLES_SAPCAL.MatchString(image.ImageName), SUSE_SLES_SAPCAL_SP.MatchString(image.ImageName):
  260. return "SUSE Linux Enterpise Server for SAP CAL"
  261. case SUSE_SLES_BYOS.MatchString(image.ImageName), SUSE_SLES_BYOS_SP.MatchString(image.ImageName):
  262. return "SUSE Linux Enterpise Server BYOS"
  263. case SUSE_SLES_SAP.MatchString(image.ImageName), SUSE_SLES_SAP_SP.MatchString(image.ImageName):
  264. return "SUSE Linux Enterpise Server for SAP Application"
  265. case SUSE_SLES_SAP_BYOS.MatchString(image.ImageName), SUSE_SLES_SAP_BYOS_SP.MatchString(image.ImageName):
  266. return "SUSE Linux Enterpise Server for SAP Application BYOS"
  267. case SUSE_CAASP_CLUSTER_BYOS.MatchString(image.ImageName):
  268. return "SUSE CaaSP Cluster Node"
  269. case SUSE_CAASP_ADMIN_BYOS.MatchString(image.ImageName):
  270. return "SUSE CaaSP Admin Node"
  271. case SUSE_MANAGER_SERVER_BYOS.MatchString(image.ImageName):
  272. return "SUSE Manager Server"
  273. case SUSE_MANAGER_PROXY_BYOS.MatchString(image.ImageName):
  274. return "SUSE Manager Proxy"
  275. }
  276. return "SUSE"
  277. },
  278. GetOSVersion: func(image SImage) string {
  279. parts := strings.Split(image.ImageName, "-")
  280. switch {
  281. case SUSE_SLES.MatchString(image.ImageName):
  282. return parts[2]
  283. case SUSE_SLES_SP.MatchString(image.ImageName):
  284. return fmt.Sprintf("%s.%s", parts[2], parts[3][2:])
  285. case SUSE_SLES_RIGHTLINK.MatchString(image.ImageName):
  286. return parts[2]
  287. case SUSE_SLES_RIGHTLINK_SP.MatchString(image.ImageName):
  288. return fmt.Sprintf("%s.%s", parts[2], parts[3][2:])
  289. case SUSE_SLES_SAPCAL.MatchString(image.ImageName):
  290. return parts[2]
  291. case SUSE_SLES_SAPCAL_SP.MatchString(image.ImageName):
  292. return fmt.Sprintf("%s.%s", parts[2], parts[3][2:])
  293. case SUSE_SLES_BYOS.MatchString(image.ImageName):
  294. return parts[2]
  295. case SUSE_SLES_BYOS_SP.MatchString(image.ImageName):
  296. return fmt.Sprintf("%s.%s", parts[2], parts[3][2:])
  297. case SUSE_SLES_SAP.MatchString(image.ImageName):
  298. return parts[3]
  299. case SUSE_SLES_SAP_SP.MatchString(image.ImageName):
  300. return fmt.Sprintf("%s.%s", parts[3], parts[4][2:])
  301. case SUSE_SLES_SAP_BYOS.MatchString(image.ImageName):
  302. return parts[3]
  303. case SUSE_SLES_SAP_BYOS_SP.MatchString(image.ImageName):
  304. return fmt.Sprintf("%s.%s", parts[3], parts[4][2:])
  305. case SUSE_CAASP_CLUSTER_BYOS.MatchString(image.ImageName):
  306. return fmt.Sprintf("%s.%s", parts[2], parts[3])
  307. case SUSE_CAASP_ADMIN_BYOS.MatchString(image.ImageName):
  308. return fmt.Sprintf("%s.%s", parts[2], parts[3])
  309. case SUSE_MANAGER_SERVER_BYOS.MatchString(image.ImageName):
  310. return fmt.Sprintf("%s.%s", parts[2], parts[3])
  311. case SUSE_MANAGER_PROXY_BYOS.MatchString(image.ImageName):
  312. return fmt.Sprintf("%s.%s", parts[2], parts[3])
  313. }
  314. return ""
  315. },
  316. GetOSBuildID: func(image SImage) string {
  317. parts := strings.Split(image.ImageName, "-")
  318. switch {
  319. case SUSE_SLES.MatchString(image.ImageName):
  320. return getBuildId(parts[3])
  321. case SUSE_SLES_SP.MatchString(image.ImageName):
  322. return getBuildId(parts[4])
  323. case SUSE_SLES_RIGHTLINK.MatchString(image.ImageName):
  324. return getBuildId(parts[4])
  325. case SUSE_SLES_RIGHTLINK_SP.MatchString(image.ImageName):
  326. return getBuildId(parts[5])
  327. case SUSE_SLES_SAPCAL.MatchString(image.ImageName):
  328. return getBuildId(parts[4])
  329. case SUSE_SLES_SAPCAL_SP.MatchString(image.ImageName):
  330. return getBuildId(parts[5])
  331. case SUSE_SLES_BYOS.MatchString(image.ImageName):
  332. return getBuildId(parts[4])
  333. case SUSE_SLES_BYOS_SP.MatchString(image.ImageName):
  334. return getBuildId(parts[5])
  335. case SUSE_SLES_SAP.MatchString(image.ImageName):
  336. return getBuildId(parts[4])
  337. case SUSE_SLES_SAP_SP.MatchString(image.ImageName):
  338. return getBuildId(parts[5])
  339. case SUSE_SLES_SAP_BYOS.MatchString(image.ImageName):
  340. return getBuildId(parts[5])
  341. case SUSE_SLES_SAP_BYOS_SP.MatchString(image.ImageName):
  342. return getBuildId(parts[6])
  343. case SUSE_CAASP_CLUSTER_BYOS.MatchString(image.ImageName):
  344. return getBuildId(parts[6])
  345. case SUSE_CAASP_ADMIN_BYOS.MatchString(image.ImageName):
  346. return getBuildId(parts[6])
  347. case SUSE_MANAGER_SERVER_BYOS.MatchString(image.ImageName):
  348. return getBuildId(parts[6])
  349. case SUSE_MANAGER_PROXY_BYOS.MatchString(image.ImageName):
  350. return getBuildId(parts[6])
  351. }
  352. return ""
  353. },
  354. }
  355. var coreosVersionTable = map[string]int{
  356. "alpha": 0,
  357. "beta": 1,
  358. "stable": 2,
  359. }
  360. var coreos = SAWSImagePublisherInfo{
  361. GetOSType: func(image SImage) string {
  362. return "Linux"
  363. },
  364. GetOSDist: func(image SImage) string {
  365. return "CoreOS"
  366. },
  367. GetOSVersion: func(image SImage) string {
  368. parts := strings.Split(image.ImageName, "-")
  369. subparts := strings.Split(parts[2], ".")
  370. return subparts[0]
  371. },
  372. GetOSBuildID: func(image SImage) string {
  373. parts := strings.Split(image.ImageName, "-")
  374. return fmt.Sprintf("%s-%s", parts[1], parts[2])
  375. },
  376. CompareBuilds: func(v1, v2 string) int {
  377. parts1 := strings.Split(v1, "-")
  378. parts2 := strings.Split(v2, "-")
  379. majorV1 := coreosVersionTable[parts1[0]]
  380. majorV2 := coreosVersionTable[parts2[0]]
  381. if majorV1 != majorV2 {
  382. return majorV1 - majorV2
  383. }
  384. parts1 = strings.Split(parts1[1], ".")
  385. parts2 = strings.Split(parts2[1], ".")
  386. for i := 0; i < len(parts1) && i < len(parts2); i += 1 {
  387. n1, _ := strconv.Atoi(parts1[i])
  388. n2, _ := strconv.Atoi(parts2[i])
  389. if n1 != n2 {
  390. return n1 - n2
  391. }
  392. }
  393. return len(parts1) - len(parts2)
  394. },
  395. }
  396. var (
  397. sqlServerPattern = regexp.MustCompile(`-SQL_(\d+)_(\w+)-`)
  398. dotnetcorePattern = regexp.MustCompile(`-dotnetcore-`)
  399. )
  400. var windowsServer = SAWSImagePublisherInfo{
  401. GetOSType: func(image SImage) string {
  402. if strings.HasPrefix(image.ImageName, "ubuntu-") || strings.HasPrefix(image.ImageName, "amzn-ami-") || strings.HasPrefix(image.ImageName, "amzn2-ami-") {
  403. return "Linux"
  404. } else {
  405. return "Windows"
  406. }
  407. },
  408. GetOSDist: func(image SImage) string {
  409. osStr := "Windows Server"
  410. if strings.HasPrefix(image.ImageName, "ubuntu-") {
  411. osStr = "Ubuntu"
  412. } else if strings.HasPrefix(image.ImageName, "amzn-ami-") || strings.HasPrefix(image.ImageName, "amzn2-ami-") {
  413. osStr = "Amazon Linux"
  414. }
  415. apps := make([]string, 0)
  416. matchApp := sqlServerPattern.FindStringSubmatch(image.ImageName)
  417. if len(matchApp) > 0 {
  418. apps = append(apps, fmt.Sprintf("SQL Server %s %s", matchApp[1], matchApp[2]))
  419. }
  420. if dotnetcorePattern.MatchString(image.ImageName) {
  421. apps = append(apps, ".Net Core")
  422. }
  423. if len(apps) > 0 {
  424. osStr = fmt.Sprintf("%s with %s", osStr, strings.Join(apps, " "))
  425. }
  426. return osStr
  427. },
  428. GetOSVersion: func(image SImage) string {
  429. if strings.HasPrefix(image.ImageName, "ubuntu-") {
  430. return ubuntu.GetOSVersion(image)
  431. }
  432. if strings.HasPrefix(image.ImageName, "amzn-ami-") || strings.HasPrefix(image.ImageName, "amzn2-ami-") {
  433. return amazon.GetOSVersion(image)
  434. }
  435. parts := strings.Split(image.ImageName, "-")
  436. return strings.Join(parts[1:len(parts)-1], " ")
  437. },
  438. GetOSBuildID: func(image SImage) string {
  439. if strings.HasPrefix(image.ImageName, "ubuntu-") {
  440. return ubuntu.GetOSBuildID(image)
  441. }
  442. if strings.HasPrefix(image.ImageName, "amzn-ami-") || strings.HasPrefix(image.ImageName, "amzn2-ami-") {
  443. return amazon.GetOSBuildID(image)
  444. }
  445. parts := strings.Split(image.ImageName, "-")
  446. return parts[len(parts)-1] + image.CreationTime.Format("20060102150405")
  447. },
  448. }
  449. var (
  450. amazonVersionPattern = regexp.MustCompile(`-(\d{4})\.(\d{2})\.(rc-\d+|\d+)(\.(\d+))?`)
  451. // amzn2-ami-hvm-2.0.20250915.0-x86_64-gp2
  452. amazonVersionPattern2 = regexp.MustCompile(`-(\d{1,2})\.(\d{1,2})\.(\d{8})(\.(\d+))?`)
  453. // al2023-ami-minimal-2023.8.20250808.1-kernel-6.1-x86_64
  454. amazonVersionPattern3 = regexp.MustCompile(`-(\d{4})\.(\d{1,2})\.(\d{8})(\.(\d+))?`)
  455. // amzn2-ami-kernel-5.10-hvm-2.0.20250808.1-x86_64-ebs
  456. // al2023-ami-2023.8.20250915.0-kernel-6.1-arm64
  457. kernelPattern = regexp.MustCompile(`-kernel-(\d{1}\.\d{1,2})-`)
  458. )
  459. var amazon = SAWSImagePublisherInfo{
  460. GetOSType: func(image SImage) string {
  461. return "Linux"
  462. },
  463. GetOSDist: func(image SImage) string {
  464. dist := func() string {
  465. if strings.HasPrefix(image.ImageName, "amzn-ami-minimal-") || strings.HasPrefix(image.ImageName, "amzn2-ami-minimal-") {
  466. return "Amazon Linux Minimal"
  467. } else if strings.HasPrefix(image.ImageName, "al2023-ami-") {
  468. return "Amazon Linux 2023"
  469. }
  470. return "Amazon Linux"
  471. }()
  472. info := kernelPattern.FindStringSubmatch(image.ImageName)
  473. if len(info) > 0 {
  474. dist = fmt.Sprintf("%s Kernel-%s", dist, info[1])
  475. }
  476. return dist
  477. },
  478. GetOSVersion: func(image SImage) string {
  479. verStrs := amazonVersionPattern2.FindStringSubmatch(image.ImageName)
  480. if len(verStrs) > 3 {
  481. return fmt.Sprintf("%s.%s.%s", verStrs[1], verStrs[2], verStrs[3][:6])
  482. }
  483. verStrs = amazonVersionPattern.FindStringSubmatch(image.ImageName)
  484. if len(verStrs) > 3 {
  485. return fmt.Sprintf("%s.%s.%s", verStrs[1], verStrs[2], verStrs[3])
  486. }
  487. verStrs = amazonVersionPattern3.FindStringSubmatch(image.ImageName)
  488. if len(verStrs) > 3 {
  489. return fmt.Sprintf("%s.%s.%s", verStrs[1], verStrs[2], verStrs[3][:6])
  490. }
  491. return ""
  492. },
  493. GetOSBuildID: func(image SImage) string {
  494. buildId := func() string {
  495. verStrs := amazonVersionPattern2.FindStringSubmatch(image.ImageName)
  496. if len(verStrs) > 5 && len(verStrs[5]) > 0 {
  497. return fmt.Sprintf("%s.%s", verStrs[3], verStrs[5])
  498. } else if len(verStrs) > 3 {
  499. return verStrs[3]
  500. }
  501. verStrs = amazonVersionPattern.FindStringSubmatch(image.ImageName)
  502. if len(verStrs) > 5 {
  503. return verStrs[5]
  504. }
  505. verStrs = amazonVersionPattern3.FindStringSubmatch(image.ImageName)
  506. if len(verStrs) > 5 && len(verStrs[5]) > 0 {
  507. return fmt.Sprintf("%s.%s", verStrs[3], verStrs[5])
  508. } else if len(verStrs) > 3 {
  509. return verStrs[3]
  510. }
  511. return ""
  512. }()
  513. buildId += image.CreationTime.Format("20060102150405")
  514. return buildId
  515. },
  516. }
  517. var awsImagePublishers = map[string]SAWSImagePublisherInfo{
  518. "841258680906": rhel, // china
  519. "309956199498": rhel, // international
  520. "673060587306": debian, // china
  521. "379101102735": debian, // international
  522. "718707510307": centos, // china
  523. "410186602215": centos, // international
  524. "837727238323": ubuntu, // china
  525. "099720109477": ubuntu, // internaltional
  526. "841869936221": suse, // china
  527. "013907871322": suse, // international
  528. "280032941352": coreos, // china
  529. "595879546273": coreos, // international
  530. "016951021795": windowsServer, // china
  531. "801119661308": windowsServer, // international
  532. "141808717104": amazon, // china
  533. "137112412989": amazon, // international
  534. }
  535. func getImageOSType(image SImage) string {
  536. ownerInfo, ok := awsImagePublishers[image.OwnerId]
  537. if ok {
  538. return ownerInfo.GetOSType(image)
  539. }
  540. if strings.Contains(strings.ToLower(image.Platform), "windows") {
  541. return string(cloudprovider.OsTypeWindows)
  542. }
  543. return string(cloudprovider.OsTypeLinux)
  544. }
  545. func getImageOSDist(image SImage) string {
  546. ownerInfo, ok := awsImagePublishers[image.OwnerId]
  547. if ok {
  548. return ownerInfo.GetOSDist(image)
  549. }
  550. return ""
  551. }
  552. func getImageOSVersion(image SImage) string {
  553. ownerInfo, ok := awsImagePublishers[image.OwnerId]
  554. if ok {
  555. return ownerInfo.GetOSVersion(image)
  556. }
  557. return ""
  558. }
  559. func getImageOSBuildID(image SImage) string {
  560. ownerInfo, ok := awsImagePublishers[image.OwnerId]
  561. if ok {
  562. return ownerInfo.GetOSBuildID(image)
  563. }
  564. return ""
  565. }
  566. func comapreImageBuildIds(ver1 string, img2 SImage) int {
  567. ownerInfo, ok := awsImagePublishers[img2.OwnerId]
  568. if ok && ownerInfo.CompareBuilds != nil {
  569. return ownerInfo.CompareBuilds(ver1, getImageOSBuildID(img2))
  570. }
  571. return strings.Compare(ver1, getImageOSBuildID(img2))
  572. }
  573. func getImageType(image *SImage) cloudprovider.TImageType {
  574. _, ok := awsImagePublishers[image.OwnerId]
  575. if ok {
  576. return cloudprovider.ImageTypeSystem
  577. }
  578. if !image.Public {
  579. return cloudprovider.ImageTypeCustomized
  580. }
  581. return cloudprovider.ImageTypeMarket
  582. }