diff --git a/app/Http/Controllers/Backend/MediaWikiHostsController.php b/app/Http/Controllers/Backend/MediaWikiHostsController.php new file mode 100644 index 000000000..569dc4876 --- /dev/null +++ b/app/Http/Controllers/Backend/MediaWikiHostsController.php @@ -0,0 +1,36 @@ +query('domain'); + try { + $hosts = $mediawikiHostResolver->getHostsForDomain($domain); + } catch (UnknownWikiDomainException $e) { + return response()->json(['error' => 'Domain not found.'], 404); + } catch (UnknownDBVersionException $e) { + return response()->json(['error' => 'Unknown database version.'], 500); + } + + return response() + ->json([ + 'domain' => $domain, + 'backend-host' => $hosts['backend'], + 'web-host' => $hosts['web'], + 'api-host' => $hosts['api'], + 'alpha-host' => $hosts['alpha'], + ]) + ->header('x-backend-host', $hosts['backend']) + ->header('x-web-host', $hosts['web']) + ->header('x-api-host', $hosts['api']) + ->header('x-alpha-host', $hosts['alpha']); + } +} diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index b100aeec0..d4cd4f47d 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -29,8 +29,24 @@ class MediaWikiHostResolver { // return $this->getBackendHostForDomain($wiki->domain); // } + /** + * @throws UnknownDBVersionException + * @throws UnknownWikiDomainException + */ + public function getHostsForDomain(string $domain): array { + $mwVersionForDomain = $this->getMwVersionForDomain($domain); + + // TODO: Make hosts format configurable for flexibility + return [ + 'web' => sprintf('mediawiki-%s-app-web.default.svc.cluster.local', $mwVersionForDomain), + 'backend' => sprintf('mediawiki-%s-app-backend.default.svc.cluster.local', $mwVersionForDomain), + 'api' => sprintf('mediawiki-%s-app-api.default.svc.cluster.local', $mwVersionForDomain), + 'alpha' => sprintf('mediawiki-%s-app-alpha.default.svc.cluster.local', $mwVersionForDomain), + ]; + } + public function getBackendHostForDomain(string $domain): string { - // TODO: Move 'backend.default.svc.cluster.local' to an env variable (e.g. PLATFORM_MW_BACKEND_HOST_SUFFIX) for flexibility. + // TODO: Make host format configurable for flexibility return sprintf('mediawiki-%s-app-backend.default.svc.cluster.local', $this->getMwVersionForDomain($domain)); } diff --git a/routes/backend.php b/routes/backend.php index 82024eee0..a8aae9412 100644 --- a/routes/backend.php +++ b/routes/backend.php @@ -20,6 +20,8 @@ function () { $router->get('getWikiVersionForDomain', ['uses' => 'IngressController@getWikiVersionForDomain']); }); +$router->get('getWikiHostsForDomain', ['uses' => 'MediaWikiHostsController@getWikiHostsForDomain']); + $router->group(['prefix' => 'wiki'], function () use ($router) { $router->get('getWikiForDomain', ['uses' => 'WikiController@getWikiForDomain']); $router->patch('updateEntityImport', ['uses' => '\App\Http\Controllers\WikiEntityImportController@update']); diff --git a/tests/Routes/Backend/MediaWikiHostsControllerTest.php b/tests/Routes/Backend/MediaWikiHostsControllerTest.php new file mode 100644 index 000000000..7bba11c86 --- /dev/null +++ b/tests/Routes/Backend/MediaWikiHostsControllerTest.php @@ -0,0 +1,64 @@ + 'mediawiki-143-app-backend.default.svc.cluster.local', + 'web' => 'mediawiki-143-app-web.default.svc.cluster.local', + 'api' => 'mediawiki-143-app-api.default.svc.cluster.local', + 'alpha' => 'mediawiki-143-app-alpha.default.svc.cluster.local', + ]; + + $this->createWiki('test139.wikibase.cloud', 'mw1.39-wbs1'); + $this->createWiki('test143.wikibase.cloud', 'mw1.43-wbs1'); + + $this->getJson("$this->route?domain=test143.wikibase.cloud") + ->assertStatus(200) + ->assertHeader('x-backend-host', $expectedHosts['backend']) + ->assertHeader('x-web-host', $expectedHosts['web']) + ->assertHeader('x-api-host', $expectedHosts['api']) + ->assertHeader('x-alpha-host', $expectedHosts['alpha']) + ->assertJson([ + 'domain' => 'test143.wikibase.cloud', + 'backend-host' => $expectedHosts['backend'], + 'web-host' => $expectedHosts['web'], + 'api-host' => $expectedHosts['api'], + 'alpha-host' => $expectedHosts['alpha'], + ]); + } + + public function testDomainNotfound() { + $this->getJson("$this->route?domain=notfound.wikibase.cloud") + ->assertStatus(404); + } + + public function testUnknownDbVersion() { + $this->createWiki('test.wikibase.cloud', 'unknownVersion'); + + $this->getJson("$this->route?domain=test.wikibase.cloud") + ->assertStatus(500); + } + + private function createWiki(string $domain, string $version) { + $wiki = Wiki::factory()->create(['domain' => $domain]); + WikiDb::create([ + 'name' => $domain, + 'user' => 'someUser', + 'password' => 'somePassword', + 'version' => $version, + 'prefix' => 'somePrefix', + 'wiki_id' => $wiki->id, + ]); + } +}