diff --git a/config/services.yml b/config/services.yml index f67b8a0c..2aeb4c31 100644 --- a/config/services.yml +++ b/config/services.yml @@ -79,3 +79,8 @@ services: public: true my127\Workspace\Path\Path: '@my127\Workspace\Path\Composite' + + my127\Workspace\File\FileLoader\FileGetContentsLoader: ~ + my127\Workspace\File\FileLoader: + alias: 'my127\Workspace\File\FileLoader\FileGetContentsLoader' + diff --git a/src/File/ArrayLoader.php b/src/File/ArrayLoader.php new file mode 100644 index 00000000..fbb99f30 --- /dev/null +++ b/src/File/ArrayLoader.php @@ -0,0 +1,8 @@ +contents = $contents; + } + + public function load(string $url): string + { + return $this->contents; + } +} diff --git a/src/Plugin/TraefikEndpoints/TraefikEndpointProvider.php b/src/Plugin/TraefikEndpoints/TraefikEndpointProvider.php new file mode 100644 index 00000000..f0dfef69 --- /dev/null +++ b/src/Plugin/TraefikEndpoints/TraefikEndpointProvider.php @@ -0,0 +1,42 @@ +loader = $loader; + } + + /** + * @return string[] + */ + public function links(): array + { + $providers = $this->loader->loadArray(sprintf( + '%s/api/providers', + self::TRAEFIK_BASE_URL + )); + + $links = []; + foreach ($providers['docker']['frontends'] as $frontend) { + foreach ($frontend['routes'] as $route) { + foreach (explode(',', $route['rule']) as $host) { + $links[] = sprintf('https://%s', preg_replace('{^Host:(.*)$}', '\1', $host)); + } + } + } + + return $links; + } +} diff --git a/src/Plugin/TraefikEndpoints/TraefikEndpointsPlugin.php b/src/Plugin/TraefikEndpoints/TraefikEndpointsPlugin.php new file mode 100644 index 00000000..b09639dd --- /dev/null +++ b/src/Plugin/TraefikEndpoints/TraefikEndpointsPlugin.php @@ -0,0 +1,47 @@ +provider = $provider; + $this->output = $output; + } + + public function setup(Application $application): void + { + $application->section('traefik urls') + ->description('List the Traefik endpoints') + ->action($this->action()); + } + + /** + * @return Closure(): + */ + private function action(): Closure + { + return function (Input $args) { + foreach ($this->provider->links() as $link) { + $this->output->writeln($link); + } + }; + } +} diff --git a/tests/Test/File/FileLoaderTest.php b/tests/Test/File/FileLoader/FileGetContentsLoaderTest.php similarity index 73% rename from tests/Test/File/FileLoaderTest.php rename to tests/Test/File/FileLoader/FileGetContentsLoaderTest.php index a4411455..a4785265 100644 --- a/tests/Test/File/FileLoaderTest.php +++ b/tests/Test/File/FileLoader/FileGetContentsLoaderTest.php @@ -1,12 +1,12 @@ load($url); + return (new FileGetContentsLoader())->load($url); } } diff --git a/tests/Test/File/JsonLoaderTest.php b/tests/Test/File/JsonLoaderTest.php index efd4edfe..4af0ab96 100644 --- a/tests/Test/File/JsonLoaderTest.php +++ b/tests/Test/File/JsonLoaderTest.php @@ -3,7 +3,7 @@ namespace my127\Workspace\Tests\Test\File; use my127\Workspace\File\Exception\CouldNotDecodeJson; -use my127\Workspace\File\FileLoader; +use my127\Workspace\File\FileLoader\FileGetContentsLoader; use my127\Workspace\File\JsonLoader; use my127\Workspace\Tests\IntegrationTestCase; @@ -26,6 +26,6 @@ public function testItThrowsAnExceptionIfTheJsonCannotBeDecoded(): void private function load(string $url): array { - return (new JsonLoader(new FileLoader()))->loadArray($url); + return (new JsonLoader(new FileGetContentsLoader()))->loadArray($url); } } diff --git a/tests/Test/Plugin/TraefikEndpoints/TraefikEndpointProviderTest.php b/tests/Test/Plugin/TraefikEndpoints/TraefikEndpointProviderTest.php new file mode 100644 index 00000000..5eaf1333 --- /dev/null +++ b/tests/Test/Plugin/TraefikEndpoints/TraefikEndpointProviderTest.php @@ -0,0 +1,29 @@ +links()); + } +} diff --git a/tests/Test/Plugin/TraefikEndpoints/fixture/traefik-providers.json b/tests/Test/Plugin/TraefikEndpoints/fixture/traefik-providers.json new file mode 100644 index 00000000..34d1b30b --- /dev/null +++ b/tests/Test/Plugin/TraefikEndpoints/fixture/traefik-providers.json @@ -0,0 +1,217 @@ +{ + "docker": { + "backends": { + "backend-kafka-ui-projectx-notify": { + "servers": { + "server-kafka-ui-d6b7039a8ab23e85a074cf3f08f5d3bb": { + "url": "http://172.29.0.2:8080", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-kafka-projectx-ecomm": { + "servers": { + "server-projectx-ecomm-kafka-1-c9b17e08616ec091ec5bdebc7168e08e": { + "url": "http://192.168.64.5:9092", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-mailhog-my127ws-mail": { + "servers": { + "server-my127ws-mail-mailhog-1-85e8085db4483a02ca3a7be5961b0900": { + "url": "http://172.20.0.2:8025", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-traefik-my127ws-proxy": { + "servers": { + "server-my127ws-proxy-f8ee5f56b6b8dbf5dd2dba51f3747e3f": { + "url": "http://172.20.0.3:8080", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-projectx-ecomm": { + "servers": { + "server-projectx-ecomm-nginx-1-6d61c6d09d67bbf35d2b9dcecdc930ff": { + "url": "http://172.20.0.8:80", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-projectx-example": { + "servers": { + "server-projectx-example-nginx-1-6414db0d5c6bd836bee98c375d262962": { + "url": "http://172.20.0.5:80", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-projectx-search": { + "servers": { + "server-projectx-ecomm-search-1-d332fdf89ad5d142a05df865a95fb3cd": { + "url": "http://172.20.0.6:8108", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + }, + "backend-zookeeper-projectx-ecomm": { + "servers": { + "server-projectx-ecomm-zookeeper-1-c08f0e8c4cd02eac6b5d4de2d1bcf9f5": { + "url": "http://192.168.64.9:22", + "weight": 1 + } + }, + "loadBalancer": { + "method": "wrr" + } + } + }, + "frontends": { + "frontend-Host-kafka-ui-projectx-notify-6": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-kafka-ui-projectx-notify", + "routes": { + "route-frontend-Host-kafka-ui-projectx-notify-6": { + "rule": "Host:kafka-ui.projectx-notify" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-kafka-projectx-ecomm-4": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-kafka-projectx-ecomm", + "routes": { + "route-frontend-Host-kafka-projectx-ecomm-4": { + "rule": "Host:kafka.projectx-ecomm" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-mail-my127-site-7": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-mailhog-my127ws-mail", + "routes": { + "route-frontend-Host-mail-my127-site-7": { + "rule": "Host:mail.my127.site" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-my127-site-5": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-traefik-my127ws-proxy", + "routes": { + "route-frontend-Host-my127-site-5": { + "rule": "Host:my127.site" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-search-projectx-my127-site-2": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-projectx-search", + "routes": { + "route-frontend-Host-search-projectx-my127-site-2": { + "rule": "Host:search-project.my127.site" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-projectx-ecomm-my127-site-hub-project-my127-site-a1-project-my127-site-a2-project-my127-site-0": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-projectx-ecomm", + "routes": { + "route-frontend-Host-projectx-ecomm-my127-site-hub-project-my127-site-a1-project-my127-site-a2-project-my127-site-0": { + "rule": "Host:projectx-ecomm.my127.site,hub-project.my127.site,a1-project.my127.site,a2-project.my127.site" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-projectx-example-my127-site-1": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-projectx-example", + "routes": { + "route-frontend-Host-projectx-example-my127-site-1": { + "rule": "Host:projectx-example.my127.site" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + }, + "frontend-Host-zookeeper-projectx-ecomm-3": { + "entryPoints": [ + "http", + "https" + ], + "backend": "backend-zookeeper-projectx-ecomm", + "routes": { + "route-frontend-Host-zookeeper-projectx-ecomm-3": { + "rule": "Host:zookeeper.projectx-ecomm" + } + }, + "passHostHeader": true, + "priority": 0, + "basicAuth": null + } + } + }, + "file": {} +} diff --git a/tests/Test/Types/Harness/Repository/PackageRepositoryTest.php b/tests/Test/Types/Harness/Repository/PackageRepositoryTest.php index 01f50b99..dc925f01 100644 --- a/tests/Test/Types/Harness/Repository/PackageRepositoryTest.php +++ b/tests/Test/Types/Harness/Repository/PackageRepositoryTest.php @@ -4,7 +4,7 @@ use Exception; use Generator; -use my127\Workspace\File\FileLoader; +use my127\Workspace\File\FileLoader\FileGetContentsLoader; use my127\Workspace\File\JsonLoader; use my127\Workspace\Tests\IntegrationTestCase; use my127\Workspace\Types\Harness\Repository\Exception\CouldNotLoadSource; @@ -148,7 +148,7 @@ public function itThrowsExceptionIfVersionCannotBeResolved(): void private function createRepository(): PackageRepository { - $repository = new PackageRepository(new JsonLoader(new FileLoader())); + $repository = new PackageRepository(new JsonLoader(new FileGetContentsLoader())); return $repository; }