Skip to main content

security_client_rs/fleet/
enrollment.rs

1//! Enrollment API keys, which let new agents join a policy.
2use std::fmt;
3
4use serde::Deserialize;
5use serde_json::Value;
6
7use super::{Fleet, FleetPage, Item};
8use crate::{Scope, http::Method, pagination::paginated, request::endpoint};
9
10/// A Fleet enrollment key for joining agents to a policy.
11/// Enrollment credentials are omitted from `Debug` output.
12#[derive(Clone, Deserialize)]
13#[non_exhaustive]
14pub struct EnrollmentKey {
15    /// Fleet resource ID used to retrieve or revoke this enrollment key.
16    pub id: String,
17    pub api_key_id: String,
18    /// Enrollment token passed to Elastic Agent.
19    pub api_key: String,
20    pub active: bool,
21    #[serde(default)]
22    pub policy_id: Option<String>,
23    #[serde(default)]
24    pub name: Option<String>,
25    #[serde(default)]
26    pub expire_at: Option<String>,
27}
28
29impl fmt::Debug for EnrollmentKey {
30    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31        f.debug_struct("EnrollmentKey")
32            .field("id", &self.id)
33            .field("active", &self.active)
34            .field("api_key", &"[redacted]")
35            .finish_non_exhaustive()
36    }
37}
38
39impl<'a> Fleet<'a> {
40    pub fn find_enrollment_keys(&self) -> FindEnrollmentKeys<'a> {
41        FindEnrollmentKeys(self.0.request(
42            Method::GET,
43            Scope::Space,
44            &["api", "fleet", "enrollment_api_keys"],
45        ))
46    }
47
48    pub fn get_enrollment_key(&self, id: &str) -> GetEnrollmentKey<'a> {
49        GetEnrollmentKey(self.0.request(
50            Method::GET,
51            Scope::Space,
52            &["api", "fleet", "enrollment_api_keys", id],
53        ))
54    }
55
56    pub fn create_enrollment_key(&self, policy_id: &str) -> CreateEnrollmentKey<'a> {
57        CreateEnrollmentKey(
58            self.0
59                .request(
60                    Method::POST,
61                    Scope::Space,
62                    &["api", "fleet", "enrollment_api_keys"],
63                )
64                .nonempty("policy_id", policy_id)
65                .field("policy_id", policy_id),
66        )
67    }
68
69    /// Revokes future enrollment. Already enrolled agents keep their own credentials.
70    pub fn revoke_enrollment_key(&self, id: &str) -> RevokeEnrollmentKey<'a> {
71        RevokeEnrollmentKey(self.0.request(
72            Method::DELETE,
73            Scope::Space,
74            &["api", "fleet", "enrollment_api_keys", id],
75        ))
76    }
77}
78
79endpoint! {
80    /// `GET /api/fleet/enrollment_api_keys`
81    FindEnrollmentKeys => FleetPage<EnrollmentKey>
82}
83
84endpoint! {
85    /// `GET /api/fleet/enrollment_api_keys/{keyId}`
86    GetEnrollmentKey => Item<EnrollmentKey>
87}
88
89endpoint! {
90    /// `POST /api/fleet/enrollment_api_keys`
91    CreateEnrollmentKey => Item<EnrollmentKey>
92}
93
94impl CreateEnrollmentKey<'_> {
95    pub fn name(self, name: &str) -> Self {
96        Self(self.0.field("name", name))
97    }
98
99    /// An Elastic duration after which the key expires, for example `24h`.
100    pub fn expiration(self, duration: &str) -> Self {
101        Self(self.0.field("expiration", duration))
102    }
103}
104
105endpoint! {
106    /// `DELETE /api/fleet/enrollment_api_keys/{keyId}`
107    RevokeEnrollmentKey => Value
108}
109
110page_setters!(FindEnrollmentKeys);
111paginated!(FindEnrollmentKeys => FleetPage<EnrollmentKey>);