Skip to content

Commit 359c84f

Browse files
authored
Add getWikiHostsForDomain endpoint (#1001)
Bug: T409530
1 parent f239da6 commit 359c84f

4 files changed

Lines changed: 119 additions & 1 deletion

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Backend;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Services\MediaWikiHostResolver;
7+
use App\Services\UnknownDBVersionException;
8+
use App\Services\UnknownWikiDomainException;
9+
use Illuminate\Http\Request;
10+
11+
class MediaWikiHostsController extends Controller {
12+
public function getWikiHostsForDomain(Request $request): \Illuminate\Http\JsonResponse {
13+
$mediawikiHostResolver = new MediaWikiHostResolver;
14+
$domain = $request->query('domain');
15+
try {
16+
$hosts = $mediawikiHostResolver->getHostsForDomain($domain);
17+
} catch (UnknownWikiDomainException $e) {
18+
return response()->json(['error' => 'Domain not found.'], 404);
19+
} catch (UnknownDBVersionException $e) {
20+
return response()->json(['error' => 'Unknown database version.'], 500);
21+
}
22+
23+
return response()
24+
->json([
25+
'domain' => $domain,
26+
'backend-host' => $hosts['backend'],
27+
'web-host' => $hosts['web'],
28+
'api-host' => $hosts['api'],
29+
'alpha-host' => $hosts['alpha'],
30+
])
31+
->header('x-backend-host', $hosts['backend'])
32+
->header('x-web-host', $hosts['web'])
33+
->header('x-api-host', $hosts['api'])
34+
->header('x-alpha-host', $hosts['alpha']);
35+
}
36+
}

app/Services/MediaWikiHostResolver.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,24 @@ class MediaWikiHostResolver {
2929
// return $this->getBackendHostForDomain($wiki->domain);
3030
// }
3131

32+
/**
33+
* @throws UnknownDBVersionException
34+
* @throws UnknownWikiDomainException
35+
*/
36+
public function getHostsForDomain(string $domain): array {
37+
$mwVersionForDomain = $this->getMwVersionForDomain($domain);
38+
39+
// TODO: Make hosts format configurable for flexibility
40+
return [
41+
'web' => sprintf('mediawiki-%s-app-web.default.svc.cluster.local', $mwVersionForDomain),
42+
'backend' => sprintf('mediawiki-%s-app-backend.default.svc.cluster.local', $mwVersionForDomain),
43+
'api' => sprintf('mediawiki-%s-app-api.default.svc.cluster.local', $mwVersionForDomain),
44+
'alpha' => sprintf('mediawiki-%s-app-alpha.default.svc.cluster.local', $mwVersionForDomain),
45+
];
46+
}
47+
3248
public function getBackendHostForDomain(string $domain): string {
33-
// TODO: Move 'backend.default.svc.cluster.local' to an env variable (e.g. PLATFORM_MW_BACKEND_HOST_SUFFIX) for flexibility.
49+
// TODO: Make host format configurable for flexibility
3450
return sprintf('mediawiki-%s-app-backend.default.svc.cluster.local', $this->getMwVersionForDomain($domain));
3551
}
3652

routes/backend.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ function () {
2020
$router->get('getWikiVersionForDomain', ['uses' => 'IngressController@getWikiVersionForDomain']);
2121
});
2222

23+
$router->get('getWikiHostsForDomain', ['uses' => 'MediaWikiHostsController@getWikiHostsForDomain']);
24+
2325
$router->group(['prefix' => 'wiki'], function () use ($router) {
2426
$router->get('getWikiForDomain', ['uses' => 'WikiController@getWikiForDomain']);
2527
$router->patch('updateEntityImport', ['uses' => '\App\Http\Controllers\WikiEntityImportController@update']);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
namespace Tests\Routes\Backend;
4+
5+
use App\Wiki;
6+
use App\WikiDb;
7+
use Illuminate\Foundation\Testing\RefreshDatabase;
8+
use Tests\TestCase;
9+
10+
class MediaWikiHostsControllerTest extends TestCase {
11+
use RefreshDatabase;
12+
13+
protected $route = '/backend/getWikiHostsForDomain';
14+
15+
public function testSuccess() {
16+
$expectedHosts = [
17+
'backend' => 'mediawiki-143-app-backend.default.svc.cluster.local',
18+
'web' => 'mediawiki-143-app-web.default.svc.cluster.local',
19+
'api' => 'mediawiki-143-app-api.default.svc.cluster.local',
20+
'alpha' => 'mediawiki-143-app-alpha.default.svc.cluster.local',
21+
];
22+
23+
$this->createWiki('test139.wikibase.cloud', 'mw1.39-wbs1');
24+
$this->createWiki('test143.wikibase.cloud', 'mw1.43-wbs1');
25+
26+
$this->getJson("$this->route?domain=test143.wikibase.cloud")
27+
->assertStatus(200)
28+
->assertHeader('x-backend-host', $expectedHosts['backend'])
29+
->assertHeader('x-web-host', $expectedHosts['web'])
30+
->assertHeader('x-api-host', $expectedHosts['api'])
31+
->assertHeader('x-alpha-host', $expectedHosts['alpha'])
32+
->assertJson([
33+
'domain' => 'test143.wikibase.cloud',
34+
'backend-host' => $expectedHosts['backend'],
35+
'web-host' => $expectedHosts['web'],
36+
'api-host' => $expectedHosts['api'],
37+
'alpha-host' => $expectedHosts['alpha'],
38+
]);
39+
}
40+
41+
public function testDomainNotfound() {
42+
$this->getJson("$this->route?domain=notfound.wikibase.cloud")
43+
->assertStatus(404);
44+
}
45+
46+
public function testUnknownDbVersion() {
47+
$this->createWiki('test.wikibase.cloud', 'unknownVersion');
48+
49+
$this->getJson("$this->route?domain=test.wikibase.cloud")
50+
->assertStatus(500);
51+
}
52+
53+
private function createWiki(string $domain, string $version) {
54+
$wiki = Wiki::factory()->create(['domain' => $domain]);
55+
WikiDb::create([
56+
'name' => $domain,
57+
'user' => 'someUser',
58+
'password' => 'somePassword',
59+
'version' => $version,
60+
'prefix' => 'somePrefix',
61+
'wiki_id' => $wiki->id,
62+
]);
63+
}
64+
}

0 commit comments

Comments
 (0)