Skip to content

Commit

Permalink
fix blob handlers; computes digest for layers
Browse files Browse the repository at this point in the history
Signed-off-by: Ciro S. Costa <cscosta@pivotal.io>
  • Loading branch information
Ciro S. Costa committed Mar 31, 2019
1 parent 830e917 commit cbe4b06
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 8 deletions.
21 changes: 17 additions & 4 deletions src/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ extern crate tempfile;

use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use std::io::Write;
use std::io::{Read, Write};
use std::path::{Path, PathBuf};
use tempfile::tempdir;

Expand Down Expand Up @@ -226,12 +226,25 @@ impl BlobStore {
// move each `layer` to the bucket
for layer in &manifest.layers {
let layer_tarball_path = tarball_directory.join(&layer);
let layer_digest = prepend_sha_scheme(DockerSavedManifest::layer_digest(&layer));
let layer_bucket_path = self.bucket_dir.join(&layer_digest);

println!("layer_tarball_path={}", layer_tarball_path.display());
// compute the digest

let mut layer_hasher = Sha256::new();
let mut layer_hasher_buf = [0; 1 << 12];
let mut layer_tarball_file =
std::fs::File::open(&layer_tarball_path).expect("couldn't open layer tarball");

loop {
match layer_tarball_file.read(&mut layer_hasher_buf) {
Ok(0) => break,
Ok(n) => layer_hasher.input(&layer_hasher_buf[0..n]),
Err(err) => panic!("damn! {}", err),
}
}

let layer_size = std::fs::metadata(&layer_tarball_path).unwrap().len();
let layer_digest = prepend_sha_scheme(&hex::encode(layer_hasher.result().as_slice()));
let layer_bucket_path = self.bucket_dir.join(&layer_digest);

assert!(std::fs::rename(layer_tarball_path, layer_bucket_path).is_ok());

Expand Down
23 changes: 19 additions & 4 deletions src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,26 +106,41 @@ mod parsing_tests {
}
}


const BLOBSTORE_PATH: &'static str = "/tmp/stuff1";

fn handle_registry_blobs(req: &Request<Body>) -> Option<Response<Body>> {
if req.method() != &Method::GET {
return None;
}

let _blob_info = match parse_blobs_path(req.uri().path()) {
let blob_info = match parse_blobs_path(req.uri().path()) {
Some(m) => m,
_ => return None,
};


let file_path = Path::new(BLOBSTORE_PATH)
.join("bucket")
.join(&blob_info.reference);

let blob_size = std::fs::metadata(&file_path).unwrap().len();

let file = FsPool::default().read(file_path, Default::default());

Some(
Response::builder()
.header("content-type", "application/octet-stream")
.header("docker-content-digest", blob_info.reference.as_bytes())
.header("content-length", blob_size)
.header("etag", blob_info.reference.as_bytes())
.header("docker-distribution-api-version", "registry/2.0")
.status(StatusCode::OK)
.body(Body::from("unimplemented yet"))
.body(Body::wrap_stream(file))
.unwrap(),
)
}

const BLOBSTORE_PATH: &'static str = "/tmp/stuff1";

/// Handles requests for manifests.
///
/// ```txt
Expand Down

0 comments on commit cbe4b06

Please sign in to comment.