@@ -16,6 +16,7 @@ import io.netty.buffer.UnpooledByteBufAllocator
1616import io.netty.channel.ChannelOption
1717import io.netty.util.concurrent.FastThreadLocal
1818import org.gradle.api.Action
19+ import org.gradle.api.NamedDomainObjectList
1920import org.gradle.api.Project
2021import org.gradle.api.artifacts.ConfigurationContainer
2122import org.gradle.api.artifacts.ResolvableDependencies
@@ -50,30 +51,12 @@ internal val OCI_IMAGE_DISTRIBUTION_TYPES = arrayOf(OCI_IMAGE_DISTRIBUTION_TYPE,
5051 * @author Silvio Giebl
5152 */
5253internal abstract class OciRegistriesImpl @Inject constructor(
53- private val imageMapping : OciImageMappingImpl ,
54- private val objectFactory : ObjectFactory ,
5554 private val repositoryHandler : RepositoryHandler ,
56- configurationContainer : ConfigurationContainer ,
57- buildServiceRegistry : BuildServiceRegistry ,
58- project : Project ,
55+ private val objectFactory : ObjectFactory ,
56+ private val providerFactory : ProviderFactory ,
5957) : OciRegistries {
6058 final override val list = objectFactory.namedDomainObjectList(OciRegistry ::class )
6159 final override val repositoryPort: Property <Int > = objectFactory.property<Int >().convention(5123 )
62- private val registriesService =
63- buildServiceRegistry.registerIfAbsent(" ociRegistriesService-${project.path} " , OciRegistriesService ::class ) {}
64-
65- private var beforeResolveInitialized = false
66-
67- init {
68- configurationContainer.configureEach {
69- incoming.beforeResolve {
70- if (! beforeResolveInitialized && resolvesOciImages()) {
71- beforeResolveInitialized = true
72- beforeResolve()
73- }
74- }
75- }
76- }
7760
7861 final override fun registry (name : String , configuration : Action <in OciRegistry >): OciRegistry {
7962 val registry = getOrCreateRegistry(name)
@@ -100,7 +83,7 @@ internal abstract class OciRegistriesImpl @Inject constructor(
10083 private inline fun getOrCreateRegistry (name : String , init : OciRegistry .() -> Unit = {}): OciRegistry {
10184 var registry = list.findByName(name)
10285 if (registry == null ) {
103- registry = objectFactory.newInstance<OciRegistryImpl >(name, this )
86+ registry = objectFactory.newInstance<OciRegistryImpl >(name, this , repositoryHandler, providerFactory )
10487 registry.init ()
10588 list + = registry
10689 }
@@ -113,28 +96,14 @@ internal abstract class OciRegistriesImpl @Inject constructor(
11396 filter(configuration)
11497 }
11598 }
116-
117- private fun ResolvableDependencies.resolvesOciImages () =
118- attributes.getAttribute(DISTRIBUTION_TYPE_ATTRIBUTE ) in OCI_IMAGE_DISTRIBUTION_TYPES
119-
120- private fun beforeResolve () {
121- if (list.isNotEmpty()) {
122- val registriesService = registriesService.get()
123- registriesService.init (repositoryPort.get())
124- val imageMappingData = imageMapping.getData()
125- for (registry in list) {
126- registriesService.register(registry, imageMappingData)
127- }
128- }
129- }
13099}
131100
132101internal abstract class OciRegistryImpl @Inject constructor(
133102 private val name : String ,
134103 registries : OciRegistriesImpl ,
104+ repositoryHandler : RepositoryHandler ,
135105 objectFactory : ObjectFactory ,
136106 private val providerFactory : ProviderFactory ,
137- repositoryHandler : RepositoryHandler ,
138107) : OciRegistry {
139108
140109 final override val url = objectFactory.property<URI >()
@@ -167,26 +136,67 @@ internal abstract class OciRegistryImpl @Inject constructor(
167136 repository.content(configuration)
168137}
169138
139+ private const val SERVICE_BASE_NAME = " ociRegistriesService"
170140private const val PORT_HTTP_HEADER_NAME = " port"
171141
142+ internal fun OciRegistriesService (
143+ buildServiceRegistry : BuildServiceRegistry ,
144+ name : String ,
145+ registries : NamedDomainObjectList <OciRegistry >,
146+ repositoryPort : Property <Int >,
147+ imageMapping : OciImageMappingImpl ,
148+ ): OciRegistriesService {
149+ val registriesService = buildServiceRegistry.registerIfAbsent(name, OciRegistriesService ::class ) {}.get()
150+ registriesService.init (registries, repositoryPort, imageMapping)
151+ return registriesService
152+ }
153+
172154internal abstract class OciRegistriesService : BuildService <BuildServiceParameters .None >, AutoCloseable {
155+ lateinit var registries: NamedDomainObjectList <OciRegistry >
156+ lateinit var repositoryPort: Property <Int >
157+ lateinit var imageMapping: OciImageMappingImpl
158+ private var isStarted = false
173159 private val httpServers = mutableListOf<DisposableServer >()
174160 private val loopResources = OciLoopResources .acquire()
175161 private val imageMetadataRegistry = OciImageMetadataRegistry (OciRegistryApi (OciRegistryHttpClient .acquire()))
176162
177- fun init (port : Int ) {
163+ fun init (
164+ registries : NamedDomainObjectList <OciRegistry >,
165+ repositoryPort : Property <Int >,
166+ imageMapping : OciImageMappingImpl ,
167+ ) {
168+ this .registries = registries
169+ this .repositoryPort = repositoryPort
170+ this .imageMapping = imageMapping
171+ }
172+
173+ fun start () {
174+ if (isStarted) {
175+ return
176+ }
177+ isStarted = true
178+ if (registries.isNotEmpty()) {
179+ startRedirectServer(repositoryPort.get())
180+ val imageMappingData = imageMapping.getData()
181+ for (registry in registries) {
182+ startRegistryServer(registry, imageMappingData)
183+ }
184+ }
185+ }
186+
187+ private fun startRedirectServer (port : Int ) {
178188 try {
179- addHttpServer (port) { request, response ->
189+ startHttpServer (port) { request, response ->
180190 val redirectPort = request.requestHeaders()[PORT_HTTP_HEADER_NAME ]
181191 response.sendRedirect(" http://localhost:" + redirectPort + request.uri())
182192 }
183193 } catch (_: ChannelBindException ) {
184194 }
185195 }
186196
187- fun register (registry : OciRegistry , imageMappingData : OciImageMappingData ) {
197+ private fun startRegistryServer (registry : OciRegistry , imageMappingData : OciImageMappingData ) {
188198 val credentials = registry.credentials.orNull?.let { Credentials (it.username!! , it.password!! ) }
189- val port = addHttpServer (0 , OciRepositoryHandler (imageMetadataRegistry, imageMappingData, credentials)).port()
199+ val port = startHttpServer (0 , OciRepositoryHandler (imageMetadataRegistry, imageMappingData, credentials)).port()
190200 registry.repository.credentials(HttpHeaderCredentials ::class ) {
191201 name = PORT_HTTP_HEADER_NAME
192202 value = port.toString()
@@ -196,7 +206,7 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
196206 }
197207 }
198208
199- private fun addHttpServer (
209+ private fun startHttpServer (
200210 port : Int ,
201211 handler : BiFunction <in HttpServerRequest , in HttpServerResponse , out Publisher <Void >>,
202212 ): DisposableServer {
@@ -225,3 +235,46 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
225235 OciLoopResources .release()
226236 }
227237}
238+
239+ internal fun setupSettingsOciRegistries (
240+ buildServiceRegistry : BuildServiceRegistry ,
241+ registries : OciRegistries ,
242+ imageMapping : OciImageMappingImpl ,
243+ ) {
244+ OciRegistriesService (
245+ buildServiceRegistry,
246+ SERVICE_BASE_NAME ,
247+ registries.list,
248+ registries.repositoryPort,
249+ imageMapping,
250+ )
251+ }
252+
253+ internal fun setupProjectOciRegistries (
254+ buildServiceRegistry : BuildServiceRegistry ,
255+ project : Project ,
256+ configurationContainer : ConfigurationContainer ,
257+ registries : OciRegistries ,
258+ imageMapping : OciImageMappingImpl ,
259+ ) {
260+ configurationContainer.configureEach {
261+ incoming.beforeResolve {
262+ if (resolvesOciImages()) {
263+ val settingsRegistration = buildServiceRegistry.registrations.findByName(SERVICE_BASE_NAME )
264+ if (settingsRegistration != null ) {
265+ (settingsRegistration.service.get() as OciRegistriesService ).start()
266+ }
267+ OciRegistriesService (
268+ buildServiceRegistry,
269+ " $SERVICE_BASE_NAME -${project.path} " ,
270+ registries.list,
271+ registries.repositoryPort,
272+ imageMapping,
273+ ).start()
274+ }
275+ }
276+ }
277+ }
278+
279+ private fun ResolvableDependencies.resolvesOciImages () =
280+ attributes.getAttribute(DISTRIBUTION_TYPE_ATTRIBUTE ) in OCI_IMAGE_DISTRIBUTION_TYPES
0 commit comments