Skip to content

Commit 219d332

Browse files
committed
chore: Move HbaseCluster impl blocks
1 parent bbd3a71 commit 219d332

File tree

1 file changed

+177
-177
lines changed
  • rust/operator-binary/src/crd

1 file changed

+177
-177
lines changed

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

Lines changed: 177 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,183 @@ pub mod versioned {
159159
}
160160
}
161161

162+
impl HasStatusCondition for v1alpha1::HbaseCluster {
163+
fn conditions(&self) -> Vec<ClusterCondition> {
164+
match &self.status {
165+
Some(status) => status.conditions.clone(),
166+
None => vec![],
167+
}
168+
}
169+
}
170+
171+
impl v1alpha1::HbaseCluster {
172+
/// The name of the role-level load-balanced Kubernetes `Service`
173+
pub fn server_role_service_name(&self) -> Option<String> {
174+
self.metadata.name.clone()
175+
}
176+
177+
/// Metadata about a server rolegroup
178+
pub fn server_rolegroup_ref(
179+
&self,
180+
role_name: impl Into<String>,
181+
group_name: impl Into<String>,
182+
) -> RoleGroupRef<v1alpha1::HbaseCluster> {
183+
RoleGroupRef {
184+
cluster: ObjectRef::from_obj(self),
185+
role: role_name.into(),
186+
role_group: group_name.into(),
187+
}
188+
}
189+
190+
pub fn get_role(
191+
&self,
192+
role: &HbaseRole,
193+
) -> Option<&Role<HbaseConfigFragment, GenericRoleConfig, JavaCommonConfig>> {
194+
match role {
195+
HbaseRole::Master => self.spec.masters.as_ref(),
196+
HbaseRole::RegionServer => self.spec.region_servers.as_ref(),
197+
HbaseRole::RestServer => self.spec.rest_servers.as_ref(),
198+
}
199+
}
200+
201+
/// Get the RoleGroup struct for the given ref
202+
pub fn get_role_group(
203+
&self,
204+
rolegroup_ref: &RoleGroupRef<v1alpha1::HbaseCluster>,
205+
) -> Result<&RoleGroup<HbaseConfigFragment, JavaCommonConfig>, Error> {
206+
let role_variant =
207+
HbaseRole::from_str(&rolegroup_ref.role).with_context(|_| InvalidRoleSnafu {
208+
role: rolegroup_ref.role.to_owned(),
209+
})?;
210+
let role = self
211+
.get_role(&role_variant)
212+
.with_context(|| MissingHbaseRoleSnafu {
213+
role: role_variant.to_string(),
214+
})?;
215+
role.role_groups
216+
.get(&rolegroup_ref.role_group)
217+
.with_context(|| MissingHbaseRoleGroupSnafu {
218+
role_group: rolegroup_ref.role_group.to_owned(),
219+
})
220+
}
221+
222+
pub fn role_config(&self, role: &HbaseRole) -> Option<&GenericRoleConfig> {
223+
match role {
224+
HbaseRole::Master => self.spec.masters.as_ref().map(|m| &m.role_config),
225+
HbaseRole::RegionServer => self.spec.region_servers.as_ref().map(|rs| &rs.role_config),
226+
HbaseRole::RestServer => self.spec.rest_servers.as_ref().map(|rs| &rs.role_config),
227+
}
228+
}
229+
230+
pub fn has_kerberos_enabled(&self) -> bool {
231+
self.kerberos_secret_class().is_some()
232+
}
233+
234+
pub fn kerberos_secret_class(&self) -> Option<String> {
235+
self.spec
236+
.cluster_config
237+
.authentication
238+
.as_ref()
239+
.map(|a| &a.kerberos)
240+
.map(|k| k.secret_class.clone())
241+
}
242+
243+
pub fn has_https_enabled(&self) -> bool {
244+
self.https_secret_class().is_some()
245+
}
246+
247+
pub fn https_secret_class(&self) -> Option<String> {
248+
self.spec
249+
.cluster_config
250+
.authentication
251+
.as_ref()
252+
.map(|a| a.tls_secret_class.clone())
253+
}
254+
255+
/// Returns required port name and port number tuples depending on the role.
256+
/// Hbase versions 2.4.* will have three ports for each role
257+
/// Hbase versions 2.6.* will have two ports for each role. The metrics are available over the
258+
/// UI port.
259+
pub fn ports(&self, role: &HbaseRole, hbase_version: &str) -> Vec<(String, u16)> {
260+
let result_without_metric_port: Vec<(String, u16)> = match role {
261+
HbaseRole::Master => vec![
262+
("master".to_string(), HBASE_MASTER_PORT),
263+
(self.ui_port_name(), HBASE_MASTER_UI_PORT),
264+
],
265+
HbaseRole::RegionServer => vec![
266+
("regionserver".to_string(), HBASE_REGIONSERVER_PORT),
267+
(self.ui_port_name(), HBASE_REGIONSERVER_UI_PORT),
268+
],
269+
HbaseRole::RestServer => vec![
270+
(
271+
if self.has_https_enabled() {
272+
HBASE_REST_PORT_NAME_HTTPS
273+
} else {
274+
HBASE_REST_PORT_NAME_HTTP
275+
}
276+
.to_string(),
277+
HBASE_REST_PORT,
278+
),
279+
(self.ui_port_name(), HBASE_REST_UI_PORT),
280+
],
281+
};
282+
if hbase_version.starts_with(r"2.4") {
283+
result_without_metric_port
284+
.into_iter()
285+
.chain(vec![(METRICS_PORT_NAME.to_string(), METRICS_PORT)])
286+
.collect()
287+
} else {
288+
result_without_metric_port
289+
}
290+
}
291+
292+
/// Name of the port used by the Web UI, which depends on HTTPS usage
293+
fn ui_port_name(&self) -> String {
294+
if self.has_https_enabled() {
295+
HBASE_UI_PORT_NAME_HTTPS
296+
} else {
297+
HBASE_UI_PORT_NAME_HTTP
298+
}
299+
.to_string()
300+
}
301+
302+
/// Retrieve and merge resource configs for role and role groups
303+
pub fn merged_config(
304+
&self,
305+
role: &HbaseRole,
306+
role_group: &str,
307+
hdfs_discovery_cm_name: &str,
308+
) -> Result<HbaseConfig, Error> {
309+
// Initialize the result with all default values as baseline
310+
let conf_defaults = role.default_config(&self.name_any(), hdfs_discovery_cm_name);
311+
312+
let role = self.get_role(role).context(MissingHbaseRoleSnafu {
313+
role: role.to_string(),
314+
})?;
315+
316+
// Retrieve role resource config
317+
let mut conf_role = role.config.config.to_owned();
318+
319+
// Retrieve rolegroup specific resource config
320+
let mut conf_rolegroup = role
321+
.role_groups
322+
.get(role_group)
323+
.map(|rg| rg.config.config.clone())
324+
.unwrap_or_default();
325+
326+
// Merge more specific configs into default config
327+
// Hierarchy is:
328+
// 1. RoleGroup
329+
// 2. Role
330+
// 3. Default
331+
conf_role.merge(&conf_defaults);
332+
conf_rolegroup.merge(&conf_role);
333+
334+
tracing::debug!("Merged config: {:?}", conf_rolegroup);
335+
fragment::validate(conf_rolegroup).context(FragmentValidationFailureSnafu)
336+
}
337+
}
338+
162339
#[derive(Snafu, Debug)]
163340
pub enum Error {
164341
#[snafu(display("the role [{role}] is invalid and does not exist in HBase"))]
@@ -502,183 +679,6 @@ pub struct HbaseClusterStatus {
502679
pub conditions: Vec<ClusterCondition>,
503680
}
504681

505-
impl HasStatusCondition for v1alpha1::HbaseCluster {
506-
fn conditions(&self) -> Vec<ClusterCondition> {
507-
match &self.status {
508-
Some(status) => status.conditions.clone(),
509-
None => vec![],
510-
}
511-
}
512-
}
513-
514-
impl v1alpha1::HbaseCluster {
515-
/// The name of the role-level load-balanced Kubernetes `Service`
516-
pub fn server_role_service_name(&self) -> Option<String> {
517-
self.metadata.name.clone()
518-
}
519-
520-
/// Metadata about a server rolegroup
521-
pub fn server_rolegroup_ref(
522-
&self,
523-
role_name: impl Into<String>,
524-
group_name: impl Into<String>,
525-
) -> RoleGroupRef<v1alpha1::HbaseCluster> {
526-
RoleGroupRef {
527-
cluster: ObjectRef::from_obj(self),
528-
role: role_name.into(),
529-
role_group: group_name.into(),
530-
}
531-
}
532-
533-
pub fn get_role(
534-
&self,
535-
role: &HbaseRole,
536-
) -> Option<&Role<HbaseConfigFragment, GenericRoleConfig, JavaCommonConfig>> {
537-
match role {
538-
HbaseRole::Master => self.spec.masters.as_ref(),
539-
HbaseRole::RegionServer => self.spec.region_servers.as_ref(),
540-
HbaseRole::RestServer => self.spec.rest_servers.as_ref(),
541-
}
542-
}
543-
544-
/// Get the RoleGroup struct for the given ref
545-
pub fn get_role_group(
546-
&self,
547-
rolegroup_ref: &RoleGroupRef<v1alpha1::HbaseCluster>,
548-
) -> Result<&RoleGroup<HbaseConfigFragment, JavaCommonConfig>, Error> {
549-
let role_variant =
550-
HbaseRole::from_str(&rolegroup_ref.role).with_context(|_| InvalidRoleSnafu {
551-
role: rolegroup_ref.role.to_owned(),
552-
})?;
553-
let role = self
554-
.get_role(&role_variant)
555-
.with_context(|| MissingHbaseRoleSnafu {
556-
role: role_variant.to_string(),
557-
})?;
558-
role.role_groups
559-
.get(&rolegroup_ref.role_group)
560-
.with_context(|| MissingHbaseRoleGroupSnafu {
561-
role_group: rolegroup_ref.role_group.to_owned(),
562-
})
563-
}
564-
565-
pub fn role_config(&self, role: &HbaseRole) -> Option<&GenericRoleConfig> {
566-
match role {
567-
HbaseRole::Master => self.spec.masters.as_ref().map(|m| &m.role_config),
568-
HbaseRole::RegionServer => self.spec.region_servers.as_ref().map(|rs| &rs.role_config),
569-
HbaseRole::RestServer => self.spec.rest_servers.as_ref().map(|rs| &rs.role_config),
570-
}
571-
}
572-
573-
pub fn has_kerberos_enabled(&self) -> bool {
574-
self.kerberos_secret_class().is_some()
575-
}
576-
577-
pub fn kerberos_secret_class(&self) -> Option<String> {
578-
self.spec
579-
.cluster_config
580-
.authentication
581-
.as_ref()
582-
.map(|a| &a.kerberos)
583-
.map(|k| k.secret_class.clone())
584-
}
585-
586-
pub fn has_https_enabled(&self) -> bool {
587-
self.https_secret_class().is_some()
588-
}
589-
590-
pub fn https_secret_class(&self) -> Option<String> {
591-
self.spec
592-
.cluster_config
593-
.authentication
594-
.as_ref()
595-
.map(|a| a.tls_secret_class.clone())
596-
}
597-
598-
/// Returns required port name and port number tuples depending on the role.
599-
/// Hbase versions 2.4.* will have three ports for each role
600-
/// Hbase versions 2.6.* will have two ports for each role. The metrics are available over the
601-
/// UI port.
602-
pub fn ports(&self, role: &HbaseRole, hbase_version: &str) -> Vec<(String, u16)> {
603-
let result_without_metric_port: Vec<(String, u16)> = match role {
604-
HbaseRole::Master => vec![
605-
("master".to_string(), HBASE_MASTER_PORT),
606-
(self.ui_port_name(), HBASE_MASTER_UI_PORT),
607-
],
608-
HbaseRole::RegionServer => vec![
609-
("regionserver".to_string(), HBASE_REGIONSERVER_PORT),
610-
(self.ui_port_name(), HBASE_REGIONSERVER_UI_PORT),
611-
],
612-
HbaseRole::RestServer => vec![
613-
(
614-
if self.has_https_enabled() {
615-
HBASE_REST_PORT_NAME_HTTPS
616-
} else {
617-
HBASE_REST_PORT_NAME_HTTP
618-
}
619-
.to_string(),
620-
HBASE_REST_PORT,
621-
),
622-
(self.ui_port_name(), HBASE_REST_UI_PORT),
623-
],
624-
};
625-
if hbase_version.starts_with(r"2.4") {
626-
result_without_metric_port
627-
.into_iter()
628-
.chain(vec![(METRICS_PORT_NAME.to_string(), METRICS_PORT)])
629-
.collect()
630-
} else {
631-
result_without_metric_port
632-
}
633-
}
634-
635-
/// Name of the port used by the Web UI, which depends on HTTPS usage
636-
fn ui_port_name(&self) -> String {
637-
if self.has_https_enabled() {
638-
HBASE_UI_PORT_NAME_HTTPS
639-
} else {
640-
HBASE_UI_PORT_NAME_HTTP
641-
}
642-
.to_string()
643-
}
644-
645-
/// Retrieve and merge resource configs for role and role groups
646-
pub fn merged_config(
647-
&self,
648-
role: &HbaseRole,
649-
role_group: &str,
650-
hdfs_discovery_cm_name: &str,
651-
) -> Result<HbaseConfig, Error> {
652-
// Initialize the result with all default values as baseline
653-
let conf_defaults = role.default_config(&self.name_any(), hdfs_discovery_cm_name);
654-
655-
let role = self.get_role(role).context(MissingHbaseRoleSnafu {
656-
role: role.to_string(),
657-
})?;
658-
659-
// Retrieve role resource config
660-
let mut conf_role = role.config.config.to_owned();
661-
662-
// Retrieve rolegroup specific resource config
663-
let mut conf_rolegroup = role
664-
.role_groups
665-
.get(role_group)
666-
.map(|rg| rg.config.config.clone())
667-
.unwrap_or_default();
668-
669-
// Merge more specific configs into default config
670-
// Hierarchy is:
671-
// 1. RoleGroup
672-
// 2. Role
673-
// 3. Default
674-
conf_role.merge(&conf_defaults);
675-
conf_rolegroup.merge(&conf_role);
676-
677-
tracing::debug!("Merged config: {:?}", conf_rolegroup);
678-
fragment::validate(conf_rolegroup).context(FragmentValidationFailureSnafu)
679-
}
680-
}
681-
682682
pub fn merged_env(rolegroup_config: Option<&BTreeMap<String, String>>) -> Vec<EnvVar> {
683683
let merged_env: Vec<EnvVar> = if let Some(rolegroup_config) = rolegroup_config {
684684
let env_vars_from_config: BTreeMap<String, EnvVar> = rolegroup_config

0 commit comments

Comments
 (0)