Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions app/Http/Controllers/Backend/MediaWikiHostsController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Services\MediaWikiHostResolver;
use App\Services\UnknownDBVersionException;
use App\Services\UnknownWikiDomainException;
use Illuminate\Http\Request;

class MediaWikiHostsController extends Controller {
public function getWikiHostsForDomain(Request $request): \Illuminate\Http\JsonResponse {
$mediawikiHostResolver = new MediaWikiHostResolver;
$domain = $request->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']);
}
}
18 changes: 17 additions & 1 deletion app/Services/MediaWikiHostResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually found the previous comment clearer but I am also fine with updating it as this now

Copy link
Member

@outdooracorn outdooracorn Nov 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I changed it is because I don't actually know if PLATFORM_MW_BACKEND_HOST_SUFFIX is the best way to make this configurable. 😅 What about the mediawiki- at the start? Should it be PLATFORM_MW_BACKEND_HOST_FORMAT=mediawiki-%s-app-backend.default.svc.cluster.local. That won't work for the other hosts (web, api, alpha) though. Do we have one env var per host? Or one env var for all hosts, e.g. PLATFORM_MW_HOSTS_FORMAT=mediawiki-{version}-app-{name}.default.svc.cluster.local with strtr?

return sprintf('mediawiki-%s-app-backend.default.svc.cluster.local', $this->getMwVersionForDomain($domain));
}

Expand Down
2 changes: 2 additions & 0 deletions routes/backend.php
Original file line number Diff line number Diff line change
Expand Up @@ -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']);
Expand Down
64 changes: 64 additions & 0 deletions tests/Routes/Backend/MediaWikiHostsControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace Tests\Routes\Backend;

use App\Wiki;
use App\WikiDb;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class MediaWikiHostsControllerTest extends TestCase {
use RefreshDatabase;

protected $route = '/backend/getWikiHostsForDomain';

public function testSuccess() {
$expectedHosts = [
'backend' => '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,
]);
}
}
Loading