utility cmds: add blobstore command to query blobstore for content

Summary: Useful utility that let's you f.e. fetch blob of data from manifold, decode it and show it to you

Reviewed By: jsgf

Differential Revision: D7779154

fbshipit-source-id: aaa4ae1d09b64f7f52c7942a51e8bb4ccc0cb700
This commit is contained in:
Lukas Piatkowski 2018-04-28 16:13:11 -07:00 committed by Facebook Github Bot
parent 346183fa8c
commit de31985b79

91
cmds/blobstore.rs Normal file
View File

@ -0,0 +1,91 @@
// Copyright (c) 2004-present, Facebook, Inc.
// All Rights Reserved.
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
#![deny(warnings)]
extern crate clap;
extern crate futures;
extern crate tokio_core;
extern crate blobrepo;
extern crate blobstore;
extern crate manifoldblob;
use clap::{App, Arg, SubCommand};
use futures::prelude::*;
use tokio_core::reactor::Core;
use blobrepo::RawNodeBlob;
use blobstore::Blobstore;
use manifoldblob::ManifoldBlob;
fn setup_app<'a, 'b>() -> App<'a, 'b> {
App::new("revlog to blob importer")
.version("0.0.0")
.about("make blobs")
.args_from_usage(
"--manifold-bucket [BUCKET] 'manifold bucket (default: mononoke_prod)' \
--manifold-prefix [PREFIX] 'manifold prefix (default empty)'",
)
.subcommand(
SubCommand::with_name("fetch")
.about("fetches blobs from manifold")
.args_from_usage("[KEY] 'key of the blob to be fetched'")
.arg(
Arg::with_name("decode_as")
.long("decode_as")
.short("d")
.takes_value(true)
.possible_values(&["raw_node_blob"])
.required(false)
.help("if provided decode the value"),
),
)
}
fn main() {
let matches = setup_app().get_matches();
let bucket = matches
.value_of("manifold-bucket")
.unwrap_or("mononoke_prod");
let prefix = matches.value_of("manifold-prefix").unwrap_or("");
let mut core = Core::new().unwrap();
let remote = core.remote();
let blobstore = ManifoldBlob::new_with_prefix(bucket, prefix, &remote);
let future = match matches.subcommand() {
("fetch", Some(sub_m)) => {
let key = sub_m.value_of("KEY").unwrap();
let decode_as = sub_m.value_of("decode_as");
blobstore.get(key.to_string()).map(move |value| {
println!("{:?}", value);
if let Some(value) = value {
match decode_as {
Some("raw_node_blob") => {
println!("{:?}", RawNodeBlob::deserialize(&value.into()));
}
_ => (),
}
}
})
}
_ => {
println!("{}", matches.usage());
::std::process::exit(1);
}
};
match core.run(future) {
Ok(()) => (),
Err(err) => {
println!("{:?}", err);
::std::process::exit(1);
}
}
}