75 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::net::Ipv4Addr;
 | |
| 
 | |
| use model::{CreateStatus, Instance, SshPubkey, Subnet};
 | |
| 
 | |
| pub mod args;
 | |
| pub mod config;
 | |
| #[cfg(feature = "mock")]
 | |
| pub mod mock;
 | |
| pub mod model;
 | |
| pub mod net;
 | |
| 
 | |
| pub use hickory_proto;
 | |
| use net::mac::MacAddr;
 | |
| use serde::{Deserialize, Serialize};
 | |
| 
 | |
| #[derive(Debug, Serialize, Deserialize)]
 | |
| pub enum InstanceQuery {
 | |
|     Name(String),
 | |
|     MacAddr(MacAddr),
 | |
|     Ipv4Addr(Ipv4Addr),
 | |
| }
 | |
| 
 | |
| #[tarpc::service]
 | |
| pub trait Nazrin {
 | |
|     /// Creates a new instance.
 | |
|     async fn new_instance(build_args: args::NewInstance) -> Result<uuid::Uuid, String>;
 | |
|     /// Poll for the current status of an instance being created.
 | |
|     async fn poll_new_instance(task_id: uuid::Uuid) -> Option<CreateStatus>;
 | |
|     /// Deletes an existing instance.
 | |
|     ///
 | |
|     /// This should involve deleting all related disks and clearing
 | |
|     /// the lease information from the subnet data, if any.
 | |
|     async fn delete_instance(name: String) -> Result<(), String>;
 | |
|     /// Gets a single instance by the given InstanceQuery.
 | |
|     async fn find_instance(query: InstanceQuery) -> Result<Option<Instance>, String>;
 | |
|     /// Gets a list of existing instances.
 | |
|     async fn get_instances(with_status: bool) -> Result<Vec<Instance>, String>;
 | |
|     /// Cleans up unusable entries in the database.
 | |
|     async fn garbage_collect() -> Result<(), String>;
 | |
|     /// Creates a new subnet.
 | |
|     ///
 | |
|     /// Unlike instances, subnets shouldn't perform any changes to the
 | |
|     /// interfaces they reference. This should be used primarily for
 | |
|     /// ease-of-use and bookkeeping (e.g., assigning dynamic leases).
 | |
|     async fn new_subnet(build_args: Subnet) -> Result<Subnet, String>;
 | |
|     /// Modifies an existing subnet.
 | |
|     async fn modify_subnet(edit_args: Subnet) -> Result<Subnet, String>;
 | |
|     /// Gets a list of existing subnets.
 | |
|     async fn get_subnets() -> Result<Vec<Subnet>, String>;
 | |
|     /// Deletes an existing subnet.
 | |
|     async fn delete_subnet(interface: String) -> Result<(), String>;
 | |
|     /// Gets the cloud-init user-data for the given instance.
 | |
|     async fn get_instance_userdata(id: i32) -> Result<Vec<u8>, String>;
 | |
|     /// Gets all SSH keys stored in the database.
 | |
|     async fn get_ssh_pubkeys() -> Result<Vec<SshPubkey>, String>;
 | |
|     /// Adds a new SSH public key to the database.
 | |
|     async fn add_ssh_pubkey(pub_key: String) -> Result<SshPubkey, String>;
 | |
|     /// Deletes an SSH public key from the database.
 | |
|     async fn delete_ssh_pubkey(id: i32) -> Result<(), String>;
 | |
| }
 | |
| 
 | |
| /// Create a new NazrinClient.
 | |
| pub fn new_client(sock: tokio::net::UnixStream) -> NazrinClient {
 | |
|     use tarpc::tokio_serde::formats::Bincode;
 | |
|     use tarpc::tokio_util::codec::LengthDelimitedCodec;
 | |
| 
 | |
|     let framed_io = LengthDelimitedCodec::builder()
 | |
|         .length_field_type::<u32>()
 | |
|         .new_framed(sock);
 | |
|     let transport = tarpc::serde_transport::new(framed_io, Bincode::default());
 | |
|     NazrinClient::new(Default::default(), transport).spawn()
 | |
| }
 | |
| 
 | |
| pub use tarpc::client::RpcError;
 | |
| pub use tarpc::context::current as default_ctx;
 |