Skip to content

Commit 55fbf95

Browse files
committed
added role/From impl for single opa role plus parsing test
1 parent 87f86ed commit 55fbf95

2 files changed

Lines changed: 45 additions & 11 deletions

File tree

rust/operator-binary/src/controller/mod.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,6 @@ impl ValidatedCluster {
104104
format!("{name}-{role}", name = self.name, role = OpaRole::Server)
105105
}
106106

107-
/// The single OPA role name (`server`).
108-
pub fn role_name() -> RoleName {
109-
RoleName::from_str(&OpaRole::Server.to_string())
110-
.expect("the server role name is a valid role name")
111-
}
112-
113107
/// Type-safe names for the per-cluster RBAC resources: the ServiceAccount shared by all
114108
/// Pods, its (namespaced) RoleBinding, and the operator-deployed ClusterRole it binds.
115109
pub fn cluster_resource_names(&self) -> role_utils::ResourceNames {
@@ -126,13 +120,13 @@ impl ValidatedCluster {
126120
) -> ResourceNames {
127121
ResourceNames {
128122
cluster_name: self.name.clone(),
129-
role_name: Self::role_name(),
123+
role_name: OpaRole::Server.into(),
130124
role_group_name: role_group_name.clone(),
131125
}
132126
}
133127

134128
pub fn recommended_labels(&self, role_group_name: &RoleGroupName) -> Labels {
135-
self.recommended_labels_for(&Self::role_name(), role_group_name)
129+
self.recommended_labels_for(&OpaRole::Server.into(), role_group_name)
136130
}
137131

138132
/// Recommended labels for a resource that is not tied to a concrete role,
@@ -164,12 +158,17 @@ impl ValidatedCluster {
164158

165159
/// Selector labels matching the pods of a role group.
166160
pub fn role_group_selector(&self, role_group_name: &RoleGroupName) -> Labels {
167-
role_group_selector(self, &product_name(), &Self::role_name(), role_group_name)
161+
role_group_selector(
162+
self,
163+
&product_name(),
164+
&OpaRole::Server.into(),
165+
role_group_name,
166+
)
168167
}
169168

170169
/// Selector labels matching all pods of the (single) OPA role.
171170
pub fn role_selector(&self) -> Labels {
172-
role_selector(self, &product_name(), &Self::role_name())
171+
role_selector(self, &product_name(), &OpaRole::Server.into())
173172
}
174173

175174
/// Returns an [`ObjectMetaBuilder`](stackable_operator::builder::meta::ObjectMetaBuilder)
@@ -307,3 +306,21 @@ impl ValidatedOpaConfig {
307306
}
308307
}
309308
}
309+
310+
#[cfg(test)]
311+
mod tests {
312+
use stackable_operator::v2::types::operator::RoleName;
313+
use strum::IntoEnumIterator;
314+
315+
use crate::crd::OpaRole;
316+
317+
/// Locks the invariant behind the `expect` in the `From<OpaRole> for RoleName` impls:
318+
/// every `OpaRole` variant (present and future) must serialise to a valid `RoleName`.
319+
#[test]
320+
fn every_opa_role_serialises_to_a_valid_role_name() {
321+
for role in OpaRole::iter() {
322+
let _: RoleName = (&role).into();
323+
let _: RoleName = role.into();
324+
}
325+
}
326+
}

rust/operator-binary/src/crd/mod.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::str::FromStr;
2+
13
use serde::{Deserialize, Serialize};
24
use stackable_operator::{
35
commons::{
@@ -21,7 +23,10 @@ use stackable_operator::{
2123
v2::{
2224
config_overrides::JsonConfigOverrides,
2325
role_utils::GenericCommonConfig,
24-
types::kubernetes::{ConfigMapName, SecretClassName},
26+
types::{
27+
kubernetes::{ConfigMapName, SecretClassName},
28+
operator::RoleName,
29+
},
2530
},
2631
versioned::versioned,
2732
};
@@ -254,6 +259,18 @@ pub enum OpaRole {
254259
Server,
255260
}
256261

262+
impl From<OpaRole> for RoleName {
263+
fn from(value: OpaRole) -> Self {
264+
RoleName::from_str(&value.to_string()).expect("an OpaRole is a valid role name")
265+
}
266+
}
267+
268+
impl From<&OpaRole> for RoleName {
269+
fn from(value: &OpaRole) -> Self {
270+
RoleName::from_str(&value.to_string()).expect("an OpaRole is a valid role name")
271+
}
272+
}
273+
257274
// TODO (@Techassi): Support versioned status
258275
#[derive(Clone, Default, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
259276
#[serde(rename_all = "camelCase")]

0 commit comments

Comments
 (0)