use crate::api::generated::machine::{
ServiceRestart as ProtoServiceRestart, ServiceRestartRequest as ProtoServiceRestartRequest,
ServiceRestartResponse as ProtoServiceRestartResponse, ServiceStart as ProtoServiceStart,
ServiceStartRequest as ProtoServiceStartRequest,
ServiceStartResponse as ProtoServiceStartResponse, ServiceStop as ProtoServiceStop,
ServiceStopRequest as ProtoServiceStopRequest, ServiceStopResponse as ProtoServiceStopResponse,
};
#[derive(Debug, Clone)]
pub struct ServiceStartRequest {
pub id: String,
}
impl ServiceStartRequest {
#[must_use]
pub fn new(id: impl Into<String>) -> Self {
Self { id: id.into() }
}
}
impl From<ServiceStartRequest> for ProtoServiceStartRequest {
fn from(req: ServiceStartRequest) -> Self {
Self { id: req.id }
}
}
#[derive(Debug, Clone)]
pub struct ServiceStartResult {
pub node: Option<String>,
pub response: String,
}
impl From<ProtoServiceStart> for ServiceStartResult {
fn from(proto: ProtoServiceStart) -> Self {
Self {
node: proto.metadata.map(|m| m.hostname),
response: proto.resp,
}
}
}
#[derive(Debug, Clone)]
pub struct ServiceStartResponse {
pub results: Vec<ServiceStartResult>,
}
impl From<ProtoServiceStartResponse> for ServiceStartResponse {
fn from(proto: ProtoServiceStartResponse) -> Self {
Self {
results: proto
.messages
.into_iter()
.map(ServiceStartResult::from)
.collect(),
}
}
}
impl ServiceStartResponse {
#[must_use]
pub fn is_success(&self) -> bool {
!self.results.is_empty()
}
}
#[derive(Debug, Clone)]
pub struct ServiceStopRequest {
pub id: String,
}
impl ServiceStopRequest {
#[must_use]
pub fn new(id: impl Into<String>) -> Self {
Self { id: id.into() }
}
}
impl From<ServiceStopRequest> for ProtoServiceStopRequest {
fn from(req: ServiceStopRequest) -> Self {
Self { id: req.id }
}
}
#[derive(Debug, Clone)]
pub struct ServiceStopResult {
pub node: Option<String>,
pub response: String,
}
impl From<ProtoServiceStop> for ServiceStopResult {
fn from(proto: ProtoServiceStop) -> Self {
Self {
node: proto.metadata.map(|m| m.hostname),
response: proto.resp,
}
}
}
#[derive(Debug, Clone)]
pub struct ServiceStopResponse {
pub results: Vec<ServiceStopResult>,
}
impl From<ProtoServiceStopResponse> for ServiceStopResponse {
fn from(proto: ProtoServiceStopResponse) -> Self {
Self {
results: proto
.messages
.into_iter()
.map(ServiceStopResult::from)
.collect(),
}
}
}
impl ServiceStopResponse {
#[must_use]
pub fn is_success(&self) -> bool {
!self.results.is_empty()
}
}
#[derive(Debug, Clone)]
pub struct ServiceRestartRequest {
pub id: String,
}
impl ServiceRestartRequest {
#[must_use]
pub fn new(id: impl Into<String>) -> Self {
Self { id: id.into() }
}
}
impl From<ServiceRestartRequest> for ProtoServiceRestartRequest {
fn from(req: ServiceRestartRequest) -> Self {
Self { id: req.id }
}
}
#[derive(Debug, Clone)]
pub struct ServiceRestartResult {
pub node: Option<String>,
pub response: String,
}
impl From<ProtoServiceRestart> for ServiceRestartResult {
fn from(proto: ProtoServiceRestart) -> Self {
Self {
node: proto.metadata.map(|m| m.hostname),
response: proto.resp,
}
}
}
#[derive(Debug, Clone)]
pub struct ServiceRestartResponse {
pub results: Vec<ServiceRestartResult>,
}
impl From<ProtoServiceRestartResponse> for ServiceRestartResponse {
fn from(proto: ProtoServiceRestartResponse) -> Self {
Self {
results: proto
.messages
.into_iter()
.map(ServiceRestartResult::from)
.collect(),
}
}
}
impl ServiceRestartResponse {
#[must_use]
pub fn is_success(&self) -> bool {
!self.results.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_service_start_request() {
let req = ServiceStartRequest::new("kubelet");
assert_eq!(req.id, "kubelet");
let proto: ProtoServiceStartRequest = req.into();
assert_eq!(proto.id, "kubelet");
}
#[test]
fn test_service_stop_request() {
let req = ServiceStopRequest::new("containerd");
assert_eq!(req.id, "containerd");
let proto: ProtoServiceStopRequest = req.into();
assert_eq!(proto.id, "containerd");
}
#[test]
fn test_service_restart_request() {
let req = ServiceRestartRequest::new("etcd");
assert_eq!(req.id, "etcd");
let proto: ProtoServiceRestartRequest = req.into();
assert_eq!(proto.id, "etcd");
}
}