Compare commits
2 Commits
01206f5db1
...
3ecda84530
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ecda84530 | |||
| 3d8dd4d8e6 |
@ -98,7 +98,7 @@ pub(crate) fn haproxy_xml_config_to_harmony_loadbalancer(
|
|||||||
.backends
|
.backends
|
||||||
.backends
|
.backends
|
||||||
.iter()
|
.iter()
|
||||||
.find(|b| b.uuid == frontend.default_backend);
|
.find(|b| Some(b.uuid.clone()) == frontend.default_backend);
|
||||||
|
|
||||||
let mut health_check = None;
|
let mut health_check = None;
|
||||||
match matching_backend {
|
match matching_backend {
|
||||||
@ -108,8 +108,7 @@ pub(crate) fn haproxy_xml_config_to_harmony_loadbalancer(
|
|||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
warn!(
|
warn!(
|
||||||
"HAProxy config could not find a matching backend for frontend {:?}",
|
"HAProxy config could not find a matching backend for frontend {frontend:?}"
|
||||||
frontend
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -144,11 +143,11 @@ pub(crate) fn get_servers_for_backend(
|
|||||||
.servers
|
.servers
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|server| {
|
.filter_map(|server| {
|
||||||
|
let address = server.address.clone()?;
|
||||||
|
let port = server.port?;
|
||||||
|
|
||||||
if backend_servers.contains(&server.uuid.as_str()) {
|
if backend_servers.contains(&server.uuid.as_str()) {
|
||||||
return Some(BackendServer {
|
return Some(BackendServer { address, port });
|
||||||
address: server.address.clone(),
|
|
||||||
port: server.port,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
})
|
})
|
||||||
@ -316,7 +315,7 @@ pub(crate) fn harmony_load_balancer_service_to_haproxy_xml(
|
|||||||
name: format!("frontend_{}", service.listening_port),
|
name: format!("frontend_{}", service.listening_port),
|
||||||
bind: service.listening_port.to_string(),
|
bind: service.listening_port.to_string(),
|
||||||
mode: "tcp".to_string(), // TODO do not depend on health check here
|
mode: "tcp".to_string(), // TODO do not depend on health check here
|
||||||
default_backend: backend.uuid.clone(),
|
default_backend: Some(backend.uuid.clone()),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
info!("HAPRoxy frontend and backend mode currently hardcoded to tcp");
|
info!("HAPRoxy frontend and backend mode currently hardcoded to tcp");
|
||||||
@ -330,8 +329,8 @@ fn server_to_haproxy_server(server: &BackendServer) -> HAProxyServer {
|
|||||||
uuid: Uuid::new_v4().to_string(),
|
uuid: Uuid::new_v4().to_string(),
|
||||||
name: format!("{}_{}", &server.address, &server.port),
|
name: format!("{}_{}", &server.address, &server.port),
|
||||||
enabled: 1,
|
enabled: 1,
|
||||||
address: server.address.clone(),
|
address: Some(server.address.clone()),
|
||||||
port: server.port,
|
port: Some(server.port),
|
||||||
mode: "active".to_string(),
|
mode: "active".to_string(),
|
||||||
server_type: "static".to_string(),
|
server_type: "static".to_string(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
@ -354,8 +353,8 @@ mod tests {
|
|||||||
let mut haproxy = HAProxy::default();
|
let mut haproxy = HAProxy::default();
|
||||||
let server = HAProxyServer {
|
let server = HAProxyServer {
|
||||||
uuid: "server1".to_string(),
|
uuid: "server1".to_string(),
|
||||||
address: "192.168.1.1".to_string(),
|
address: Some("192.168.1.1".to_string()),
|
||||||
port: 80,
|
port: Some(80),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
haproxy.servers.servers.push(server);
|
haproxy.servers.servers.push(server);
|
||||||
@ -380,8 +379,8 @@ mod tests {
|
|||||||
let mut haproxy = HAProxy::default();
|
let mut haproxy = HAProxy::default();
|
||||||
let server = HAProxyServer {
|
let server = HAProxyServer {
|
||||||
uuid: "server1".to_string(),
|
uuid: "server1".to_string(),
|
||||||
address: "192.168.1.1".to_string(),
|
address: Some("192.168.1.1".to_string()),
|
||||||
port: 80,
|
port: Some(80),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
haproxy.servers.servers.push(server);
|
haproxy.servers.servers.push(server);
|
||||||
@ -400,8 +399,8 @@ mod tests {
|
|||||||
let mut haproxy = HAProxy::default();
|
let mut haproxy = HAProxy::default();
|
||||||
let server = HAProxyServer {
|
let server = HAProxyServer {
|
||||||
uuid: "server1".to_string(),
|
uuid: "server1".to_string(),
|
||||||
address: "192.168.1.1".to_string(),
|
address: Some("192.168.1.1".to_string()),
|
||||||
port: 80,
|
port: Some(80),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
haproxy.servers.servers.push(server);
|
haproxy.servers.servers.push(server);
|
||||||
@ -422,16 +421,16 @@ mod tests {
|
|||||||
let mut haproxy = HAProxy::default();
|
let mut haproxy = HAProxy::default();
|
||||||
let server = HAProxyServer {
|
let server = HAProxyServer {
|
||||||
uuid: "server1".to_string(),
|
uuid: "server1".to_string(),
|
||||||
address: "some-hostname.test.mcd".to_string(),
|
address: Some("some-hostname.test.mcd".to_string()),
|
||||||
port: 80,
|
port: Some(80),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
haproxy.servers.servers.push(server);
|
haproxy.servers.servers.push(server);
|
||||||
|
|
||||||
let server = HAProxyServer {
|
let server = HAProxyServer {
|
||||||
uuid: "server2".to_string(),
|
uuid: "server2".to_string(),
|
||||||
address: "192.168.1.2".to_string(),
|
address: Some("192.168.1.2".to_string()),
|
||||||
port: 8080,
|
port: Some(8080),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
haproxy.servers.servers.push(server);
|
haproxy.servers.servers.push(server);
|
||||||
|
|||||||
@ -67,6 +67,8 @@ impl OKDBootstrapLoadBalancerScore {
|
|||||||
address: topology.bootstrap_host.ip.to_string(),
|
address: topology.bootstrap_host.ip.to_string(),
|
||||||
port,
|
port,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
backend.dedup();
|
||||||
backend
|
backend
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -310,7 +310,7 @@ pub struct Frontend {
|
|||||||
pub bind_options: MaybeString,
|
pub bind_options: MaybeString,
|
||||||
pub mode: String,
|
pub mode: String,
|
||||||
#[yaserde(rename = "defaultBackend")]
|
#[yaserde(rename = "defaultBackend")]
|
||||||
pub default_backend: String,
|
pub default_backend: Option<String>,
|
||||||
pub ssl_enabled: i32,
|
pub ssl_enabled: i32,
|
||||||
pub ssl_certificates: MaybeString,
|
pub ssl_certificates: MaybeString,
|
||||||
pub ssl_default_certificate: MaybeString,
|
pub ssl_default_certificate: MaybeString,
|
||||||
@ -543,8 +543,8 @@ pub struct HAProxyServer {
|
|||||||
pub enabled: u8,
|
pub enabled: u8,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub description: MaybeString,
|
pub description: MaybeString,
|
||||||
pub address: String,
|
pub address: Option<String>,
|
||||||
pub port: u16,
|
pub port: Option<u16>,
|
||||||
pub checkport: MaybeString,
|
pub checkport: MaybeString,
|
||||||
pub mode: String,
|
pub mode: String,
|
||||||
pub multiplexer_protocol: MaybeString,
|
pub multiplexer_protocol: MaybeString,
|
||||||
|
|||||||
@ -47,9 +47,22 @@ impl<'a> LoadBalancerConfig<'a> {
|
|||||||
healthcheck: Option<HAProxyHealthCheck>,
|
healthcheck: Option<HAProxyHealthCheck>,
|
||||||
) {
|
) {
|
||||||
self.remove_service_by_bind_address(&frontend.bind);
|
self.remove_service_by_bind_address(&frontend.bind);
|
||||||
|
self.remove_servers(&servers);
|
||||||
|
|
||||||
self.add_new_service(frontend, backend, servers, healthcheck);
|
self.add_new_service(frontend, backend, servers, healthcheck);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove the corresponding real servers based on their name if they already exist.
|
||||||
|
fn remove_servers(&mut self, servers: &[HAProxyServer]) {
|
||||||
|
let server_names: HashSet<_> = servers.iter().map(|s| s.name.clone()).collect();
|
||||||
|
self.with_haproxy(|haproxy| {
|
||||||
|
haproxy
|
||||||
|
.servers
|
||||||
|
.servers
|
||||||
|
.retain(|s| !server_names.contains(&s.name));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/// Removes a service and its dependent components based on the frontend's bind address.
|
/// Removes a service and its dependent components based on the frontend's bind address.
|
||||||
/// This performs a cascading delete of the frontend, backend, servers, and health check.
|
/// This performs a cascading delete of the frontend, backend, servers, and health check.
|
||||||
fn remove_service_by_bind_address(&mut self, bind_address: &str) {
|
fn remove_service_by_bind_address(&mut self, bind_address: &str) {
|
||||||
@ -63,7 +76,7 @@ impl<'a> LoadBalancerConfig<'a> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
remove_healthcheck(haproxy, &old_backend);
|
remove_healthcheck(haproxy, &old_backend);
|
||||||
remove_servers(haproxy, &old_backend);
|
remove_linked_servers(haproxy, &old_backend);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,19 +94,7 @@ impl<'a> LoadBalancerConfig<'a> {
|
|||||||
haproxy.healthchecks.healthchecks.push(check);
|
haproxy.healthchecks.healthchecks.push(check);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut existing_server_names: HashSet<_> = haproxy
|
haproxy.servers.servers.extend(servers);
|
||||||
.servers
|
|
||||||
.servers
|
|
||||||
.iter()
|
|
||||||
.map(|s| s.name.clone())
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
for server in servers {
|
|
||||||
if existing_server_names.insert(server.name.clone()) {
|
|
||||||
haproxy.servers.servers.push(server);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
haproxy.backends.backends.push(backend);
|
haproxy.backends.backends.push(backend);
|
||||||
haproxy.frontends.frontend.push(frontend);
|
haproxy.frontends.frontend.push(frontend);
|
||||||
});
|
});
|
||||||
@ -139,11 +140,12 @@ fn remove_frontend_by_bind_address(haproxy: &mut HAProxy, bind_address: &str) ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn remove_backend(haproxy: &mut HAProxy, old_frontend: Frontend) -> Option<HAProxyBackend> {
|
fn remove_backend(haproxy: &mut HAProxy, old_frontend: Frontend) -> Option<HAProxyBackend> {
|
||||||
|
let default_backend = old_frontend.default_backend?;
|
||||||
let pos = haproxy
|
let pos = haproxy
|
||||||
.backends
|
.backends
|
||||||
.backends
|
.backends
|
||||||
.iter()
|
.iter()
|
||||||
.position(|b| b.uuid == old_frontend.default_backend);
|
.position(|b| b.uuid == default_backend);
|
||||||
|
|
||||||
match pos {
|
match pos {
|
||||||
Some(pos) => Some(haproxy.backends.backends.remove(pos)),
|
Some(pos) => Some(haproxy.backends.backends.remove(pos)),
|
||||||
@ -161,7 +163,7 @@ fn remove_healthcheck(haproxy: &mut HAProxy, backend: &HAProxyBackend) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Remove the backend's servers. This assumes servers are not shared between services.
|
/// Remove the backend's servers. This assumes servers are not shared between services.
|
||||||
fn remove_servers(haproxy: &mut HAProxy, backend: &HAProxyBackend) {
|
fn remove_linked_servers(haproxy: &mut HAProxy, backend: &HAProxyBackend) {
|
||||||
if let Some(server_uuids_str) = &backend.linked_servers.content {
|
if let Some(server_uuids_str) = &backend.linked_servers.content {
|
||||||
let server_uuids_to_remove: HashSet<_> = server_uuids_str.split(',').collect();
|
let server_uuids_to_remove: HashSet<_> = server_uuids_str.split(',').collect();
|
||||||
haproxy
|
haproxy
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user