/** * @Route("/uploads/{uuid}", methods={"PUT"}, name="layer_upload", requirements={"uuid"="[0-9a-z-]+"}) * * @ParamConverter(name="repository", options={"mapping": {"name": "name"}}) * @ParamConverter(name="layer", options={"mapping": {"uuid": "uuid"}}) * * @Security("is_granted('REPO_WRITE', repository)") * * @link http://docs.docker.com/registry/spec/api/#uploading-the-layer */ public function uploadAction(Request $request, Repository $repository, Layer $layer) { if (Layer::STATUS_COMPLETE === $layer->getStatus()) { throw new BadRequestHttpException(sprintf('Layer with uuid "%s" has already been uploaded', $layer->getUuid())); } $finalUpload = $request->query->has('digest'); // TODO: manage chunked uploads $this->get('layer_manager')->write($layer, $request->getContent(true)); if (!$finalUpload) { $layer->setStatus(Layer::STATUS_PARTIAL); return new Response('', Response::HTTP_ACCEPTED, ['Location' => $this->generateUrl('layer_upload', ['name' => $repository->getName(), 'uuid' => $layer->getUuid()], true), 'Docker-Upload-UUID' => $layer->getUuid()]); } $digest = $this->get('layer_manager')->computeDigest($layer); if ($digest !== $request->query->get('digest')) { throw new BadRequestHttpException(sprintf('Digest does not match with received data (computed: "%s")', $digest)); } $layer->setDigest($digest); $this->get('layer_manager')->save($layer); return new Response('', Response::HTTP_CREATED, ['Location' => $this->generateUrl('layer_get', ['name' => $repository->getName(), 'digest' => $layer->getDigest()], true), 'Docker-Content-Digest' => $layer->getDigest()]); }
public function getContentPath(Layer $layer) { return $this->storagePath . '/layers/' . $layer->getUuid(); }