diff --git a/app/Jobs/ProcessMediaWikiJobsJob.php b/app/Jobs/ProcessMediaWikiJobsJob.php index 298c3ee79..56e36dd7f 100644 --- a/app/Jobs/ProcessMediaWikiJobsJob.php +++ b/app/Jobs/ProcessMediaWikiJobsJob.php @@ -2,6 +2,7 @@ namespace App\Jobs; +use App\Services\MediaWikiHostResolver; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; @@ -27,14 +28,28 @@ public function uniqueId(): string { return $this->wikiDomain; } - public function handle(Client $kubernetesClient): void { + public function handle(Client $kubernetesClient, MediaWikiHostResolver $resolver): void { + $FQDNOfService = $resolver->getBackendHostForDomain($this->wikiDomain); + $serviceName = explode('.', $FQDNOfService)[0]; $kubernetesClient->setNamespace('default'); + $backendService = $kubernetesClient->services()->setFieldSelector([ + 'metadata.name' => $serviceName, + ])->first(); + + if ($backendService === null) { + $this->fail( + new \RuntimeException( + 'Unable to find a matching MediaWiki backend service in the cluster' + ) + ); + + return; + } + + $MWPodSelector = $backendService->toArray()['spec']['selector']; $mediawikiPod = $kubernetesClient->pods()->setFieldSelector([ 'status.phase' => 'Running', - ])->setLabelSelector([ - 'app.kubernetes.io/name' => 'mediawiki', - 'app.kubernetes.io/component' => 'app-backend', - ])->first(); + ])->setLabelSelector($MWPodSelector)->first(); if ($mediawikiPod === null) { $this->fail( diff --git a/tests/Jobs/ProcessMediaWikiJobsJobTest.php b/tests/Jobs/ProcessMediaWikiJobsJobTest.php index 967efabe0..c46e87a84 100644 --- a/tests/Jobs/ProcessMediaWikiJobsJobTest.php +++ b/tests/Jobs/ProcessMediaWikiJobsJobTest.php @@ -3,6 +3,7 @@ namespace Tests\Jobs; use App\Jobs\ProcessMediaWikiJobsJob; +use App\Services\MediaWikiHostResolver; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr7\Response; @@ -16,6 +17,9 @@ class ProcessMediaWikiJobsJobTest extends TestCase { use RefreshDatabase; public function testJobFailOnNoMediaWikiPod() { + + $mockResolver = $this->createMock(MediaWikiHostResolver::class); + $mockJob = $this->createMock(Job::class); $mockJob->expects($this->once())->method('fail'); @@ -24,6 +28,7 @@ public function testJobFailOnNoMediaWikiPod() { $mock = new MockHandler([ new Response(200, [], json_encode(['items' => []])), + new Response(200, [], json_encode(['items' => []])), ]); $handlerStack = HandlerStack::create($mock); @@ -35,10 +40,11 @@ public function testJobFailOnNoMediaWikiPod() { $job->handle(new Client([ 'master' => 'https://kubernetes.default.svc', 'token' => '/var/run/secrets/kubernetes.io/serviceaccount/token', - ], null, $mockGuzzle)); + ], null, $mockGuzzle), $mockResolver); } public function testJobDoesNotFail() { + $mockResolver = $this->createMock(MediaWikiHostResolver::class); $mockJob = $this->createMock(Job::class); $mockJob->expects($this->never())->method('fail'); @@ -46,6 +52,18 @@ public function testJobDoesNotFail() { $job->setJob($mockJob); $mock = new MockHandler([ + new Response(200, [], json_encode(['items' => [ + [ + 'kind' => 'Service', + 'spec' => [ + 'selector' => [ + 'app.kubernetes.io/component' => 'app-backend', + 'app.kubernetes.io/instance' => 'mediawiki-143', + 'app.kubernetes.io/name' => 'mediawiki', + ], + ], + ], + ]])), new Response(200, [], json_encode(['items' => [ [ 'kind' => 'Pod', @@ -75,9 +93,12 @@ public function testJobDoesNotFail() { 'verify' => '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt', ]); - $job->handle(new Client([ - 'master' => 'https://kubernetes.default.svc', - 'token' => '/var/run/secrets/kubernetes.io/serviceaccount/token', - ], null, $mockGuzzle)); + $job->handle( + new Client([ + 'master' => 'https://kubernetes.default.svc', + 'token' => '/var/run/secrets/kubernetes.io/serviceaccount/token', + ], null, $mockGuzzle), + $mockResolver + ); } }