-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbackendai_env_test.rs
More file actions
194 lines (161 loc) · 6.27 KB
/
backendai_env_test.rs
File metadata and controls
194 lines (161 loc) · 6.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
// Copyright 2025 Lablup Inc. and Jeongkyu Shin
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use bssh::config::Config;
use once_cell::sync::Lazy;
use std::env;
use tokio::sync::Mutex;
// Global mutex to serialize tests that modify environment variables
static ENV_MUTEX: Lazy<Mutex<()>> = Lazy::new(|| Mutex::new(()));
#[tokio::test]
async fn test_backendai_env_auto_detection() {
let _guard = ENV_MUTEX.lock().await;
// Save original env vars
let orig_hosts = env::var("BACKENDAI_CLUSTER_HOSTS").ok();
let orig_host = env::var("BACKENDAI_CLUSTER_HOST").ok();
let orig_role = env::var("BACKENDAI_CLUSTER_ROLE").ok();
// Set Backend.AI environment variables
unsafe {
env::set_var("BACKENDAI_CLUSTER_HOSTS", "node1.ai,node2.ai,node3.ai");
env::set_var("BACKENDAI_CLUSTER_HOST", "node1.ai");
env::set_var("BACKENDAI_CLUSTER_ROLE", "main");
}
// Create a temporary directory for the test
let temp_dir = tempfile::tempdir().unwrap();
let nonexistent_path = temp_dir.path().join("nonexistent.yaml");
// Load config with priority (should detect Backend.AI env)
let config = Config::load_with_priority(&nonexistent_path)
.await
.expect("Config should load with Backend.AI env");
// Check that bai_auto cluster was created
assert!(config.clusters.contains_key("bai_auto"));
// Get the bai_auto cluster
let cluster = config.clusters.get("bai_auto").unwrap();
// Verify SSH key is set to Backend.AI cluster key
assert_eq!(
cluster.defaults.ssh_key,
Some("/home/config/ssh/id_cluster".to_string()),
"Backend.AI cluster should use /home/config/ssh/id_cluster as SSH key"
);
// Verify nodes were parsed correctly
assert_eq!(cluster.nodes.len(), 3);
// Resolve nodes for the bai_auto cluster
let nodes = config
.resolve_nodes("bai_auto")
.expect("Should resolve bai_auto nodes");
assert_eq!(nodes.len(), 3);
// Check node details
assert_eq!(nodes[0].host, "node1.ai");
assert_eq!(nodes[0].port, 2200); // Backend.AI default port
assert_eq!(nodes[1].host, "node2.ai");
assert_eq!(nodes[2].host, "node3.ai");
// Verify get_ssh_key returns the correct key for Backend.AI cluster
assert_eq!(
config.get_ssh_key(Some("bai_auto")),
Some("/home/config/ssh/id_cluster".to_string()),
"get_ssh_key should return Backend.AI cluster key path"
);
// Restore original env vars
unsafe {
if let Some(val) = orig_hosts {
env::set_var("BACKENDAI_CLUSTER_HOSTS", val);
} else {
env::remove_var("BACKENDAI_CLUSTER_HOSTS");
}
if let Some(val) = orig_host {
env::set_var("BACKENDAI_CLUSTER_HOST", val);
} else {
env::remove_var("BACKENDAI_CLUSTER_HOST");
}
if let Some(val) = orig_role {
env::set_var("BACKENDAI_CLUSTER_ROLE", val);
} else {
env::remove_var("BACKENDAI_CLUSTER_ROLE");
}
}
}
#[tokio::test]
async fn test_backendai_env_with_single_host() {
let _guard = ENV_MUTEX.lock().await;
// Save original env vars
let orig_hosts = env::var("BACKENDAI_CLUSTER_HOSTS").ok();
let orig_host = env::var("BACKENDAI_CLUSTER_HOST").ok();
let orig_role = env::var("BACKENDAI_CLUSTER_ROLE").ok();
// Set Backend.AI environment variables with single host
unsafe {
env::set_var("BACKENDAI_CLUSTER_HOSTS", "single-node.ai");
env::set_var("BACKENDAI_CLUSTER_HOST", "single-node.ai");
// Explicitly remove ROLE to avoid contamination from previous tests
env::remove_var("BACKENDAI_CLUSTER_ROLE");
}
// Create a temporary directory for the test
let temp_dir = tempfile::tempdir().unwrap();
let nonexistent_path = temp_dir.path().join("nonexistent.yaml");
// Load config
let config = Config::load_with_priority(&nonexistent_path)
.await
.expect("Config should load");
// Verify bai_auto cluster exists
assert!(config.clusters.contains_key("bai_auto"));
let nodes = config
.resolve_nodes("bai_auto")
.expect("Should resolve nodes");
assert_eq!(nodes.len(), 1);
assert_eq!(nodes[0].host, "single-node.ai");
assert_eq!(nodes[0].port, 2200);
// Restore
unsafe {
if let Some(val) = orig_hosts {
env::set_var("BACKENDAI_CLUSTER_HOSTS", val);
} else {
env::remove_var("BACKENDAI_CLUSTER_HOSTS");
}
if let Some(val) = orig_host {
env::set_var("BACKENDAI_CLUSTER_HOST", val);
} else {
env::remove_var("BACKENDAI_CLUSTER_HOST");
}
if let Some(val) = orig_role {
env::set_var("BACKENDAI_CLUSTER_ROLE", val);
} else {
env::remove_var("BACKENDAI_CLUSTER_ROLE");
}
}
}
#[tokio::test]
async fn test_no_backendai_env() {
let _guard = ENV_MUTEX.lock().await;
// Save and clear Backend.AI env vars
let orig_hosts = env::var("BACKENDAI_CLUSTER_HOSTS").ok();
let orig_host = env::var("BACKENDAI_CLUSTER_HOST").ok();
unsafe {
env::remove_var("BACKENDAI_CLUSTER_HOSTS");
env::remove_var("BACKENDAI_CLUSTER_HOST");
env::remove_var("BACKENDAI_CLUSTER_ROLE");
}
// Load config without Backend.AI env
let config = Config::load_with_priority(&std::path::PathBuf::from("nonexistent.yaml"))
.await
.expect("Config should load");
// Verify no backendai cluster was created
assert!(!config.clusters.contains_key("backendai"));
// Restore if needed
unsafe {
if let Some(val) = orig_hosts {
env::set_var("BACKENDAI_CLUSTER_HOSTS", val);
}
if let Some(val) = orig_host {
env::set_var("BACKENDAI_CLUSTER_HOST", val);
}
}
}