diff --git a/docs/modules/hbase/pages/reference/discovery.adoc b/docs/modules/hbase/pages/reference/discovery.adoc index dc912fff..da2d7b98 100644 --- a/docs/modules/hbase/pages/reference/discovery.adoc +++ b/docs/modules/hbase/pages/reference/discovery.adoc @@ -37,6 +37,8 @@ The ConfigMap data values are formatted as Hadoop XML files which allows simple `hbase-site.xml`:: Contains the needed information to connect to Zookeeper and use that to establish a connection to HBase. +It also lists the master Pods in `hbase.client.bootstrap.servers`, which HBase 3.x clients use by default to connect (RPC-based connection registry). +These addresses are cluster-internal DNS names, so they only resolve for clients running inside the Kubernetes cluster. === Kerberos In case Kerberos is enabled according to the xref:usage-guide/security.adoc[security documentation], the discovery ConfigMap also includes the information that clients must authenticate themselves using Kerberos. diff --git a/rust/operator-binary/src/controller/build/properties/hbase_site.rs b/rust/operator-binary/src/controller/build/properties/hbase_site.rs index 68bca804..bb33ab64 100644 --- a/rust/operator-binary/src/controller/build/properties/hbase_site.rs +++ b/rust/operator-binary/src/controller/build/properties/hbase_site.rs @@ -4,10 +4,15 @@ use std::collections::BTreeMap; -use stackable_operator::v2::config_overrides::KeyValueConfigOverrides; +use stackable_operator::{ + utils::cluster_info::KubernetesClusterInfo, v2::config_overrides::KeyValueConfigOverrides, +}; use crate::{ - controller::build::{opa::HbaseOpaConfig, properties::build_xml_config}, + controller::{ + ValidatedCluster, + build::{opa::HbaseOpaConfig, properties::build_xml_config}, + }, crd::{ AnyServiceConfig, HBASE_CLUSTER_DISTRIBUTED, HBASE_MASTER_PORT, HBASE_MASTER_UI_PORT, HBASE_REGIONSERVER_PORT, HBASE_REGIONSERVER_UI_PORT, HBASE_ROOTDIR, HbaseRole, @@ -38,6 +43,42 @@ const ENV_HBASE_SERVICE_HOST: &str = "${env:HBASE_SERVICE_HOST}"; const ENV_HBASE_SERVICE_PORT: &str = "${env:HBASE_SERVICE_PORT}"; const ENV_HBASE_INFO_PORT: &str = "${env:HBASE_INFO_PORT}"; +/// Bootstrap nodes for the RPC-based connection registry, the client default since HBase 3.0.0. +/// HBase 2.x defaults to the ZooKeeper-based registry and does not read this key. +pub const HBASE_CLIENT_BOOTSTRAP_SERVERS: &str = "hbase.client.bootstrap.servers"; + +/// Lists every master Pod as `-...svc.:`. +/// +/// A role group's headless Service name is not sufficient: the client resolves each entry to a +/// single address and only fails over between entries, and the headless Service also publishes +/// not-ready Pods. +pub fn client_bootstrap_servers( + cluster: &ValidatedCluster, + cluster_info: &KubernetesClusterInfo, +) -> String { + let namespace = cluster.namespace.as_ref(); + let cluster_domain = &cluster_info.cluster_domain; + cluster + .role_group_configs + .get(&HbaseRole::Master) + .into_iter() + .flatten() + .flat_map(|(role_group_name, role_group)| { + let resource_names = + cluster.role_group_resource_names(&HbaseRole::Master, role_group_name); + let stateful_set = resource_names.stateful_set_name(); + let headless_service = resource_names.headless_service_name(); + // `None` leaves `replicas` unset on the StatefulSet, which Kubernetes defaults to 1 + (0..role_group.replicas.unwrap_or(1)).map(move |ordinal| { + format!( + "{stateful_set}-{ordinal}.{headless_service}.{namespace}.svc.{cluster_domain}:{HBASE_MASTER_PORT}" + ) + }) + }) + .collect::>() + .join(",") +} + /// Renders `hbase-site.xml`. pub fn build( role: &HbaseRole, @@ -45,6 +86,7 @@ pub fn build( zookeeper_config: BTreeMap, kerberos_config: BTreeMap, opa_config: Option<&HbaseOpaConfig>, + client_bootstrap_servers: String, overrides: KeyValueConfigOverrides, ) -> String { let mut config: BTreeMap = BTreeMap::new(); @@ -52,6 +94,10 @@ pub fn build( // Defaults config.insert(HBASE_CLUSTER_DISTRIBUTED.to_string(), "true".to_string()); config.insert(HBASE_ROOTDIR.to_string(), merged_config.hbase_rootdir()); + config.insert( + HBASE_CLIENT_BOOTSTRAP_SERVERS.to_string(), + client_bootstrap_servers, + ); config.extend(zookeeper_config); config.extend(kerberos_config); @@ -140,7 +186,71 @@ mod tests { use indoc::indoc; use super::*; - use crate::test_utils::{merged_config, validated_cluster}; + use crate::test_utils::{ + cluster_info, hbase_from_yaml, merged_config, validated_cluster, validated_cluster_from, + }; + + fn bootstrap_servers_for(masters_yaml: &str) -> String { + let hbase = hbase_from_yaml(&format!( + r#" +--- +apiVersion: hbase.stackable.tech/v1alpha1 +kind: HbaseCluster +metadata: + name: hbase + namespace: default + uid: c2c8c5c0-0b5a-4b1e-9f3e-1a2b3c4d5e6f +spec: + image: + productVersion: 2.6.3 + clusterConfig: + hdfsConfigMapName: simple-hdfs + zookeeperConfigMapName: simple-znode + masters: + roleGroups: +{masters_yaml} + regionServers: + roleGroups: + default: + replicas: 1 + restServers: + roleGroups: + default: + replicas: 1 +"# + )); + client_bootstrap_servers(&validated_cluster_from(&hbase), &cluster_info()) + } + + // The role-group lines are spliced under `roleGroups:` and must be 6 spaces deep, so they are + // written with explicit indentation (`indoc!` would strip it). + #[test] + fn bootstrap_servers_list_every_master_pod() { + let servers = bootstrap_servers_for( + " default:\n replicas: 2\n other:\n replicas: 1", + ); + assert_eq!( + servers, + "hbase-master-default-0.hbase-master-default-headless.default.svc.cluster.local:16000,\ + hbase-master-default-1.hbase-master-default-headless.default.svc.cluster.local:16000,\ + hbase-master-other-0.hbase-master-other-headless.default.svc.cluster.local:16000" + ); + } + + #[test] + fn bootstrap_servers_default_to_one_replica() { + let servers = bootstrap_servers_for(" default: {}"); + assert_eq!( + servers, + "hbase-master-default-0.hbase-master-default-headless.default.svc.cluster.local:16000" + ); + } + + #[test] + fn bootstrap_servers_skip_scaled_down_role_groups() { + let servers = bootstrap_servers_for(" default:\n replicas: 0"); + assert_eq!(servers, ""); + } #[test] fn renders_operator_defaults() { @@ -152,6 +262,7 @@ mod tests { BTreeMap::new(), BTreeMap::new(), None, + String::new(), KeyValueConfigOverrides::default(), ); assert!( @@ -178,6 +289,7 @@ mod tests { BTreeMap::new(), BTreeMap::new(), None, + String::new(), KeyValueConfigOverrides::default(), ); assert!( @@ -204,6 +316,7 @@ mod tests { BTreeMap::new(), BTreeMap::new(), None, + String::new(), KeyValueConfigOverrides::default(), ); assert!( @@ -214,6 +327,48 @@ mod tests { ); } + #[test] + fn renders_client_bootstrap_servers() { + let validated_cluster = validated_cluster(); + let merged = merged_config(&validated_cluster, &HbaseRole::RestServer); + let xml = build( + &HbaseRole::RestServer, + merged, + BTreeMap::new(), + BTreeMap::new(), + None, + "m-0.m-headless.ns.svc.cluster.local:16000".to_string(), + KeyValueConfigOverrides::default(), + ); + assert!( + xml.contains(indoc! {" + hbase.client.bootstrap.servers + m-0.m-headless.ns.svc.cluster.local:16000"}), + "{xml}" + ); + } + + #[test] + fn user_override_wins_for_client_bootstrap_servers() { + let validated_cluster = validated_cluster(); + let merged = merged_config(&validated_cluster, &HbaseRole::RestServer); + let xml = build( + &HbaseRole::RestServer, + merged, + BTreeMap::new(), + BTreeMap::new(), + None, + "m-0.m-headless.ns.svc.cluster.local:16000".to_string(), + [("hbase.client.bootstrap.servers", "custom:16000")].into(), + ); + assert!( + xml.contains(indoc! {" + hbase.client.bootstrap.servers + custom:16000"}), + "{xml}" + ); + } + #[test] fn user_override_wins() { let validated_cluster = validated_cluster(); @@ -224,6 +379,7 @@ mod tests { BTreeMap::new(), BTreeMap::new(), None, + String::new(), [("hbase.cluster.distributed", "false")].into(), ); assert!( diff --git a/rust/operator-binary/src/controller/build/resource/config_map.rs b/rust/operator-binary/src/controller/build/resource/config_map.rs index 08d5a6f0..ff3dec26 100644 --- a/rust/operator-binary/src/controller/build/resource/config_map.rs +++ b/rust/operator-binary/src/controller/build/resource/config_map.rs @@ -81,6 +81,7 @@ pub fn build_rolegroup_config_map( .as_hbase_settings(), kerberos::hbase_site_kerberos_config(cluster, cluster_info), cluster_config.hbase_opa_config.as_ref(), + hbase_site::client_bootstrap_servers(cluster, cluster_info), overrides.hbase_site_xml.clone(), ); diff --git a/rust/operator-binary/src/controller/build/resource/discovery.rs b/rust/operator-binary/src/controller/build/resource/discovery.rs index 018b7ac3..e7c6fe26 100644 --- a/rust/operator-binary/src/controller/build/resource/discovery.rs +++ b/rust/operator-binary/src/controller/build/resource/discovery.rs @@ -10,7 +10,8 @@ use crate::{ controller::{ ValidatedCluster, build::{ - kerberos, object_meta, properties::ConfigFileName, + kerberos, object_meta, + properties::{ConfigFileName, hbase_site}, recommended_labels_for_role_resources, }, }, @@ -34,10 +35,14 @@ pub fn build_discovery_config_map( ) -> Result { let cluster_config = &cluster.cluster_config; - let mut hbase_site = cluster_config + let mut hbase_site_config = cluster_config .zookeeper_connection_information .as_hbase_settings(); - hbase_site.extend(kerberos::discovery_kerberos_config(cluster, cluster_info)); + hbase_site_config.extend(kerberos::discovery_kerberos_config(cluster, cluster_info)); + hbase_site_config.insert( + hbase_site::HBASE_CLIENT_BOOTSTRAP_SERVERS.to_string(), + hbase_site::client_bootstrap_servers(cluster, cluster_info), + ); ConfigMapBuilder::new() .metadata( @@ -53,8 +58,86 @@ pub fn build_discovery_config_map( ) .add_data( ConfigFileName::HbaseSite.to_string(), - to_hadoop_xml(hbase_site.iter()), + to_hadoop_xml(hbase_site_config.iter()), ) .build() .context(BuildConfigMapSnafu) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_utils::{ + cluster_info, hbase_from_yaml, validated_cluster, validated_cluster_from, + }; + + #[test] + fn discovery_config_map_keeps_kerberos_settings_next_to_client_bootstrap_servers() { + let hbase = hbase_from_yaml( + r#" + apiVersion: hbase.stackable.tech/v1alpha1 + kind: HbaseCluster + metadata: + name: hbase + namespace: default + uid: c2c8c5c0-0b5a-4b1e-9f3e-1a2b3c4d5e6f + spec: + image: + productVersion: 2.6.3 + clusterConfig: + hdfsConfigMapName: simple-hdfs + zookeeperConfigMapName: simple-znode + authentication: + tlsSecretClass: tls + kerberos: + secretClass: kerberos-simple + masters: + roleGroups: + default: + replicas: 1 + regionServers: + roleGroups: + default: + replicas: 1 + restServers: + roleGroups: + default: + replicas: 1 + "#, + ); + let config_map = + build_discovery_config_map(&validated_cluster_from(&hbase), &cluster_info()) + .expect("discovery ConfigMap builds"); + let hbase_site = &config_map.data.expect("data is set")["hbase-site.xml"]; + assert!( + hbase_site.contains("hbase.security.authentication"), + "{hbase_site}" + ); + assert!( + hbase_site.contains("hbase.client.bootstrap.servers"), + "{hbase_site}" + ); + } + + #[test] + fn discovery_config_map_contains_client_bootstrap_servers() { + let config_map = build_discovery_config_map(&validated_cluster(), &cluster_info()) + .expect("discovery ConfigMap builds"); + let hbase_site = &config_map.data.expect("data is set")["hbase-site.xml"]; + assert!( + hbase_site.contains("hbase.client.bootstrap.servers"), + "{hbase_site}" + ); + assert!( + hbase_site.contains( + "hbase-master-default-0.hbase-master-default-headless.default.svc.cluster.local:16000" + ), + "{hbase_site}" + ); + // the existing ZooKeeper settings are still there + assert!( + hbase_site.contains("hbase.zookeeper.quorum"), + "{hbase_site}" + ); + } +} diff --git a/tests/templates/kuttl/kerberos/42-test-rest-server.yaml.j2 b/tests/templates/kuttl/kerberos/42-test-rest-server.yaml.j2 index 3c2c9052..a0f73eb6 100644 --- a/tests/templates/kuttl/kerberos/42-test-rest-server.yaml.j2 +++ b/tests/templates/kuttl/kerberos/42-test-rest-server.yaml.j2 @@ -20,7 +20,7 @@ commands: - /bin/bash - -c - | - status_code=\$(curl --write-out '%{http_code}' --silent --insecure --output /dev/null "https://hbase-restserver-default-headless:8080") + status_code=\$(curl --write-out '%{http_code}' --silent --insecure --output /dev/null "https://hbase-restserver-default-headless.$NAMESPACE.svc.cluster.local:8080") if [[ "\$status_code" -eq 401 ]] ; then echo "[PASS] Successfully got 401 as we did not authenticate" @@ -31,7 +31,7 @@ commands: kinit -kt /stackable/kerberos/keytab testuser/test-rest-server.$NAMESPACE.svc.cluster.local@{{ test_scenario['values']['kerberos-realm'] }} - status_code=\$(curl --write-out '%{http_code}' --silent --insecure --output /dev/null --negotiate --user : "https://hbase-restserver-default-headless:8080") + status_code=\$(curl --write-out '%{http_code}' --silent --insecure --output /dev/null --negotiate --user : "https://hbase-restserver-default-headless.$NAMESPACE.svc.cluster.local:8080") if [[ "\$status_code" -eq 200 ]] ; then echo "[PASS] Successfully got 200 as we did authenticate" diff --git a/tests/templates/kuttl/smoke/30-install-hbase.yaml.j2 b/tests/templates/kuttl/smoke/30-install-hbase.yaml.j2 index 8c28c42f..96ca3193 100644 --- a/tests/templates/kuttl/smoke/30-install-hbase.yaml.j2 +++ b/tests/templates/kuttl/smoke/30-install-hbase.yaml.j2 @@ -1,3 +1,5 @@ +{# Phoenix is only shipped in the HBase 2.x images (it does not support HBase 3.x yet) #} +{% set with_phoenix = test_scenario['values']['hbase'].split(',')[0].startswith('2.') %} --- apiVersion: hbase.stackable.tech/v1alpha1 kind: HbaseCluster @@ -28,10 +30,12 @@ spec: listenerClass: {{ test_scenario['values']['listener-class'] }} roleGroups: default: +{% if with_phoenix %} configOverrides: hbase-site.xml: phoenix.log.saltBuckets: "2" hbase.regionserver.wal.codec: "org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec" +{% endif %} replicas: 2 regionServers: config: @@ -41,10 +45,12 @@ spec: listenerClass: {{ test_scenario['values']['listener-class'] }} roleGroups: default: +{% if with_phoenix %} configOverrides: hbase-site.xml: phoenix.log.saltBuckets: "2" hbase.regionserver.wal.codec: "org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec" +{% endif %} replicas: 2 restServers: config: @@ -57,8 +63,10 @@ spec: limit: 1Gi roleGroups: default: +{% if with_phoenix %} configOverrides: hbase-site.xml: phoenix.log.saltBuckets: "2" hbase.regionserver.wal.codec: "org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec" +{% endif %} replicas: 2 diff --git a/tests/templates/kuttl/smoke/32_cm-test-hbase-master-default.yaml.j2 b/tests/templates/kuttl/smoke/32_cm-test-hbase-master-default.yaml.j2 index 0b95767e..09d623dc 100644 --- a/tests/templates/kuttl/smoke/32_cm-test-hbase-master-default.yaml.j2 +++ b/tests/templates/kuttl/smoke/32_cm-test-hbase-master-default.yaml.j2 @@ -1,3 +1,5 @@ +{# Phoenix is only shipped in the HBase 2.x images (it does not support HBase 3.x yet) #} +{% set with_phoenix = test_scenario['values']['hbase'].split(',')[0].startswith('2.') %} hbase-env.sh: | export HBASE_HEAPSIZE="819m" export HBASE_MANAGES_ZK="false" @@ -6,6 +8,10 @@ hbase-env.sh: | hbase-site.xml: |- + + hbase.client.bootstrap.servers + test-hbase-master-default-0.test-hbase-master-default-headless.__NAMESPACE__.svc.cluster.local:16000,test-hbase-master-default-1.test-hbase-master-default-headless.__NAMESPACE__.svc.cluster.local:16000 + hbase.client.rpc.bind.address false @@ -38,10 +44,12 @@ hbase-site.xml: |- hbase.master.port ${env:HBASE_SERVICE_PORT} +{% if with_phoenix %} hbase.regionserver.wal.codec org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec +{% endif %} hbase.rootdir /hbase @@ -54,10 +62,12 @@ hbase-site.xml: |- hbase.zookeeper.quorum test-zk-server.__NAMESPACE__.svc.cluster.local:2282 +{% if with_phoenix %} phoenix.log.saltBuckets 2 +{% endif %} zookeeper.znode.parent /znode-__ZNODE__/hbase diff --git a/tests/templates/kuttl/smoke/32_cm-test-hbase-regionserver-default.yaml.j2 b/tests/templates/kuttl/smoke/32_cm-test-hbase-regionserver-default.yaml.j2 index d3403faa..d9f65882 100644 --- a/tests/templates/kuttl/smoke/32_cm-test-hbase-regionserver-default.yaml.j2 +++ b/tests/templates/kuttl/smoke/32_cm-test-hbase-regionserver-default.yaml.j2 @@ -1,3 +1,5 @@ +{# Phoenix is only shipped in the HBase 2.x images (it does not support HBase 3.x yet) #} +{% set with_phoenix = test_scenario['values']['hbase'].split(',')[0].startswith('2.') %} hbase-env.sh: | export HBASE_HEAPSIZE="819m" export HBASE_MANAGES_ZK="false" @@ -6,6 +8,10 @@ hbase-env.sh: | hbase-site.xml: |- + + hbase.client.bootstrap.servers + test-hbase-master-default-0.test-hbase-master-default-headless.__NAMESPACE__.svc.cluster.local:16000,test-hbase-master-default-1.test-hbase-master-default-headless.__NAMESPACE__.svc.cluster.local:16000 + hbase.client.rpc.bind.address false @@ -34,10 +40,12 @@ hbase-site.xml: |- hbase.regionserver.port ${env:HBASE_SERVICE_PORT} +{% if with_phoenix %} hbase.regionserver.wal.codec org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec +{% endif %} hbase.rootdir /hbase @@ -54,10 +62,12 @@ hbase-site.xml: |- hbase.zookeeper.quorum test-zk-server.__NAMESPACE__.svc.cluster.local:2282 +{% if with_phoenix %} phoenix.log.saltBuckets 2 +{% endif %} zookeeper.znode.parent /znode-__ZNODE__/hbase diff --git a/tests/templates/kuttl/smoke/32_cm-test-hbase-restserver-default.yaml.j2 b/tests/templates/kuttl/smoke/32_cm-test-hbase-restserver-default.yaml.j2 index 03157245..0394e6cc 100644 --- a/tests/templates/kuttl/smoke/32_cm-test-hbase-restserver-default.yaml.j2 +++ b/tests/templates/kuttl/smoke/32_cm-test-hbase-restserver-default.yaml.j2 @@ -1,3 +1,5 @@ +{# Phoenix is only shipped in the HBase 2.x images (it does not support HBase 3.x yet) #} +{% set with_phoenix = test_scenario['values']['hbase'].split(',')[0].startswith('2.') %} hbase-env.sh: | export HBASE_HEAPSIZE="819m" export HBASE_MANAGES_ZK="false" @@ -6,6 +8,10 @@ hbase-env.sh: | hbase-site.xml: |- + + hbase.client.bootstrap.servers + test-hbase-master-default-0.test-hbase-master-default-headless.__NAMESPACE__.svc.cluster.local:16000,test-hbase-master-default-1.test-hbase-master-default-headless.__NAMESPACE__.svc.cluster.local:16000 + hbase.client.rpc.bind.address false @@ -14,10 +20,12 @@ hbase-site.xml: |- hbase.cluster.distributed true +{% if with_phoenix %} hbase.regionserver.wal.codec org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec +{% endif %} hbase.rest.endpoint ${env:HBASE_SERVICE_HOST}:${env:HBASE_SERVICE_PORT} @@ -34,10 +42,12 @@ hbase-site.xml: |- hbase.zookeeper.quorum test-zk-server.__NAMESPACE__.svc.cluster.local:2282 +{% if with_phoenix %} phoenix.log.saltBuckets 2 +{% endif %} zookeeper.znode.parent /znode-__ZNODE__/hbase diff --git a/tests/templates/kuttl/smoke/60-assert.yaml b/tests/templates/kuttl/smoke/60-assert.yaml.j2 similarity index 61% rename from tests/templates/kuttl/smoke/60-assert.yaml rename to tests/templates/kuttl/smoke/60-assert.yaml.j2 index f9176864..bd43face 100644 --- a/tests/templates/kuttl/smoke/60-assert.yaml +++ b/tests/templates/kuttl/smoke/60-assert.yaml.j2 @@ -1,3 +1,6 @@ +{# Phoenix is only shipped in the HBase 2.x images (it does not support HBase 3.x yet) #} +{% set with_phoenix = test_scenario['values']['hbase'].split(',')[0].startswith('2.') %} +{% if with_phoenix %} --- apiVersion: kuttl.dev/v1beta1 kind: TestAssert @@ -7,3 +10,4 @@ commands: - script: kubectl exec --namespace=$NAMESPACE -c hbase test-hbase-restserver-default-0 -- chmod +x /tmp/test_phoenix.sh - script: kubectl exec --namespace=$NAMESPACE -c hbase test-hbase-restserver-default-0 -- /tmp/test_phoenix.sh timeout: 480 +{% endif %} diff --git a/tests/templates/kuttl/smoke/60-test-phoenix.yaml b/tests/templates/kuttl/smoke/60-test-phoenix.yaml deleted file mode 100644 index 744a51c2..00000000 --- a/tests/templates/kuttl/smoke/60-test-phoenix.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - script: kubectl cp --namespace=$NAMESPACE -c hbase ./test_phoenix.sh test-hbase-restserver-default-0:/tmp diff --git a/tests/templates/kuttl/smoke/60-test-phoenix.yaml.j2 b/tests/templates/kuttl/smoke/60-test-phoenix.yaml.j2 new file mode 100644 index 00000000..7c2d0fc6 --- /dev/null +++ b/tests/templates/kuttl/smoke/60-test-phoenix.yaml.j2 @@ -0,0 +1,9 @@ +{# Phoenix is only shipped in the HBase 2.x images (it does not support HBase 3.x yet) #} +{% set with_phoenix = test_scenario['values']['hbase'].split(',')[0].startswith('2.') %} +{% if with_phoenix %} +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: kubectl cp --namespace=$NAMESPACE -c hbase ./test_phoenix.sh test-hbase-restserver-default-0:/tmp +{% endif %} diff --git a/tests/test-definition.yaml b/tests/test-definition.yaml index 9d98f40e..9482f8f9 100644 --- a/tests/test-definition.yaml +++ b/tests/test-definition.yaml @@ -2,19 +2,18 @@ dimensions: - name: hbase values: - - 2.6.4 - 2.6.6 + - 3.0.0 # To use a custom image, add a comma and the full name after the product version # - x.x.x,oci.stackable.tech/sandbox/hbase:x.x.x-stackable0.0.0-dev - name: hbase-opa values: - - 2.6.4 - - 2.6.6 + - 3.0.0 # To use a custom image, add a comma and the full name after the product version # - x.x.x,oci.stackable.tech/sandbox/hbase:x.x.x-stackable0.0.0-dev - name: hbase-latest values: - - 2.6.6 + - 3.0.0 # - x.x.x,oci.stackable.tech/sandbox/hbase:x.x.x-stackable0.0.0-dev - name: hdfs values: