manifest.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /*
  2. Copyright 2017 The Kubernetes Authors.
  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. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package image
  14. import (
  15. "fmt"
  16. "io/ioutil"
  17. "os"
  18. "strings"
  19. yaml "gopkg.in/yaml.v2"
  20. )
  21. // RegistryList holds public and private image registries
  22. type RegistryList struct {
  23. GcAuthenticatedRegistry string `yaml:"gcAuthenticatedRegistry"`
  24. DockerLibraryRegistry string `yaml:"dockerLibraryRegistry"`
  25. DockerGluster string `yaml:"dockerGluster"`
  26. E2eRegistry string `yaml:"e2eRegistry"`
  27. PromoterE2eRegistry string `yaml:"promoterE2eRegistry"`
  28. InvalidRegistry string `yaml:"invalidRegistry"`
  29. GcRegistry string `yaml:"gcRegistry"`
  30. GcrReleaseRegistry string `yaml:"gcrReleaseRegistry"`
  31. GoogleContainerRegistry string `yaml:"googleContainerRegistry"`
  32. PrivateRegistry string `yaml:"privateRegistry"`
  33. SampleRegistry string `yaml:"sampleRegistry"`
  34. QuayK8sCSI string `yaml:"quayK8sCSI"`
  35. QuayIncubator string `yaml:"quayIncubator"`
  36. }
  37. // Config holds an images registry, name, and version
  38. type Config struct {
  39. registry string
  40. name string
  41. version string
  42. }
  43. // SetRegistry sets an image registry in a Config struct
  44. func (i *Config) SetRegistry(registry string) {
  45. i.registry = registry
  46. }
  47. // SetName sets an image name in a Config struct
  48. func (i *Config) SetName(name string) {
  49. i.name = name
  50. }
  51. // SetVersion sets an image version in a Config struct
  52. func (i *Config) SetVersion(version string) {
  53. i.version = version
  54. }
  55. func initReg() RegistryList {
  56. registry := RegistryList{
  57. GcAuthenticatedRegistry: "gcr.io/authenticated-image-pulling",
  58. DockerLibraryRegistry: "docker.io/library",
  59. DockerGluster: "docker.io/gluster",
  60. E2eRegistry: "gcr.io/kubernetes-e2e-test-images",
  61. PromoterE2eRegistry: "us.gcr.io/k8s-artifacts-prod/e2e-test-images",
  62. InvalidRegistry: "invalid.com/invalid",
  63. GcRegistry: "k8s.gcr.io",
  64. GcrReleaseRegistry: "gcr.io/gke-release",
  65. GoogleContainerRegistry: "gcr.io/google-containers",
  66. PrivateRegistry: "gcr.io/k8s-authenticated-test",
  67. SampleRegistry: "gcr.io/google-samples",
  68. QuayK8sCSI: "quay.io/k8scsi",
  69. QuayIncubator: "quay.io/kubernetes_incubator",
  70. }
  71. repoList := os.Getenv("KUBE_TEST_REPO_LIST")
  72. if repoList == "" {
  73. return registry
  74. }
  75. fileContent, err := ioutil.ReadFile(repoList)
  76. if err != nil {
  77. panic(fmt.Errorf("Error reading '%v' file contents: %v", repoList, err))
  78. }
  79. err = yaml.Unmarshal(fileContent, &registry)
  80. if err != nil {
  81. panic(fmt.Errorf("Error unmarshalling '%v' YAML file: %v", repoList, err))
  82. }
  83. return registry
  84. }
  85. var (
  86. registry = initReg()
  87. dockerLibraryRegistry = registry.DockerLibraryRegistry
  88. dockerGluster = registry.DockerGluster
  89. e2eRegistry = registry.E2eRegistry
  90. promoterE2eRegistry = registry.PromoterE2eRegistry
  91. gcAuthenticatedRegistry = registry.GcAuthenticatedRegistry
  92. gcRegistry = registry.GcRegistry
  93. gcrReleaseRegistry = registry.GcrReleaseRegistry
  94. googleContainerRegistry = registry.GoogleContainerRegistry
  95. invalidRegistry = registry.InvalidRegistry
  96. quayK8sCSI = registry.QuayK8sCSI
  97. quayIncubator = registry.QuayIncubator
  98. // PrivateRegistry is an image repository that requires authentication
  99. PrivateRegistry = registry.PrivateRegistry
  100. sampleRegistry = registry.SampleRegistry
  101. // Preconfigured image configs
  102. imageConfigs = initImageConfigs()
  103. )
  104. const (
  105. // Agnhost image
  106. Agnhost = iota
  107. // AgnhostPrivate image
  108. AgnhostPrivate
  109. // APIServer image
  110. APIServer
  111. // AppArmorLoader image
  112. AppArmorLoader
  113. // AuthenticatedAlpine image
  114. AuthenticatedAlpine
  115. // AuthenticatedWindowsNanoServer image
  116. AuthenticatedWindowsNanoServer
  117. // BusyBox image
  118. BusyBox
  119. // CheckMetadataConcealment image
  120. CheckMetadataConcealment
  121. // CudaVectorAdd image
  122. CudaVectorAdd
  123. // CudaVectorAdd2 image
  124. CudaVectorAdd2
  125. // Dnsutils image
  126. Dnsutils
  127. // EchoServer image
  128. EchoServer
  129. // Etcd image
  130. Etcd
  131. // GlusterDynamicProvisioner image
  132. GlusterDynamicProvisioner
  133. // Httpd image
  134. Httpd
  135. // HttpdNew image
  136. HttpdNew
  137. // InvalidRegistryImage image
  138. InvalidRegistryImage
  139. // IpcUtils image
  140. IpcUtils
  141. // JessieDnsutils image
  142. JessieDnsutils
  143. // Kitten image
  144. Kitten
  145. // Mounttest image
  146. Mounttest
  147. // MounttestUser image
  148. MounttestUser
  149. // Nautilus image
  150. Nautilus
  151. // NFSProvisioner image
  152. NFSProvisioner
  153. // Nginx image
  154. Nginx
  155. // NginxNew image
  156. NginxNew
  157. // Nonewprivs image
  158. Nonewprivs
  159. // NonRoot runs with a default user of 1234
  160. NonRoot
  161. // Pause - when these values are updated, also update cmd/kubelet/app/options/container_runtime.go
  162. // Pause image
  163. Pause
  164. // Perl image
  165. Perl
  166. // PrometheusDummyExporter image
  167. PrometheusDummyExporter
  168. // PrometheusToSd image
  169. PrometheusToSd
  170. // Redis image
  171. Redis
  172. // RegressionIssue74839 image
  173. RegressionIssue74839
  174. // ResourceConsumer image
  175. ResourceConsumer
  176. // SdDummyExporter image
  177. SdDummyExporter
  178. // StartupScript image
  179. StartupScript
  180. // VolumeNFSServer image
  181. VolumeNFSServer
  182. // VolumeISCSIServer image
  183. VolumeISCSIServer
  184. // VolumeGlusterServer image
  185. VolumeGlusterServer
  186. // VolumeRBDServer image
  187. VolumeRBDServer
  188. )
  189. func initImageConfigs() map[int]Config {
  190. configs := map[int]Config{}
  191. configs[Agnhost] = Config{promoterE2eRegistry, "agnhost", "2.10"}
  192. configs[AgnhostPrivate] = Config{PrivateRegistry, "agnhost", "2.6"}
  193. configs[AuthenticatedAlpine] = Config{gcAuthenticatedRegistry, "alpine", "3.7"}
  194. configs[AuthenticatedWindowsNanoServer] = Config{gcAuthenticatedRegistry, "windows-nanoserver", "v1"}
  195. configs[APIServer] = Config{e2eRegistry, "sample-apiserver", "1.17"}
  196. configs[AppArmorLoader] = Config{e2eRegistry, "apparmor-loader", "1.0"}
  197. configs[BusyBox] = Config{dockerLibraryRegistry, "busybox", "1.29"}
  198. configs[CheckMetadataConcealment] = Config{e2eRegistry, "metadata-concealment", "1.2"}
  199. configs[CudaVectorAdd] = Config{e2eRegistry, "cuda-vector-add", "1.0"}
  200. configs[CudaVectorAdd2] = Config{e2eRegistry, "cuda-vector-add", "2.0"}
  201. configs[Dnsutils] = Config{e2eRegistry, "dnsutils", "1.1"}
  202. configs[EchoServer] = Config{e2eRegistry, "echoserver", "2.2"}
  203. configs[Etcd] = Config{gcRegistry, "etcd", "3.4.3"}
  204. configs[GlusterDynamicProvisioner] = Config{dockerGluster, "glusterdynamic-provisioner", "v1.0"}
  205. configs[Httpd] = Config{dockerLibraryRegistry, "httpd", "2.4.38-alpine"}
  206. configs[HttpdNew] = Config{dockerLibraryRegistry, "httpd", "2.4.39-alpine"}
  207. configs[InvalidRegistryImage] = Config{invalidRegistry, "alpine", "3.1"}
  208. configs[IpcUtils] = Config{e2eRegistry, "ipc-utils", "1.0"}
  209. configs[JessieDnsutils] = Config{e2eRegistry, "jessie-dnsutils", "1.0"}
  210. configs[Kitten] = Config{e2eRegistry, "kitten", "1.0"}
  211. configs[Mounttest] = Config{e2eRegistry, "mounttest", "1.0"}
  212. configs[MounttestUser] = Config{e2eRegistry, "mounttest-user", "1.0"}
  213. configs[Nautilus] = Config{e2eRegistry, "nautilus", "1.0"}
  214. configs[NFSProvisioner] = Config{quayIncubator, "nfs-provisioner", "v2.2.2"}
  215. configs[Nginx] = Config{dockerLibraryRegistry, "nginx", "1.14-alpine"}
  216. configs[NginxNew] = Config{dockerLibraryRegistry, "nginx", "1.15-alpine"}
  217. configs[Nonewprivs] = Config{e2eRegistry, "nonewprivs", "1.0"}
  218. configs[NonRoot] = Config{e2eRegistry, "nonroot", "1.0"}
  219. // Pause - when these values are updated, also update cmd/kubelet/app/options/container_runtime.go
  220. configs[Pause] = Config{gcRegistry, "pause", "3.2"}
  221. configs[Perl] = Config{dockerLibraryRegistry, "perl", "5.26"}
  222. configs[PrometheusDummyExporter] = Config{gcRegistry, "prometheus-dummy-exporter", "v0.1.0"}
  223. configs[PrometheusToSd] = Config{gcRegistry, "prometheus-to-sd", "v0.5.0"}
  224. configs[Redis] = Config{dockerLibraryRegistry, "redis", "5.0.5-alpine"}
  225. configs[RegressionIssue74839] = Config{e2eRegistry, "regression-issue-74839-amd64", "1.0"}
  226. configs[ResourceConsumer] = Config{e2eRegistry, "resource-consumer", "1.5"}
  227. configs[SdDummyExporter] = Config{gcRegistry, "sd-dummy-exporter", "v0.2.0"}
  228. configs[StartupScript] = Config{googleContainerRegistry, "startup-script", "v1"}
  229. configs[VolumeNFSServer] = Config{e2eRegistry, "volume/nfs", "1.0"}
  230. configs[VolumeISCSIServer] = Config{e2eRegistry, "volume/iscsi", "2.0"}
  231. configs[VolumeGlusterServer] = Config{e2eRegistry, "volume/gluster", "1.0"}
  232. configs[VolumeRBDServer] = Config{e2eRegistry, "volume/rbd", "1.0.1"}
  233. return configs
  234. }
  235. // GetImageConfigs returns the map of imageConfigs
  236. func GetImageConfigs() map[int]Config {
  237. return imageConfigs
  238. }
  239. // GetConfig returns the Config object for an image
  240. func GetConfig(image int) Config {
  241. return imageConfigs[image]
  242. }
  243. // GetE2EImage returns the fully qualified URI to an image (including version)
  244. func GetE2EImage(image int) string {
  245. return fmt.Sprintf("%s/%s:%s", imageConfigs[image].registry, imageConfigs[image].name, imageConfigs[image].version)
  246. }
  247. // GetE2EImage returns the fully qualified URI to an image (including version)
  248. func (i *Config) GetE2EImage() string {
  249. return fmt.Sprintf("%s/%s:%s", i.registry, i.name, i.version)
  250. }
  251. // GetPauseImageName returns the pause image name with proper version
  252. func GetPauseImageName() string {
  253. return GetE2EImage(Pause)
  254. }
  255. // ReplaceRegistryInImageURL replaces the registry in the image URL with a custom one
  256. func ReplaceRegistryInImageURL(imageURL string) (string, error) {
  257. parts := strings.Split(imageURL, "/")
  258. countParts := len(parts)
  259. registryAndUser := strings.Join(parts[:countParts-1], "/")
  260. switch registryAndUser {
  261. case "gcr.io/kubernetes-e2e-test-images":
  262. registryAndUser = e2eRegistry
  263. case "k8s.gcr.io":
  264. registryAndUser = gcRegistry
  265. case "gcr.io/k8s-authenticated-test":
  266. registryAndUser = PrivateRegistry
  267. case "gcr.io/google-samples":
  268. registryAndUser = sampleRegistry
  269. case "gcr.io/gke-release":
  270. registryAndUser = gcrReleaseRegistry
  271. case "docker.io/library":
  272. registryAndUser = dockerLibraryRegistry
  273. case "quay.io/k8scsi":
  274. registryAndUser = quayK8sCSI
  275. default:
  276. if countParts == 1 {
  277. // We assume we found an image from docker hub library
  278. // e.g. openjdk -> docker.io/library/openjdk
  279. registryAndUser = dockerLibraryRegistry
  280. break
  281. }
  282. return "", fmt.Errorf("Registry: %s is missing in test/utils/image/manifest.go, please add the registry, otherwise the test will fail on air-gapped clusters", registryAndUser)
  283. }
  284. return fmt.Sprintf("%s/%s", registryAndUser, parts[countParts-1]), nil
  285. }