public function destroyProject($flags = Runtime::DESTROY_FORCE_SOFT)
{
if (!isset($this->data['pid'])) {
return Promise::doResolve("Project was not needed to be destroyed, because it had not existed.");
}
$manager = $this;
$pid = $this->data['pid'];
$alias = $this->data['alias'];
$name = $this->data['name'];
if ($flags === Runtime::DESTROY_KEEP) {
return Promise::doReject(new ResourceOccupiedException("Project could not be destroyed with force level=DESTROY_KEEP."));
} else {
if ($flags === Runtime::DESTROY_FORCE_SOFT) {
$req = $this->createRequest($this->channel, $alias, new RuntimeCommand('container:destroy'));
return $req->call()->then(function ($value) use($manager) {
usleep(1000.0);
$manager->freeProject();
return $value;
});
} else {
if ($flags === Runtime::DESTROY_FORCE) {
return $this->destroyProject(Runtime::DESTROY_FORCE_SOFT)->then(null, function () use($manager) {
return $manager->destroyProject(Runtime::DESTROY_FORCE_HARD);
});
}
}
}
if (!$this->system->existsPid($pid)) {
return Promise::doResolve()->then(function () use($manager) {
$manager->freeProject();
return "Project was not needed to be destroyed, because it had not existed.";
});
} else {
if (!$this->system->kill($pid)) {
return Promise::doReject(new ResourceOccupiedException("Project could not be killed forcefully."));
}
}
return Promise::doResolve()->then(function () use($manager) {
$manager->freeProject();
return "Process has been destroyed!";
});
}