@@ -23,7 +23,7 @@ import java.nio.file.Paths
23
23
import com .google .common .base .Charsets
24
24
import com .google .common .io .Files
25
25
import com .spotify .docker .client .{DefaultDockerClient , DockerCertificates , LoggingBuildHandler }
26
- import com .spotify .docker .client .DockerClient .{ListContainersParam , RemoveContainerParam }
26
+ import com .spotify .docker .client .DockerClient .{ListContainersParam , ListImagesParam , RemoveContainerParam }
27
27
import com .spotify .docker .client .messages .Container
28
28
import org .apache .http .client .utils .URIBuilder
29
29
import org .scalatest .concurrent .{Eventually , PatienceConfiguration }
@@ -145,30 +145,35 @@ private[spark] class KubernetesSuiteDockerManager(
145
145
* Forces all containers running an image with the configured tag to halt and be removed.
146
146
*/
147
147
private def removeRunningContainers (): Unit = {
148
+ val imageIds = dockerClient.listImages(ListImagesParam .allImages())
149
+ .asScala
150
+ .filter(image => image.repoTags().asScala.exists(_.endsWith(s " : $dockerTag" )))
151
+ .map(_.id())
152
+ .toSet
148
153
Eventually .eventually(KubernetesSuite .TIMEOUT , KubernetesSuite .INTERVAL ) {
149
- val runningContainersWithImageTag = stopRunningContainers()
154
+ val runningContainersWithImageTag = stopRunningContainers(imageIds )
150
155
require(
151
156
runningContainersWithImageTag.isEmpty,
152
157
s " ${runningContainersWithImageTag.size} containers found still running " +
153
158
s " with the image tag $dockerTag" )
154
159
}
155
160
dockerClient.listContainers(ListContainersParam .allContainers())
156
161
.asScala
157
- .filter(containerHasImageWithTag(_ ))
162
+ .filter(container => imageIds.contains(container.imageId() ))
158
163
.foreach(container => dockerClient.removeContainer(
159
164
container.id(), RemoveContainerParam .forceKill(true )))
160
165
Eventually .eventually(KubernetesSuite .TIMEOUT , KubernetesSuite .INTERVAL ) {
161
166
val containersWithImageTag = dockerClient.listContainers(ListContainersParam .allContainers())
162
167
.asScala
163
- .filter(containerHasImageWithTag(_ ))
168
+ .filter(container => imageIds.contains(container.imageId() ))
164
169
require(containersWithImageTag.isEmpty, s " ${containersWithImageTag.size} containers still " +
165
170
s " found with image tag $dockerTag. " )
166
171
}
167
172
168
173
}
169
174
170
- private def stopRunningContainers (): Iterable [Container ] = {
171
- val runningContainersWithImageTag = getRunningContainersWithImageTag( )
175
+ private def stopRunningContainers (imageIds : Set [ String ] ): Iterable [Container ] = {
176
+ val runningContainersWithImageTag = getRunningContainersWithImageIds(imageIds )
172
177
if (runningContainersWithImageTag.nonEmpty) {
173
178
log.info(s " Found ${runningContainersWithImageTag.size} containers running with " +
174
179
s " an image with the tag $dockerTag. Attempting to remove these containers, " +
@@ -180,17 +185,13 @@ private[spark] class KubernetesSuiteDockerManager(
180
185
runningContainersWithImageTag
181
186
}
182
187
183
- private def getRunningContainersWithImageTag ( ): Iterable [Container ] = {
188
+ private def getRunningContainersWithImageIds ( imageIds : Set [ String ] ): Iterable [Container ] = {
184
189
dockerClient
185
190
.listContainers(
186
191
ListContainersParam .allContainers(),
187
192
ListContainersParam .withStatusRunning())
188
193
.asScala
189
- .filter(containerHasImageWithTag(_))
190
- }
191
-
192
- private def containerHasImageWithTag (container : Container ): Boolean = {
193
- container.image().endsWith(s " : $dockerTag" )
194
+ .filter(container => imageIds.contains(container.imageId()))
194
195
}
195
196
196
197
private def deleteImage (name : String ): Unit = {
0 commit comments