Skip to content

Commit c63cd0c

Browse files
committed
Add Response remote type, rename Runnable to Request
1 parent 93ee18e commit c63cd0c

File tree

14 files changed

+366
-271
lines changed

14 files changed

+366
-271
lines changed

core/src/command/providers/generic.rs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,25 @@
55
// modified, or distributed except according to those terms.
66

77
use command::CommandResult;
8-
use erased_serde::Serialize;
98
use errors::*;
109
use futures::{future, Future};
1110
use host::{Host, HostType};
1211
use host::local::Local;
1312
use host::remote::Plain;
1413
use provider::Provider;
15-
use remote::{Executable, Runnable};
14+
use remote::{CommandRequest, CommandResponse, Executable, ExecutableResult,
15+
GenericRequest, Request, Response, ResponseResult};
1616
use std::process;
17-
use super::{CommandProvider, CommandRunnable};
17+
use super::CommandProvider;
1818
use tokio_core::reactor::Handle;
1919
use tokio_process::CommandExt;
20+
use tokio_proto::streaming::Message;
2021

2122
#[derive(Clone)]
2223
pub struct Generic;
2324
struct LocalGeneric;
2425
struct RemoteGeneric;
2526

26-
#[doc(hidden)]
27-
#[derive(Serialize, Deserialize)]
28-
pub enum GenericRunnable {
29-
Available,
30-
Exec(String, Vec<String>),
31-
}
32-
3327
impl<H: Host + 'static> Provider<H> for Generic {
3428
fn available(host: &H) -> Box<Future<Item = bool, Error = Error>> {
3529
match host.get_type() {
@@ -91,27 +85,38 @@ impl LocalGeneric {
9185

9286
impl RemoteGeneric {
9387
fn available(host: &Plain) -> Box<Future<Item = bool, Error = Error>> {
94-
let runnable = Runnable::Command(
95-
CommandRunnable::Generic(
96-
GenericRunnable::Available));
88+
let runnable = Request::Command(
89+
CommandRequest::Generic(
90+
GenericRequest::Available));
9791
host.run(runnable)
98-
.chain_err(|| ErrorKind::Runnable { endpoint: "Command::Generic", func: "available" })
92+
.chain_err(|| ErrorKind::Request { endpoint: "Command::Generic", func: "available" })
9993
}
10094

10195
fn exec(host: &Plain, cmd: &str, shell: &[String]) -> Box<Future<Item = CommandResult, Error = Error>> {
102-
let runnable = Runnable::Command(
103-
CommandRunnable::Generic(
104-
GenericRunnable::Exec(cmd.into(), shell.to_owned())));
96+
let runnable = Request::Command(
97+
CommandRequest::Generic(
98+
GenericRequest::Exec(cmd.into(), shell.to_owned())));
10599
host.run(runnable)
106-
.chain_err(|| ErrorKind::Runnable { endpoint: "Command::Generic", func: "exec" })
100+
.chain_err(|| ErrorKind::Request { endpoint: "Command::Generic", func: "exec" })
107101
}
108102
}
109103

110-
impl Executable for GenericRunnable {
111-
fn exec(self, _: &Local, handle: &Handle) -> Box<Future<Item = Box<Serialize>, Error = Error>> {
104+
impl Executable for GenericRequest {
105+
fn exec(self, _: &Local, handle: &Handle) -> ExecutableResult {
112106
match self {
113-
GenericRunnable::Available => Box::new(LocalGeneric::available().map(|b| Box::new(b) as Box<Serialize>)),
114-
GenericRunnable::Exec(cmd, shell) => Box::new(LocalGeneric::exec(handle, &cmd, &shell).map(|r| Box::new(r) as Box<Serialize>)),
107+
GenericRequest::Available => Box::new(
108+
LocalGeneric::available()
109+
.map(|b| Message::WithoutBody(
110+
ResponseResult::Ok(
111+
Response::Command(
112+
CommandResponse::Available(b)))))),
113+
GenericRequest::Exec(cmd, shell) => Box::new(
114+
LocalGeneric::exec(handle, &cmd, &shell)
115+
.map(|t| Message::WithoutBody(
116+
ResponseResult::Ok(
117+
Response::Command(
118+
CommandResponse::Exec(t.into()))))
119+
))
115120
}
116121
}
117122
}

core/src/command/providers/mod.rs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,17 @@
77
mod generic;
88

99
use errors::*;
10-
use erased_serde::Serialize;
1110
use futures::{future, Future};
1211
use host::Host;
13-
use host::local::Local;
1412
use provider::Provider;
15-
use remote::Executable;
16-
pub use self::generic::{Generic, GenericRunnable};
13+
pub use self::generic::Generic;
1714
use super::CommandResult;
1815
use tokio_core::reactor::Handle;
1916

2017
pub trait CommandProvider<H: Host>: Provider<H> {
2118
fn exec(&self, &H, &Handle, &str, &[String]) -> Box<Future<Item = CommandResult, Error = Error>>;
2219
}
2320

24-
#[doc(hidden)]
25-
#[derive(Serialize, Deserialize)]
26-
pub enum CommandRunnable {
27-
Generic(GenericRunnable)
28-
}
29-
30-
impl Executable for CommandRunnable {
31-
fn exec(self, host: &Local, handle: &Handle) -> Box<Future<Item = Box<Serialize>, Error = Error>> {
32-
match self {
33-
CommandRunnable::Generic(p) => p.exec(host, handle)
34-
}
35-
}
36-
}
37-
3821
pub fn factory<H: Host + 'static>(host: &H) -> Box<Future<Item = Box<CommandProvider<H>>, Error = Error>> {
3922
Box::new(Generic::try_new(host)
4023
.and_then(|opt| match opt {

core/src/errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ error_chain! {
2626
display("No providers available for {}", p),
2727
}
2828

29-
Runnable {
29+
Request {
3030
endpoint: &'static str,
3131
func: &'static str,
3232
} {

core/src/host/remote.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use bytes::BytesMut;
88
use errors::*;
99
use futures::{future, Future};
10-
use remote::Runnable;
10+
use remote::Request;
1111
use serde::Deserialize;
1212
use serde_json;
1313
use std::{io, result};
@@ -81,15 +81,15 @@ impl Plain {
8181
}
8282

8383
#[doc(hidden)]
84-
pub fn run<D: 'static>(&self, provider: Runnable) -> Box<Future<Item = D, Error = Error>>
84+
pub fn run<D: 'static>(&self, provider: Request) -> Box<Future<Item = D, Error = Error>>
8585
where for<'de> D: Deserialize<'de>
8686
{
8787
Box::new(self.run_msg::<D>(provider)
8888
.map(|msg| msg.into_inner()))
8989
}
9090

9191
#[doc(hidden)]
92-
pub fn run_msg<D: 'static>(&self, provider: Runnable) -> Box<Future<Item = Message<D, Body<Vec<u8>, io::Error>>, Error = Error>>
92+
pub fn run_msg<D: 'static>(&self, provider: Request) -> Box<Future<Item = Message<D, Body<Vec<u8>, io::Error>>, Error = Error>>
9393
where for<'de> D: Deserialize<'de>
9494
{
9595
let value = match serde_json::to_value(provider).chain_err(|| "Could not encode provider to send to host") {

core/src/remote.rs

Lines changed: 133 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,151 @@
44
// https://www.tldrlegal.com/l/mpl-2.0>. This file may not be copied,
55
// modified, or distributed except according to those terms.
66

7-
use command::providers::CommandRunnable;
8-
use erased_serde::Serialize;
7+
// Hopefully in the near future this will be auto-generated from `derive` attributes.
8+
9+
use command::CommandResult;
910
use errors::*;
1011
use futures::Future;
1112
use host::local::Local;
12-
use telemetry::providers::TelemetryRunnable;
13+
use telemetry::serializable::Telemetry;
1314
use tokio_core::reactor::Handle;
15+
use tokio_proto::streaming::{Body, Message};
16+
17+
pub type ExecutableResult = Box<Future<Item = Message<ResponseResult, Body<Vec<u8>, Error>>, Error = Error>>;
1418

1519
pub trait Executable {
16-
fn exec(self, &Local, &Handle) -> Box<Future<Item = Box<Serialize>, Error = Error>>;
20+
fn exec(self, &Local, &Handle) -> ExecutableResult;
21+
}
22+
23+
#[derive(Serialize, Deserialize)]
24+
pub enum Request {
25+
Command(CommandRequest),
26+
Telemetry(TelemetryRequest),
27+
}
28+
29+
#[derive(Serialize, Deserialize)]
30+
pub enum Response {
31+
Command(CommandResponse),
32+
Telemetry(TelemetryResponse),
33+
}
34+
35+
#[derive(Serialize, Deserialize)]
36+
pub enum ResponseResult {
37+
Ok(Response),
38+
Err(String),
39+
}
40+
41+
impl Executable for Request {
42+
fn exec(self, host: &Local, handle: &Handle) -> ExecutableResult {
43+
match self {
44+
Request::Command(p) => p.exec(host, handle),
45+
Request::Telemetry(p) => p.exec(host, handle),
46+
}
47+
}
48+
}
49+
50+
//
51+
// Command
52+
//
53+
54+
#[derive(Serialize, Deserialize)]
55+
pub enum CommandRequest {
56+
Generic(GenericRequest),
57+
}
58+
59+
#[derive(Serialize, Deserialize)]
60+
pub enum GenericRequest {
61+
Available,
62+
Exec(String, Vec<String>),
63+
}
64+
65+
#[derive(Serialize, Deserialize)]
66+
pub enum CommandResponse {
67+
Available(bool),
68+
Exec(CommandResult),
69+
}
70+
71+
impl Executable for CommandRequest {
72+
fn exec(self, host: &Local, handle: &Handle) -> ExecutableResult {
73+
match self {
74+
CommandRequest::Generic(p) => p.exec(host, handle)
75+
}
76+
}
77+
}
78+
79+
//
80+
// Telemetry
81+
//
82+
83+
#[derive(Serialize, Deserialize)]
84+
pub enum TelemetryRequest {
85+
Centos(CentosRequest),
86+
Debian(DebianRequest),
87+
Fedora(FedoraRequest),
88+
Freebsd(FreebsdRequest),
89+
Macos(MacosRequest),
90+
Nixos(NixosRequest),
91+
Ubuntu(UbuntuRequest),
92+
}
93+
94+
#[derive(Serialize, Deserialize)]
95+
pub enum CentosRequest {
96+
Available,
97+
Load,
98+
}
99+
100+
#[derive(Serialize, Deserialize)]
101+
pub enum DebianRequest {
102+
Available,
103+
Load,
104+
}
105+
106+
#[derive(Serialize, Deserialize)]
107+
pub enum FedoraRequest {
108+
Available,
109+
Load,
110+
}
111+
112+
#[derive(Serialize, Deserialize)]
113+
pub enum FreebsdRequest {
114+
Available,
115+
Load,
116+
}
117+
118+
#[derive(Serialize, Deserialize)]
119+
pub enum MacosRequest {
120+
Available,
121+
Load,
122+
}
123+
124+
#[derive(Serialize, Deserialize)]
125+
pub enum NixosRequest {
126+
Available,
127+
Load,
128+
}
129+
130+
#[derive(Serialize, Deserialize)]
131+
pub enum UbuntuRequest {
132+
Available,
133+
Load,
17134
}
18135

19136
#[derive(Serialize, Deserialize)]
20-
pub enum Runnable {
21-
Command(CommandRunnable),
22-
Telemetry(TelemetryRunnable),
137+
pub enum TelemetryResponse {
138+
Available(bool),
139+
Load(Telemetry),
23140
}
24141

25-
impl Executable for Runnable {
26-
fn exec(self, host: &Local, handle: &Handle) -> Box<Future<Item = Box<Serialize>, Error = Error>> {
142+
impl Executable for TelemetryRequest {
143+
fn exec(self, host: &Local, handle: &Handle) -> ExecutableResult {
27144
match self {
28-
Runnable::Command(p) => p.exec(host, handle),
29-
Runnable::Telemetry(p) => p.exec(host, handle),
145+
TelemetryRequest::Centos(p) => p.exec(host, handle),
146+
TelemetryRequest::Debian(p) => p.exec(host, handle),
147+
TelemetryRequest::Fedora(p) => p.exec(host, handle),
148+
TelemetryRequest::Freebsd(p) => p.exec(host, handle),
149+
TelemetryRequest::Macos(p) => p.exec(host, handle),
150+
TelemetryRequest::Nixos(p) => p.exec(host, handle),
151+
TelemetryRequest::Ubuntu(p) => p.exec(host, handle),
30152
}
31153
}
32154
}

core/src/telemetry/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
//! System generated data about your host.
88
99
pub mod providers;
10-
mod serializable;
10+
#[doc(hidden)]
11+
pub mod serializable;
1112

1213
use pnet::datalink::NetworkInterface;
1314

0 commit comments

Comments
 (0)