Skip to content

Commit a2865f7

Browse files
committed
feat(mmds): Add metric to count GET requests with invalid tokens
In the previous commit, MMDS v1 was made to support token generation but a given token to GET request was not validated. Validates the token and increments a new metric `rx_invalid_token` if it is not valid. Signed-off-by: Takahiro Itazuri <[email protected]>
1 parent b1c208b commit a2865f7

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

src/vmm/src/logger/metrics.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,8 @@ pub struct MmdsMetrics {
556556
pub rx_accepted_unusual: SharedIncMetric,
557557
/// The number of buffers which couldn't be parsed as valid Ethernet frames by the MMDS.
558558
pub rx_bad_eth: SharedIncMetric,
559+
/// The number of GET requests with invalid tokens.
560+
pub rx_invalid_token: SharedIncMetric,
559561
/// The total number of successful receive operations by the MMDS.
560562
pub rx_count: SharedIncMetric,
561563
/// The total number of bytes sent by the MMDS.
@@ -579,6 +581,7 @@ impl MmdsMetrics {
579581
rx_accepted_err: SharedIncMetric::new(),
580582
rx_accepted_unusual: SharedIncMetric::new(),
581583
rx_bad_eth: SharedIncMetric::new(),
584+
rx_invalid_token: SharedIncMetric::new(),
582585
rx_count: SharedIncMetric::new(),
583586
tx_bytes: SharedIncMetric::new(),
584587
tx_count: SharedIncMetric::new(),

src/vmm/src/mmds/mod.rs

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use micro_http::{
1919
use serde_json::{Map, Value};
2020
use token_headers::{XMetadataToken, XMetadataTokenTtlSeconds};
2121

22+
use crate::logger::{IncMetric, METRICS};
2223
use crate::mmds::data_store::{Mmds, MmdsDatastoreError as MmdsError, MmdsVersion, OutputFormat};
2324
use crate::mmds::token::PATH_TO_TOKEN;
2425
use crate::mmds::token_headers::REJECTED_HEADER;
@@ -141,7 +142,17 @@ pub fn convert_to_response(mmds: Arc<Mutex<Mmds>>, request: Request) -> Response
141142
}
142143

143144
fn respond_to_get_request_v1(mmds: &Mmds, request: Request) -> Response {
144-
// TODO: Increments metrics that will be added in an upcoming commit.
145+
match XMetadataToken::from(request.headers.custom_entries()).0 {
146+
Some(token) => {
147+
if !mmds.is_valid_token(&token) {
148+
METRICS.mmds.rx_invalid_token.inc();
149+
}
150+
}
151+
None => {
152+
// TODO: Increment a metric that will be added in an upcoming commit.
153+
}
154+
}
155+
145156
respond_to_get_request(mmds, request)
146157
}
147158

@@ -164,12 +175,15 @@ fn respond_to_get_request_v2(mmds: &Mmds, request: Request) -> Response {
164175
// Validate the token.
165176
match mmds.is_valid_token(&token) {
166177
true => respond_to_get_request(mmds, request),
167-
false => build_response(
168-
request.http_version(),
169-
StatusCode::Unauthorized,
170-
MediaType::PlainText,
171-
Body::new(VmmMmdsError::InvalidToken.to_string()),
172-
),
178+
false => {
179+
METRICS.mmds.rx_invalid_token.inc();
180+
build_response(
181+
request.http_version(),
182+
StatusCode::Unauthorized,
183+
MediaType::PlainText,
184+
Body::new(VmmMmdsError::InvalidToken.to_string()),
185+
)
186+
}
173187
}
174188
}
175189

@@ -518,8 +532,10 @@ mod tests {
518532
Accept: application/json\r\n\r\n",
519533
MediaType::ApplicationJson,
520534
);
535+
let prev_rx_invalid_token = METRICS.mmds.rx_invalid_token.count();
521536
let actual_response = convert_to_response(mmds.clone(), request);
522537
assert_eq!(actual_response, expected_response);
538+
assert_eq!(prev_rx_invalid_token, METRICS.mmds.rx_invalid_token.count());
523539

524540
// Test valid v2 request.
525541
let request = Request::try_from(
@@ -543,8 +559,10 @@ mod tests {
543559
.as_bytes(),
544560
MediaType::ApplicationJson,
545561
);
562+
let prev_rx_invalid_token = METRICS.mmds.rx_invalid_token.count();
546563
let actual_response = convert_to_response(mmds.clone(), request);
547564
assert_eq!(actual_response, expected_response);
565+
assert_eq!(prev_rx_invalid_token, METRICS.mmds.rx_invalid_token.count());
548566

549567
// Test GET request with invalid token is accepted when v1 is configured.
550568
let (request, expected_response) = generate_request_and_expected_response(
@@ -553,8 +571,13 @@ mod tests {
553571
X-metadata-token: INVALID_TOKEN\r\n\r\n",
554572
MediaType::ApplicationJson,
555573
);
574+
let prev_rx_invalid_token = METRICS.mmds.rx_invalid_token.count();
556575
let actual_response = convert_to_response(mmds, request);
557576
assert_eq!(actual_response, expected_response);
577+
assert_eq!(
578+
prev_rx_invalid_token + 1,
579+
METRICS.mmds.rx_invalid_token.count()
580+
);
558581
}
559582

560583
#[test]
@@ -689,8 +712,10 @@ mod tests {
689712
.as_bytes(),
690713
MediaType::ApplicationJson,
691714
);
715+
let prev_rx_invalid_token = METRICS.mmds.rx_invalid_token.count();
692716
let actual_response = convert_to_response(mmds.clone(), request);
693717
assert_eq!(actual_response, expected_response);
718+
assert_eq!(prev_rx_invalid_token, METRICS.mmds.rx_invalid_token.count());
694719

695720
// Test invalid customer header value is ignored if not PUT request to /latest/api/token.
696721
#[rustfmt::skip]
@@ -784,8 +809,13 @@ mod tests {
784809
let mut expected_response = Response::new(Version::Http10, StatusCode::Unauthorized);
785810
expected_response.set_content_type(MediaType::PlainText);
786811
expected_response.set_body(Body::new(VmmMmdsError::InvalidToken.to_string()));
812+
let prev_rx_invalid_token = METRICS.mmds.rx_invalid_token.count();
787813
let actual_response = convert_to_response(mmds.clone(), request);
788814
assert_eq!(actual_response, expected_response);
815+
assert_eq!(
816+
prev_rx_invalid_token + 1,
817+
METRICS.mmds.rx_invalid_token.count()
818+
);
789819

790820
// Wait for the second token to expire.
791821
std::thread::sleep(Duration::from_secs(1));

tests/host_tools/fcmetrics.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ def validate_fc_metrics(metrics):
185185
"rx_accepted_err",
186186
"rx_accepted_unusual",
187187
"rx_bad_eth",
188+
"rx_invalid_token",
188189
"rx_count",
189190
"tx_bytes",
190191
"tx_count",

0 commit comments

Comments
 (0)