Skip to content

Commit 0a718f1

Browse files
authored
Merge pull request #11 from mozilla/3-dockerflow-views
Add Dockerflow views (ref #3)
2 parents 460d4c3 + 295e3ea commit 0a718f1

File tree

3 files changed

+62
-5
lines changed

3 files changed

+62
-5
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Via environment variables:
2424
- `HOST`: host (default: `localhost`)
2525
- `PORT`: port number (default: `8080`)
2626
- `GEOIP_DB_PATH`: path to GeoIP database (default: `./GeoLite2-Country.mmdb`)
27+
- `VERSION_FILE`: path to `version.json` file (default: `./version.json`)
2728

2829
## Tests
2930

src/main.rs

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,22 @@
66
mod errors;
77
mod settings;
88

9-
use actix_web::{http, App, HttpRequest, HttpResponse};
9+
use actix_web::{http, App, FutureResponse, HttpRequest, HttpResponse};
1010
use chrono::{DateTime, Utc};
1111
use futures::Future;
1212
use maxminddb::{self, geoip2, MaxMindDBError};
1313
use serde::Serializer;
1414
use serde_derive::Serialize;
15-
use std::{net::IpAddr, path::PathBuf, process};
15+
use std::fs::File;
16+
use std::io::Read;
17+
use std::{net::IpAddr, net::Ipv4Addr, path::PathBuf, process};
1618

1719
use crate::{errors::ClassifyError, settings::Settings};
1820

1921
#[derive(Clone)]
2022
struct State {
2123
geoip: actix::Addr<GeoIpActor>,
24+
settings: settings::Settings,
2225
}
2326

2427
fn main() {
@@ -45,11 +48,16 @@ fn main() {
4548
})
4649
};
4750

48-
let state = State { geoip };
51+
let state = State { geoip, settings };
4952

50-
let addr = format!("{}:{}", settings.host, settings.port);
53+
let addr = format!("{}:{}", state.settings.host, state.settings.port);
5154
let server = actix_web::server::new(move || {
52-
App::with_state(state.clone()).resource("/", |r| r.get().f(index))
55+
App::with_state(state.clone())
56+
.resource("/", |r| r.get().f(index))
57+
// Dockerflow views
58+
.resource("/__lbheartbeat__", |r| r.get().f(lbheartbeat))
59+
.resource("/__heartbeat__", |r| r.get().f(heartbeat))
60+
.resource("/__version__", |r| r.get().f(version))
5361
})
5462
.bind(&addr)
5563
.unwrap_or_else(|err| panic!(format!("Couldn't listen on {}: {}", &addr, err)));
@@ -190,3 +198,49 @@ fn index(req: &HttpRequest<State>) -> Box<dyn Future<Item = HttpResponse, Error
190198
.map_err(|err| ClassifyError::from_source("Future failure", err)),
191199
)
192200
}
201+
202+
fn lbheartbeat(_req: &HttpRequest<State>) -> HttpResponse {
203+
HttpResponse::Ok().body("")
204+
}
205+
206+
#[derive(Serialize)]
207+
struct HeartbeatResponse {
208+
geoip: bool,
209+
}
210+
211+
fn heartbeat(req: &HttpRequest<State>) -> FutureResponse<HttpResponse> {
212+
let ip = IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4));
213+
214+
Box::new(
215+
req.state()
216+
.geoip
217+
.send(CountryForIp { ip })
218+
.and_then(|res| match res {
219+
Ok(country_info) => country_info
220+
.and_then(|country_info| country_info.country)
221+
.and_then(|country| country.iso_code)
222+
.and_then(|iso_code| Some(Ok(iso_code == "US".to_string())))
223+
.unwrap_or(Ok(false)),
224+
Err(_) => Ok(false),
225+
})
226+
.or_else(|_| Ok(false))
227+
.and_then(|res| {
228+
let mut resp = match res {
229+
true => HttpResponse::Ok(),
230+
false => HttpResponse::ServiceUnavailable(),
231+
};
232+
Ok(resp.json(HeartbeatResponse { geoip: res }))
233+
}),
234+
)
235+
}
236+
237+
fn version(req: &HttpRequest<State>) -> HttpResponse {
238+
let version_file = &req.state().settings.version_file;
239+
// Read the file or deliberately fail with a 500 if missing.
240+
let mut file = File::open(version_file).unwrap();
241+
let mut data = String::new();
242+
file.read_to_string(&mut data).unwrap();
243+
HttpResponse::Ok()
244+
.content_type("application/json")
245+
.body(data)
246+
}

src/settings.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub struct Settings {
77
pub host: String,
88
pub port: u16,
99
pub geoip_db_path: PathBuf,
10+
pub version_file: PathBuf,
1011
}
1112

1213
impl Default for Settings {
@@ -15,6 +16,7 @@ impl Default for Settings {
1516
host: "[::]".to_owned(),
1617
port: 8080,
1718
geoip_db_path: "./GeoLite2-Country.mmdb".into(),
19+
version_file: "./version.json".into(),
1820
}
1921
}
2022
}

0 commit comments

Comments
 (0)