Skip to content

Commit 040a6f5

Browse files
committed
successfully create driver and executors
1 parent 6e6a828 commit 040a6f5

File tree

17 files changed

+49
-384
lines changed

17 files changed

+49
-384
lines changed

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

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,7 @@ use crate::{
7272
#[strum_discriminants(derive(IntoStaticStr))]
7373
#[allow(clippy::enum_variant_names)]
7474
pub enum Error {
75-
#[snafu(display("missing secret lifetime"))]
76-
MissingSecretLifetime,
77-
78-
#[snafu(display("object has no namespace"))]
75+
#[snafu(display("spark connect object has no namespace"))]
7976
ObjectHasNoNamespace,
8077

8178
#[snafu(display("invalid config map {name}"))]
@@ -271,17 +268,6 @@ pub async fn reconcile(
271268
.context(ProductConfigValidationSnafu)?
272269
.iter()
273270
{
274-
let service = build_service(
275-
scs,
276-
&resolved_product_image.app_version_label,
277-
role_name,
278-
None,
279-
)?;
280-
cluster_resources
281-
.add(client, service)
282-
.await
283-
.context(ApplyServiceSnafu)?;
284-
285271
for (rolegroup_name, rolegroup_config) in role_config.iter() {
286272
let rgr = RoleGroupRef {
287273
cluster: ObjectRef::from_obj(scs),
@@ -515,7 +501,12 @@ fn build_stateful_set(
515501
"pipefail".to_string(),
516502
"-c".to_string(),
517503
])
518-
.args(command_args(resolved_product_image))
504+
.args(command_args(
505+
rolegroupref.object_name().as_ref(),
506+
scs.namespace().context(ObjectHasNoNamespaceSnafu)?.as_ref(),
507+
resolved_product_image,
508+
serviceaccount,
509+
))
519510
.add_container_port("grpc", CONNECT_GRPC_PORT)
520511
.add_container_port("http", CONNECT_UI_PORT)
521512
.add_container_port("metrics", METRICS_PORT.into())
@@ -669,15 +660,41 @@ fn spark_defaults(
669660
Ok("".to_string())
670661
}
671662

672-
fn command_args(pi: &ResolvedProductImage) -> Vec<String> {
673-
let mut command = vec![];
674-
663+
fn command_args(
664+
rgr_name: &str,
665+
namespace: &str,
666+
pi: &ResolvedProductImage,
667+
service_account: &ServiceAccount,
668+
) -> Vec<String> {
675669
let spark_version = pi.product_version.clone();
676-
command.extend(vec![
677-
format!("containerdebug --output={VOLUME_MOUNT_PATH_LOG}/containerdebug-state.json --loop &"),
678-
format!("/stackable/spark/sbin/start-connect-server.sh --packages org.apache.spark:spark-connect_2.12:{spark_version} --properties-file {VOLUME_MOUNT_PATH_CONFIG}/{SPARK_DEFAULTS_FILE_NAME}"),
679-
]);
680-
vec![command.join("\n")]
670+
let spark_image = pi.image.clone();
671+
let service_account_name = service_account.name_unchecked();
672+
673+
let command = [
674+
// ---------- start containerdebug
675+
format!(
676+
"containerdebug --output={VOLUME_MOUNT_PATH_LOG}/containerdebug-state.json --loop &"
677+
),
678+
// ---------- start spark connect server
679+
"/stackable/spark/sbin/start-connect-server.sh".to_string(),
680+
"--deploy-mode client".to_string(), // 'cluster' mode not supported
681+
format!("--name {rgr_name}"),
682+
"--master k8s://https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}"
683+
.to_string(),
684+
// This needs to match the name of the headless service for the executors to be able
685+
// to connect back to the driver.
686+
format!("--conf spark.driver.host={rgr_name}"),
687+
"--conf spark.kubernetes.driver.pod.name=${HOSTNAME}".to_string(),
688+
format!("--conf spark.kubernetes.container.image={spark_image}"),
689+
format!("--conf spark.kubernetes.namespace={namespace}"),
690+
format!(
691+
"--conf spark.kubernetes.authenticate.driver.serviceAccountName={service_account_name}"
692+
),
693+
format!("--packages org.apache.spark:spark-connect_2.12:{spark_version}"),
694+
format!("--properties-file {VOLUME_MOUNT_PATH_CONFIG}/{SPARK_DEFAULTS_FILE_NAME}"),
695+
];
696+
697+
vec![command.join(" ")]
681698
}
682699

683700
fn labels<'a, T>(

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,13 @@ impl v1alpha1::SparkConnectServer {
263263
"SPARK_DAEMON_CLASSPATH".to_string(),
264264
"/stackable/spark/extra-jars/*".to_string(),
265265
),
266-
// TODO: There is no SPARK_CONNECT_OPTS env var.
266+
// There is no SPARK_CONNECT_OPTS env var.
267267
("SPARK_DAEMON_JAVA_OPTS".to_string(), connect_jvm_args),
268+
// TODO: remove when this is done in the image
269+
(
270+
"JAVA_HOME".to_string(),
271+
"/usr/lib/jvm/java-17-openjdk".to_string(),
272+
),
268273
]);
269274

270275
envs.extend(role.config.env_overrides.clone());
@@ -362,7 +367,7 @@ impl ConnectConfig {
362367
max: Some(Quantity("1".to_owned())),
363368
},
364369
memory: MemoryLimitsFragment {
365-
limit: Some(Quantity("512Mi".to_owned())),
370+
limit: Some(Quantity("1024Mi".to_owned())),
366371
runtime_limits: NoRuntimeLimitsFragment {},
367372
},
368373
storage: ConnectStorageConfigFragment {},

tests/templates/kuttl/spark-connect/00-secrets.yaml.j2

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,6 @@ stringData:
1919
accessKey: spark
2020
secretKey: sparkspark
2121
---
22-
apiVersion: secrets.stackable.tech/v1alpha1
23-
kind: SecretClass
24-
metadata:
25-
name: history-credentials-class
26-
spec:
27-
backend:
28-
k8sSearch:
29-
searchNamespace:
30-
pod: {}
31-
---
32-
apiVersion: v1
33-
kind: Secret
34-
metadata:
35-
name: history-credentials
36-
labels:
37-
secrets.stackable.tech/class: history-credentials-class
38-
stringData:
39-
accessKey: spark
40-
secretKey: sparkspark
41-
---
4222
apiVersion: v1
4323
kind: Secret
4424
metadata:
@@ -51,28 +31,3 @@ stringData:
5131
disabled=false
5232
policies=readwrite,consoleAdmin,diagnostics
5333
setPolicies=false
54-
55-
{% if test_scenario['values']['s3-use-tls'] == 'true' %}
56-
---
57-
apiVersion: secrets.stackable.tech/v1alpha1
58-
kind: SecretClass
59-
metadata:
60-
name: minio-tls-eventlog
61-
spec:
62-
backend:
63-
k8sSearch:
64-
searchNamespace:
65-
pod: {}
66-
---
67-
apiVersion: v1
68-
kind: Secret
69-
metadata:
70-
name: minio-tls-eventlog
71-
labels:
72-
secrets.stackable.tech/class: minio-tls-eventlog
73-
# Have a look at the folder certs on how to create this: ensure the common name matches the minio instance!
74-
data:
75-
ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQyVENDQXNHZ0F3SUJBZ0lVZEhBWE16UHJaTGx1TURPNlhrT1ozQUdJaGlzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2V6RUxNQWtHQTFVRUJoTUNSRVV4R3pBWkJnTlZCQWdNRWxOamFHeGxjM2RwWnkxSWIyeHpkR1ZwYmpFTwpNQXdHQTFVRUJ3d0ZWMlZrWld3eEtEQW1CZ05WQkFvTUgxTjBZV05yWVdKc1pTQlRhV2R1YVc1bklFRjFkR2h2CmNtbDBlU0JKYm1NeEZUQVRCZ05WQkFNTURITjBZV05yWVdKc1pTNWtaVEFnRncweU16QTJNVGt4TlRJek16UmEKR0E4eU1USXpNRFV5TmpFMU1qTXpORm93ZXpFTE1Ba0dBMVVFQmhNQ1JFVXhHekFaQmdOVkJBZ01FbE5qYUd4bApjM2RwWnkxSWIyeHpkR1ZwYmpFT01Bd0dBMVVFQnd3RlYyVmtaV3d4S0RBbUJnTlZCQW9NSDFOMFlXTnJZV0pzClpTQlRhV2R1YVc1bklFRjFkR2h2Y21sMGVTQkpibU14RlRBVEJnTlZCQU1NREhOMFlXTnJZV0pzWlM1a1pUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOR0Jqang2K1lCSm1jOUJaeE5QdnlnRwo2b3VGWFNlajBFWVFISlRyQStZWW5VeGV4eEwyYUU2R2hHTEJWTEYzYkFpUXErbUV0WDlZZGdaRFhBTy9aS1N6Cjl5dXBXY2dkR1B0Uk9qQ0RYdE1SY1pWNFhBRVNsODBRZkVhL041U2ZjTHJBM0JNNWp3YzlrcGR5TXgzOWJkbEEKRExvMlN2d0czTmdOeUpWZkRaS2N5MExFZThnaHFOVFcwSHhKN3FMdHFhb0cycVl2SUVUaDUyd3RzOTUyYlZWMgo3aW9kOUhZWUx2dzFVdzQ1bXM4bXViYldVTHNRMXNORmxRTDAvOU1SakdMREM2RHc5NW9wMzA4MkxXU0NHZ0JMCis4eCtCVTVoUFRGeDN6VFZDVFI1WCtvS0Y4SjlOREZmcjVLK1lUZE5QMG5PRUdOcXcrdDBQcWYyR3N4MWFnOEMKQXdFQUFhTlRNRkV3SFFZRFZSME9CQllFRkFNMFNKaTB3WWpIcWwzVDYwVk0xb251VWhCTk1COEdBMVVkSXdRWQpNQmFBRkFNMFNKaTB3WWpIcWwzVDYwVk0xb251VWhCTk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnRUJBRXVsdzVqeUlpQmFNNHVzSlFaYUNoV1BPZlFqbzBoRGNFL2REWnZNSjVhMEF4WEkKWHFOd284c3B1WlAzSkY4cks3SlpmYmdKcjJzV2FYUFZCR3hENk56WTBpTWhCMTFQNVZOZ3JpczFFeDJCTmZCdQpGSitvUHdjNnBGWjVsbTl3SVpKRk9USXk1djRyOG1tVCtscnFSYzZERG1LWlpCWVB0NVE1a1pXQm54TmlLTGVHCnVaYXhONFVCRnBLdlpqOHdRMi81amxGWXh6R3Z3NjRPVTIvN3N0NGJuU2NWbEhYa0cvWHJsYVg4NmJoREFUcDYKeEtsQWxhMkJEeVhJRWs1R2Rma2lmTG1VRTZZSGozUUJBd0prMkFYQTNMaElGY2NxRkNwclFLblpJcHNuSjRzMwprNXZSWDVibWkyUGhLc2Y3bmR5M0tMaHVUYlBQcnE2UGtuZkpzd3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
76-
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQyakNDQXNLZ0F3SUJBZ0lVRlI3RHEvdlhUSUpXcEE2MEppL0paUTFKRzlVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2V6RUxNQWtHQTFVRUJoTUNSRVV4R3pBWkJnTlZCQWdNRWxOamFHeGxjM2RwWnkxSWIyeHpkR1ZwYmpFTwpNQXdHQTFVRUJ3d0ZWMlZrWld3eEtEQW1CZ05WQkFvTUgxTjBZV05yWVdKc1pTQlRhV2R1YVc1bklFRjFkR2h2CmNtbDBlU0JKYm1NeEZUQVRCZ05WQkFNTURITjBZV05yWVdKc1pTNWtaVEFnRncweU16QTJNVGt4TlRJek16UmEKR0E4eU1USXpNRFV5TmpFMU1qTXpORm93WnpFTE1Ba0dBMVVFQmhNQ1JFVXhHekFaQmdOVkJBZ01FbE5qYUd4bApjM2RwWnkxSWIyeHpkR1ZwYmpFT01Bd0dBMVVFQnd3RlYyVmtaV3d4RWpBUUJnTlZCQW9NQ1ZOMFlXTnJZV0pzClpURVhNQlVHQTFVRUF3d09aWFpsYm5Sc2IyY3RiV2x1YVc4d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUIKRHdBd2dnRUtBb0lCQVFESFN6NEJ5UzRORjM0emhleXBDMllsTCt5VEtEbC9WQVBEaHF1dE5TZTh2MkdzdXJZdgpDVDdjZmw2MzFETHc5eHc4NlVDRzVKMVc3a25uZGNlMExEcGhwWmNiUVUzcVNMcisxRG1HdHc5MWdKclFoREg5CjhiZXgxbkN1NExVSllWdldCVGg2TUNhdFVkYmdvb09DNGExdHJmeDJ5VHhDZEZ5cVlHUm1SeU9oNVFxZEF1VlIKWjV0bG9FU1BJRFVJVnhVQk1iZ1BlbUt6L0hhK2xkcDhkVzZTS1ZqWml1TnZxaTI5UkU0bUNyLzR4TXlMZWwwVgp1TllNcHFPcVprWEczbVpqVWhsRWpSSThJMSs1OU13WVBYZVowS1hKK2J6cmw4SWZVNU15NkZHRkkvalovVXBxCnIxcitOYU9zWmY4MXMvK0dyUi95UkJ2bkNaWlBOS0tpVWFpUkFnTUJBQUdqYURCbU1DUUdBMVVkRVFRZE1CdUMKRG1WMlpXNTBiRzluTFcxcGJtbHZnZ2xzYjJOaGJHaHZjM1F3SFFZRFZSME9CQllFRk55aTMrb0ZRNHpKaWdCdQo2VjJEejVWNnB6Z09NQjhHQTFVZEl3UVlNQmFBRkFNMFNKaTB3WWpIcWwzVDYwVk0xb251VWhCTk1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUURIeEhJNzZoZUt1cndBRUZQelVoNjdiT2ViM0UxeGtyb0RnR29ZZzIyOWJCVXgKS0JPZWJvUUhuK0JjTEtCeUFXcEphWnBIajAzTldOS0IxcTM4YUx6UXpqbkhlMDZCWU9IQ1kwRFJsREZ1YlhnMgpUQXQyb25vN1ZWNStVTnNGSU5ONnFuWFlDSnV3L2N2WnJVZ3p2MXI5dDJyWnhHVllaVWppeEJRMjRrK0hsdnlGClN6WnBjU3Y1ZlRPMGd6ZUJTaEZkR09FME1HU0x5RGZoT1ZoZGRhanRyN0E1NEVITFFkME5BcXNKQjB3blo4eEgKZWZ4VGhZTktxZEJkaitZd0xGMFk0TWtDaGYva2t4dEhLT012Q2lBS0F3YkEwZ25hT0RDeEd2VEZiSFFFOW5zMgpCQUZqblZKNGh3aTQzeDkxOTFjQnVqOGdZQkdpaUh1NCtGRlNXMXNSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
77-
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRREhTejRCeVM0TkYzNHoKaGV5cEMyWWxMK3lUS0RsL1ZBUERocXV0TlNlOHYyR3N1cll2Q1Q3Y2ZsNjMxREx3OXh3ODZVQ0c1SjFXN2tubgpkY2UwTERwaHBaY2JRVTNxU0xyKzFEbUd0dzkxZ0pyUWhESDk4YmV4MW5DdTRMVUpZVnZXQlRoNk1DYXRVZGJnCm9vT0M0YTF0cmZ4MnlUeENkRnlxWUdSbVJ5T2g1UXFkQXVWUlo1dGxvRVNQSURVSVZ4VUJNYmdQZW1Lei9IYSsKbGRwOGRXNlNLVmpaaXVOdnFpMjlSRTRtQ3IvNHhNeUxlbDBWdU5ZTXBxT3Faa1hHM21aalVobEVqUkk4STErNQo5TXdZUFhlWjBLWEorYnpybDhJZlU1TXk2RkdGSS9qWi9VcHFyMXIrTmFPc1pmODFzLytHclIveVJCdm5DWlpQCk5LS2lVYWlSQWdNQkFBRUNnZ0VBQVNTUUFHYit2dXZaSVJyaDc1bjVjZW9GZ0haSEJxRTA1SkdVa1ZHa1JzRisKOGhSdnhDTW9uMjl3MC90cE41OG1JLzRITFFMWmVXQzBUeW5LYlhEQnZMSzhOQ2QrcHJMWU1pc0Z3YTFSN3crLwp5NFZ2aXpRUU5HcU5NcjZHZ1QxVC8wMGdQTmlpOXlSWWora1VxWnJwVVg5QmV1Mm1YUi94VWxlTFNkZ2JkdU9nCmpidGJEcTZTNE9GTTVsUEdId09CZXRHVVhVbHd1NENrTTZCQngrYnZPK2UrOXIwZ3BhdFp3QUl4U2djcFR0TkcKVnJqdjdaVmtGK0JwMElZaEUwRCtIc25uemw5cUlZN2hTWEZpQWd2WlJ3bXBndnByMGh2UVl4ZHRqZkpkc0tRYQpRcWo5MnBNYmZJMlZNNjJHbFhFbEcxQXpxZmJDTGsrZHJtc2tXdnpyUVFLQmdRRDhkTm1HQndLL2dpMk9vM1AyCmNQTlZIaDh6M3A3Z2VwM3lmbEZFZ0RkUGhBWk5TUHRkN0NNeU9PUmh0ZDRYdGJWampGRlR2VzB6aVR5ancvL0QKOUgvdWNES1AycjNmcjZJbHNmQ2hBWVd3SlI4eVlGU1V0VUp6TjV3Zmdnb2phUHdUWDZzVE5oMkFNOGtlU3RiegpjSFNRQVd3SjVUUEVoODRKTTNJazlhcXBVUUtCZ1FES0YxMG9tWE5WOEM4S0lZbjI5S0JXWVNNcWZnelcyNyt6CjRVVWVIWGxyZ0JSblVxNHE3UklneDg4alZqSDJrTDZwbFlQMVJ6ZjVBemZOUjNkQnFCYkdHRkRRNEdZcDdNSUwKbmpzZmJkWnN6cHZmNGNBemVXR2RlZ3NOeEpkcDFrNEdhL2ppa0psNTg4MDBSUUd3NVdmdTdvQTlVY29KbFhERwpReTBmbjhjN1FRS0JnUUROQkgvYVRqczNGeHEwS1oxMDEwbGxLRzhpaW5udnh1UWFGK2NiZ0J4cTRNYlZZSjF5Ckt1QnlXcTF0aEdwMlNzU2hzVVFpZzBUNWcwdlJtc3hNY0hTc1NFVm5lYmFVdjJjb3daYXV5ak90VnBnOUt1bkYKVW1aQ2R6aThoYmlDQlRJZzhhSldtYTNmZlM2cEFSSUs1SnBra0NNUzdpWGFSb2RXQllkKzZGck40UUtCZ0NKdQpoS0xNTWtoc0diZWlLejEyUkhNekxhaXB2VXBHT28xTlRsZHBNaXpNcjYxQyt3VzVTcU5uSjdXZmsvZXNoYStqCkY4Nk1pYzdWYTRhQUxLTjFIaHcyUEY2NlBPM2J0dHYvNDViaFFlMWI3bGJnd2J5RGE4eEc1T2M5bllhY3lzSngKVndCVEhyTVdoTm5vLy9iQnYwbUlQVFUxWURUdHp6OFladkhDYVZHQkFvR0FPcGVpaXV1MG1xRXBQR1dXZ0Z5RQplb2FrQ1E5a21MLzM3aTlBaGh4dXI3Q1pvS01kU1B2SHJ2S1Q1UVB4d1UvQ1YweUpBNlpTOWszVzN5bUJlcHNRCjlkMlh1azVDYlp0cVBIWDdoYmxwUExiK1BzTlg0L2JReEJLdTBRR3EzMkJsQU9yMnlFNHBpWFE3YzZRMHQ2MnEKOFlZd1ZaWG1obWdDSTgxMXlkWG9oM1k9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
78-
{% endif %}

tests/templates/kuttl/spark-connect/03-assert.yaml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,6 @@ metadata:
1010
status:
1111
readyReplicas: 1
1212
---
13-
apiVersion: apps/v1
14-
kind: Deployment
15-
metadata:
16-
name: eventlog-minio
17-
status:
18-
readyReplicas: 1
19-
---
2013
apiVersion: v1
2114
kind: Pod
2215
metadata:

tests/templates/kuttl/spark-connect/03-setup-minio.yaml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@
22
apiVersion: kuttl.dev/v1beta1
33
kind: TestStep
44
commands:
5-
- script: >-
6-
helm install eventlog-minio
7-
--namespace $NAMESPACE
8-
--version 14.6.16
9-
-f helm-bitnami-eventlog-minio-values.yaml
10-
--repo https://charts.bitnami.com/bitnami minio
11-
timeout: 240
125
- script: >-
136
helm install test-minio
147
--namespace $NAMESPACE

tests/templates/kuttl/spark-connect/10-deploy-spark-connect.yaml.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ data:
1515
appender.CONSOLE.filter.threshold.type = ThresholdFilter
1616
appender.CONSOLE.filter.threshold.level = DEBUG
1717

18-
rootLogger.level=DEBUG
18+
rootLogger.level=INFO
1919
rootLogger.appenderRefs = CONSOLE
2020
rootLogger.appenderRef.CONSOLE.ref = CONSOLE
2121
---

tests/templates/kuttl/spark-connect/certs/ca.crt

Lines changed: 0 additions & 23 deletions
This file was deleted.

tests/templates/kuttl/spark-connect/certs/client.crt.pem

Lines changed: 0 additions & 23 deletions
This file was deleted.

tests/templates/kuttl/spark-connect/certs/client.csr.pem

Lines changed: 0 additions & 18 deletions
This file was deleted.

tests/templates/kuttl/spark-connect/certs/client.key.pem

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)