mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-19 13:22:42 +01:00
Implement artifact release for Harbormaster
Summary: Resolves T5836. This automatically releases artifacts when Harbormaster builds finish (either passing or failing). This allows Harbormaster to release the Drydock leases it has for hosts. Test Plan: Tested it with a build plan that passes and fails; tested it with lots of builds running in parallel. Reviewers: #blessed_reviewers, epriestley Reviewed By: #blessed_reviewers, epriestley Subscribers: epriestley, Korvin Maniphest Tasks: T5836 Differential Revision: https://secure.phabricator.com/D10208
This commit is contained in:
parent
d2111214f2
commit
aab0ed1c50
2 changed files with 51 additions and 0 deletions
|
@ -66,6 +66,9 @@ final class HarbormasterBuildEngine extends Phobject {
|
|||
$build->save();
|
||||
|
||||
$lock->unlock();
|
||||
|
||||
$this->releaseAllArtifacts($build);
|
||||
|
||||
throw $ex;
|
||||
}
|
||||
|
||||
|
@ -87,6 +90,11 @@ final class HarbormasterBuildEngine extends Phobject {
|
|||
if ($new_status != $old_status || $this->shouldForceBuildableUpdate()) {
|
||||
$this->updateBuildable($build->getBuildable());
|
||||
}
|
||||
|
||||
// If we are no longer building for any reason, release all artifacts.
|
||||
if (!$build->isBuilding()) {
|
||||
$this->releaseAllArtifacts($build);
|
||||
}
|
||||
}
|
||||
|
||||
private function updateBuild(HarbormasterBuild $build) {
|
||||
|
@ -115,6 +123,8 @@ final class HarbormasterBuildEngine extends Phobject {
|
|||
}
|
||||
|
||||
private function destroyBuildTargets(HarbormasterBuild $build) {
|
||||
$this->releaseAllArtifacts($build);
|
||||
|
||||
$targets = id(new HarbormasterBuildTargetQuery())
|
||||
->setViewer($this->getViewer())
|
||||
->withBuildPHIDs(array($build->getPHID()))
|
||||
|
@ -440,4 +450,27 @@ final class HarbormasterBuildEngine extends Phobject {
|
|||
}
|
||||
}
|
||||
|
||||
private function releaseAllArtifacts(HarbormasterBuild $build) {
|
||||
$targets = id(new HarbormasterBuildTargetQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withBuildPHIDs(array($build->getPHID()))
|
||||
->execute();
|
||||
|
||||
if (count($targets) === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$target_phids = mpull($targets, 'getPHID');
|
||||
|
||||
$artifacts = id(new HarbormasterBuildArtifactQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withBuildTargetPHIDs($target_phids)
|
||||
->execute();
|
||||
|
||||
foreach ($artifacts as $artifact) {
|
||||
$artifact->release();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -125,6 +125,24 @@ final class HarbormasterBuildArtifact extends HarbormasterDAO
|
|||
return $file;
|
||||
}
|
||||
|
||||
public function release() {
|
||||
switch ($this->getArtifactType()) {
|
||||
case self::TYPE_HOST:
|
||||
$this->releaseDrydockLease();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function releaseDrydockLease() {
|
||||
$lease = $this->loadDrydockLease();
|
||||
$resource = $lease->getResource();
|
||||
$blueprint = $resource->getBlueprint();
|
||||
|
||||
if ($lease->isActive()) {
|
||||
$blueprint->releaseLease($resource, $lease);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||
|
||||
|
|
Loading…
Reference in a new issue