From e7740c8669b4dc4dc15f0bfd4fa333ce5fb99c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20S=C3=A9chet?= Date: Sat, 19 Jun 2021 13:09:54 +0000 Subject: [PATCH] Add HarbormasterHookController as an entry point for all Harbormaster hooks Summary: This makes the set of hooks easily extensible, as a first step toward integrating more 3rd party CI in phorge. Test Plan: Send requests to `/harbormaster/hook/circleci/` and `/harbormaster/hook/buildkite/` and check they run the proper handler. Reviewers: O1 Blessed Committers, Matthew Reviewed By: O1 Blessed Committers, Matthew Subscribers: Matthew, speck, tobiaswiese Maniphest Tasks: T15018 Differential Revision: https://we.phorge.it/D25005 --- src/__phutil_library_map__.php | 16 ++++++----- .../PhabricatorHarbormasterApplication.php | 5 +--- .../controller/HarbormasterHookController.php | 21 +++++++++++++++ .../integration/HarbormasterHookHandler.php | 27 +++++++++++++++++++ ...masterBuildkiteBuildStepImplementation.php | 0 .../HarbormasterBuildkiteHookHandler.php} | 8 +++--- ...rmasterCircleCIBuildStepImplementation.php | 0 .../HarbormasterCircleCIHookHandler.php} | 8 +++--- 8 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 src/applications/harbormaster/controller/HarbormasterHookController.php create mode 100644 src/applications/harbormaster/integration/HarbormasterHookHandler.php rename src/applications/harbormaster/{step => integration/buildkite}/HarbormasterBuildkiteBuildStepImplementation.php (100%) rename src/applications/harbormaster/{controller/HarbormasterBuildkiteHookController.php => integration/buildkite/HarbormasterBuildkiteHookHandler.php} (95%) rename src/applications/harbormaster/{step => integration/circleci}/HarbormasterCircleCIBuildStepImplementation.php (100%) rename src/applications/harbormaster/{controller/HarbormasterCircleCIHookController.php => integration/circleci/HarbormasterCircleCIHookHandler.php} (94%) diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 3eedd1605a..0b4fa88c48 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1478,13 +1478,13 @@ phutil_register_library_map(array( 'HarbormasterBuildableTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildableTransactionEditor.php', 'HarbormasterBuildableTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildableTransactionQuery.php', 'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php', - 'HarbormasterBuildkiteBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php', + 'HarbormasterBuildkiteBuildStepImplementation' => 'applications/harbormaster/integration/buildkite/HarbormasterBuildkiteBuildStepImplementation.php', 'HarbormasterBuildkiteBuildableInterface' => 'applications/harbormaster/interface/HarbormasterBuildkiteBuildableInterface.php', - 'HarbormasterBuildkiteHookController' => 'applications/harbormaster/controller/HarbormasterBuildkiteHookController.php', + 'HarbormasterBuildkiteHookHandler' => 'applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php', 'HarbormasterBuiltinBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterBuiltinBuildStepGroup.php', - 'HarbormasterCircleCIBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterCircleCIBuildStepImplementation.php', + 'HarbormasterCircleCIBuildStepImplementation' => 'applications/harbormaster/integration/circleci/HarbormasterCircleCIBuildStepImplementation.php', 'HarbormasterCircleCIBuildableInterface' => 'applications/harbormaster/interface/HarbormasterCircleCIBuildableInterface.php', - 'HarbormasterCircleCIHookController' => 'applications/harbormaster/controller/HarbormasterCircleCIHookController.php', + 'HarbormasterCircleCIHookHandler' => 'applications/harbormaster/integration/circleci/HarbormasterCircleCIHookHandler.php', 'HarbormasterConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterConduitAPIMethod.php', 'HarbormasterControlBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterControlBuildStepGroup.php', 'HarbormasterController' => 'applications/harbormaster/controller/HarbormasterController.php', @@ -1498,6 +1498,8 @@ phutil_register_library_map(array( 'HarbormasterExternalBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterExternalBuildStepGroup.php', 'HarbormasterFileArtifact' => 'applications/harbormaster/artifact/HarbormasterFileArtifact.php', 'HarbormasterHTTPRequestBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php', + 'HarbormasterHookController' => 'applications/harbormaster/controller/HarbormasterHookController.php', + 'HarbormasterHookHandler' => 'applications/harbormaster/integration/HarbormasterHookHandler.php', 'HarbormasterHostArtifact' => 'applications/harbormaster/artifact/HarbormasterHostArtifact.php', 'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterLeaseWorkingCopyBuildStepImplementation.php', 'HarbormasterLintMessagesController' => 'applications/harbormaster/controller/HarbormasterLintMessagesController.php', @@ -7727,10 +7729,10 @@ phutil_register_library_map(array( 'HarbormasterBuildableTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'HarbormasterBuildableViewController' => 'HarbormasterController', 'HarbormasterBuildkiteBuildStepImplementation' => 'HarbormasterBuildStepImplementation', - 'HarbormasterBuildkiteHookController' => 'HarbormasterController', + 'HarbormasterBuildkiteHookHandler' => 'HarbormasterHookHandler', 'HarbormasterBuiltinBuildStepGroup' => 'HarbormasterBuildStepGroup', 'HarbormasterCircleCIBuildStepImplementation' => 'HarbormasterBuildStepImplementation', - 'HarbormasterCircleCIHookController' => 'HarbormasterController', + 'HarbormasterCircleCIHookHandler' => 'HarbormasterHookHandler', 'HarbormasterConduitAPIMethod' => 'ConduitAPIMethod', 'HarbormasterControlBuildStepGroup' => 'HarbormasterBuildStepGroup', 'HarbormasterController' => 'PhabricatorController', @@ -7744,6 +7746,8 @@ phutil_register_library_map(array( 'HarbormasterExternalBuildStepGroup' => 'HarbormasterBuildStepGroup', 'HarbormasterFileArtifact' => 'HarbormasterArtifact', 'HarbormasterHTTPRequestBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterHookController' => 'HarbormasterController', + 'HarbormasterHookHandler' => 'Phobject', 'HarbormasterHostArtifact' => 'HarbormasterDrydockLeaseArtifact', 'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'HarbormasterBuildStepImplementation', 'HarbormasterLintMessagesController' => 'HarbormasterController', diff --git a/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php b/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php index 57f04e550b..6c499bf63a 100644 --- a/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php +++ b/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php @@ -94,10 +94,7 @@ final class PhabricatorHarbormasterApplication extends PhabricatorApplication { 'lint/' => array( '(?P\d+)/' => 'HarbormasterLintMessagesController', ), - 'hook/' => array( - 'circleci/' => 'HarbormasterCircleCIHookController', - 'buildkite/' => 'HarbormasterBuildkiteHookController', - ), + 'hook/(?P[^/]+)/' => 'HarbormasterHookController', 'log/' => array( 'view/(?P\d+)/(?:\$(?P\d+(?:-\d+)?))?' => 'HarbormasterBuildLogViewController', diff --git a/src/applications/harbormaster/controller/HarbormasterHookController.php b/src/applications/harbormaster/controller/HarbormasterHookController.php new file mode 100644 index 0000000000..8eb442bc41 --- /dev/null +++ b/src/applications/harbormaster/controller/HarbormasterHookController.php @@ -0,0 +1,21 @@ +getURIData('handler'); + $handler = HarbormasterHookHandler::getHandler($name); + + if (!$handler) { + throw new Exception(pht('No handler found for %s', $name)); + } + + return $handler->handleRequest($request); + } + +} diff --git a/src/applications/harbormaster/integration/HarbormasterHookHandler.php b/src/applications/harbormaster/integration/HarbormasterHookHandler.php new file mode 100644 index 0000000000..5b4aafa612 --- /dev/null +++ b/src/applications/harbormaster/integration/HarbormasterHookHandler.php @@ -0,0 +1,27 @@ +setAncestorClass(__CLASS__) + ->setUniqueMethod('getName') + ->execute(); + } + + public static function getHandler($handler) { + $base = idx(self::getHandlers(), $handler); + + if ($base) { + return (clone $base); + } + + return null; + } + + abstract public function getName(); + + abstract public function handleRequest(AphrontRequest $request); + +} diff --git a/src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php b/src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteBuildStepImplementation.php similarity index 100% rename from src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php rename to src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteBuildStepImplementation.php diff --git a/src/applications/harbormaster/controller/HarbormasterBuildkiteHookController.php b/src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php similarity index 95% rename from src/applications/harbormaster/controller/HarbormasterBuildkiteHookController.php rename to src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php index df50ea9126..2a29ceffa0 100644 --- a/src/applications/harbormaster/controller/HarbormasterBuildkiteHookController.php +++ b/src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php @@ -1,10 +1,10 @@