diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1168,6 +1168,7 @@ 'DrydockManagementUpdateResourceWorkflow' => 'applications/drydock/management/DrydockManagementUpdateResourceWorkflow.php', 'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php', 'DrydockObjectAuthorizationView' => 'applications/drydock/view/DrydockObjectAuthorizationView.php', + 'DrydockOperationWorkLogType' => 'applications/drydock/logtype/DrydockOperationWorkLogType.php', 'DrydockQuery' => 'applications/drydock/query/DrydockQuery.php', 'DrydockRepositoryOperation' => 'applications/drydock/storage/DrydockRepositoryOperation.php', 'DrydockRepositoryOperationController' => 'applications/drydock/controller/DrydockRepositoryOperationController.php', @@ -6575,6 +6576,7 @@ 'DrydockManagementUpdateResourceWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementWorkflow' => 'PhabricatorManagementWorkflow', 'DrydockObjectAuthorizationView' => 'AphrontView', + 'DrydockOperationWorkLogType' => 'DrydockLogType', 'DrydockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'DrydockRepositoryOperation' => array( 'DrydockDAO', diff --git a/src/applications/drydock/controller/DrydockBlueprintViewController.php b/src/applications/drydock/controller/DrydockBlueprintViewController.php --- a/src/applications/drydock/controller/DrydockBlueprintViewController.php +++ b/src/applications/drydock/controller/DrydockBlueprintViewController.php @@ -58,8 +58,11 @@ $log_query = id(new DrydockLogQuery()) ->withBlueprintPHIDs(array($blueprint->getPHID())); + $log_table = $this->buildLogTable($log_query) + ->setHideBlueprints(true); + $logs = $this->buildLogBox( - $log_query, + $log_table, $this->getApplicationURI("blueprint/{$id}/logs/query/all/")); $view = id(new PHUITwoColumnView()) diff --git a/src/applications/drydock/controller/DrydockController.php b/src/applications/drydock/controller/DrydockController.php --- a/src/applications/drydock/controller/DrydockController.php +++ b/src/applications/drydock/controller/DrydockController.php @@ -79,7 +79,7 @@ ->addRawContent($table); } - protected function buildLogBox(DrydockLogQuery $query, $all_uri) { + protected function buildLogTable(DrydockLogQuery $query) { $viewer = $this->getViewer(); $logs = $query @@ -89,9 +89,12 @@ $log_table = id(new DrydockLogListView()) ->setUser($viewer) - ->setLogs($logs) - ->render(); + ->setLogs($logs); + return $log_table; + } + + protected function buildLogBox(DrydockLogListView $log_table, $all_uri) { $log_header = id(new PHUIHeaderView()) ->setHeader(pht('Logs')) ->addActionLink( diff --git a/src/applications/drydock/controller/DrydockLeaseViewController.php b/src/applications/drydock/controller/DrydockLeaseViewController.php --- a/src/applications/drydock/controller/DrydockLeaseViewController.php +++ b/src/applications/drydock/controller/DrydockLeaseViewController.php @@ -43,8 +43,11 @@ $log_query = id(new DrydockLogQuery()) ->withLeasePHIDs(array($lease->getPHID())); + $log_table = $this->buildLogTable($log_query) + ->setHideLeases(true); + $logs = $this->buildLogBox( - $log_query, + $log_table, $this->getApplicationURI("lease/{$id}/logs/query/all/")); $crumbs = $this->buildApplicationCrumbs(); diff --git a/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php b/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php --- a/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php +++ b/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php @@ -50,8 +50,11 @@ $log_query = id(new DrydockLogQuery()) ->withOperationPHIDs(array($operation->getPHID())); + $log_table = $this->buildLogTable($log_query) + ->setHideOperations(true); + $logs = $this->buildLogBox( - $log_query, + $log_table, $this->getApplicationURI("operation/{$id}/logs/query/all/")); $view = id(new PHUITwoColumnView()) diff --git a/src/applications/drydock/controller/DrydockResourceViewController.php b/src/applications/drydock/controller/DrydockResourceViewController.php --- a/src/applications/drydock/controller/DrydockResourceViewController.php +++ b/src/applications/drydock/controller/DrydockResourceViewController.php @@ -48,8 +48,11 @@ $log_query = id(new DrydockLogQuery()) ->withResourcePHIDs(array($resource->getPHID())); - $log_box = $this->buildLogBox( - $log_query, + $log_table = $this->buildLogTable($log_query) + ->setHideResources(true); + + $logs = $this->buildLogBox( + $log_table, $this->getApplicationURI("resource/{$id}/logs/query/all/")); $crumbs = $this->buildApplicationCrumbs(); @@ -86,11 +89,12 @@ $view = id(new PHUITwoColumnView()) ->setHeader($header) ->setCurtain($curtain) - ->setMainColumn(array( - $object_box, - $lease_box, - $log_box, - )); + ->setMainColumn( + array( + $object_box, + $lease_box, + $logs, + )); return $this->newPage() ->setTitle($title) diff --git a/src/applications/drydock/logtype/DrydockOperationWorkLogType.php b/src/applications/drydock/logtype/DrydockOperationWorkLogType.php new file mode 100644 --- /dev/null +++ b/src/applications/drydock/logtype/DrydockOperationWorkLogType.php @@ -0,0 +1,19 @@ +getID(); - $handle->setName(pht('Drydock Repository Operation %d', $id)); + $handle->setName(pht('Repository Operation %d', $id)); $handle->setURI("/drydock/operation/{$id}/"); } } diff --git a/src/applications/drydock/storage/DrydockRepositoryOperation.php b/src/applications/drydock/storage/DrydockRepositoryOperation.php --- a/src/applications/drydock/storage/DrydockRepositoryOperation.php +++ b/src/applications/drydock/storage/DrydockRepositoryOperation.php @@ -25,6 +25,7 @@ private $repository = self::ATTACHABLE; private $object = self::ATTACHABLE; private $implementation = self::ATTACHABLE; + private $workingCopyLease = self::ATTACHABLE; public static function initializeNewOperation( DrydockRepositoryOperationType $op) { @@ -90,6 +91,19 @@ return $this->implementation; } + public function getWorkingCopyLease() { + return $this->assertAttached($this->workingCopyLease); + } + + public function attachWorkingCopyLease(DrydockLease $lease) { + $this->workingCopyLease = $lease; + return $this; + } + + public function hasWorkingCopyLease() { + return ($this->workingCopyLease !== self::ATTACHABLE); + } + public function getProperty($key, $default = null) { return idx($this->properties, $key, $default); } @@ -189,6 +203,29 @@ return $this->getProperty('exec.workingcopy.error'); } + public function logEvent($type, array $data = array()) { + $log = id(new DrydockLog()) + ->setEpoch(PhabricatorTime::getNow()) + ->setType($type) + ->setData($data); + + $log->setOperationPHID($this->getPHID()); + + if ($this->hasWorkingCopyLease()) { + $lease = $this->getWorkingCopyLease(); + $log->setLeasePHID($lease->getPHID()); + + $resource_phid = $lease->getResourcePHID(); + if ($resource_phid) { + $resource = $lease->getResource(); + + $log->setResourcePHID($resource->getPHID()); + $log->setBlueprintPHID($resource->getBlueprintPHID()); + } + } + + return $log->save(); + } /* -( PhabricatorPolicyInterface )----------------------------------------- */ diff --git a/src/applications/drydock/view/DrydockLogListView.php b/src/applications/drydock/view/DrydockLogListView.php --- a/src/applications/drydock/view/DrydockLogListView.php +++ b/src/applications/drydock/view/DrydockLogListView.php @@ -3,6 +3,46 @@ final class DrydockLogListView extends AphrontView { private $logs; + private $hideBlueprints; + private $hideResources; + private $hideLeases; + private $hideOperations; + + public function setHideBlueprints($hide_blueprints) { + $this->hideBlueprints = $hide_blueprints; + return $this; + } + + public function getHideBlueprints() { + return $this->hideBlueprints; + } + + public function setHideResources($hide_resources) { + $this->hideResources = $hide_resources; + return $this; + } + + public function getHideResources() { + return $this->hideResources; + } + + public function setHideLeases($hide_leases) { + $this->hideLeases = $hide_leases; + return $this; + } + + public function getHideLeases() { + return $this->hideLeases; + } + + public function setHideOperations($hide_operations) { + $this->hideOperations = $hide_operations; + return $this; + } + + public function getHideOperations() { + return $this->hideOperations; + } public function setLogs(array $logs) { assert_instances_of($logs, 'DrydockLog'); @@ -41,6 +81,13 @@ $lease = null; } + $operation_phid = $log->getOperationPHID(); + if ($operation_phid) { + $operation = $viewer->renderHandle($operation_phid); + } else { + $operation = null; + } + if ($log->isComplete()) { $type_key = $log->getType(); if (isset($types[$type_key])) { @@ -72,6 +119,7 @@ $blueprint, $resource, $lease, + $operation, id(new PHUIIconView())->setIcon($icon), $type, $data, @@ -86,13 +134,22 @@ pht('Blueprint'), pht('Resource'), pht('Lease'), + pht('Operation'), null, pht('Type'), pht('Data'), pht('Date'), )) + ->setColumnVisibility( + array( + !$this->getHideBlueprints(), + !$this->getHideResources(), + !$this->getHideLeases(), + !$this->getHideOperations(), + )) ->setColumnClasses( array( + '', '', '', '', diff --git a/src/applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php b/src/applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php --- a/src/applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php +++ b/src/applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php @@ -59,6 +59,10 @@ // No matter what happens here, destroy the lease away once we're done. $lease->setReleaseOnDestruction(true); + $operation->attachWorkingCopyLease($lease); + + $operation->logEvent(DrydockOperationWorkLogType::LOGCONST); + $operation->applyOperation($interface); } catch (PhabricatorWorkerYieldException $ex) {