mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
complete export_service_interface and list_service_interfaces fns (#2595)
* complete export_service_interface fn * refactor export_service_interface fn * complete list_service_interfaces fn * call insert on model and remove unnecessary code * Refactor export_service_interface Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> * Refactor list_service_interfaces Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> * get ServiceInterfaceId and HostId from params * formatting --------- Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
This commit is contained in:
@@ -11,7 +11,9 @@ use clap::Parser;
|
|||||||
use emver::VersionRange;
|
use emver::VersionRange;
|
||||||
use imbl::OrdMap;
|
use imbl::OrdMap;
|
||||||
use imbl_value::{json, InternedString};
|
use imbl_value::{json, InternedString};
|
||||||
use models::{ActionId, DataUrl, HealthCheckId, HostId, ImageId, PackageId, VolumeId};
|
use models::{
|
||||||
|
ActionId, DataUrl, HealthCheckId, HostId, Id, ImageId, PackageId, ServiceInterfaceId, VolumeId,
|
||||||
|
};
|
||||||
use patch_db::json_ptr::JsonPointer;
|
use patch_db::json_ptr::JsonPointer;
|
||||||
use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler};
|
use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@@ -26,7 +28,11 @@ use crate::disk::mount::filesystem::idmapped::IdMapped;
|
|||||||
use crate::disk::mount::filesystem::loop_dev::LoopDev;
|
use crate::disk::mount::filesystem::loop_dev::LoopDev;
|
||||||
use crate::disk::mount::filesystem::overlayfs::OverlayGuard;
|
use crate::disk::mount::filesystem::overlayfs::OverlayGuard;
|
||||||
use crate::net::host::binding::BindOptions;
|
use crate::net::host::binding::BindOptions;
|
||||||
use crate::net::host::HostKind;
|
use crate::net::host::{self, HostKind};
|
||||||
|
use crate::net::service_interface::{
|
||||||
|
AddressInfo, ExportedHostInfo, ExportedHostnameInfo, ServiceInterface, ServiceInterfaceType,
|
||||||
|
ServiceInterfaceWithHostInfo,
|
||||||
|
};
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use crate::s9pk::merkle_archive::source::http::{HttpReader, HttpSource};
|
use crate::s9pk::merkle_archive::source::http::{HttpReader, HttpSource};
|
||||||
use crate::s9pk::rpc::SKIP_ENV;
|
use crate::s9pk::rpc::SKIP_ENV;
|
||||||
@@ -191,29 +197,11 @@ struct GetServicePortForwardParams {
|
|||||||
host_id: HostId,
|
host_id: HostId,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
|
|
||||||
#[ts(export)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
struct AddressInfo {
|
|
||||||
username: Option<String>,
|
|
||||||
host_id: String,
|
|
||||||
bind_options: BindOptions,
|
|
||||||
suffix: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
|
|
||||||
#[ts(export)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
enum ServiceInterfaceType {
|
|
||||||
Ui,
|
|
||||||
P2p,
|
|
||||||
Api,
|
|
||||||
}
|
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
|
||||||
#[ts(export)]
|
#[ts(export)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct ExportServiceInterfaceParams {
|
struct ExportServiceInterfaceParams {
|
||||||
id: String,
|
id: ServiceInterfaceId,
|
||||||
name: String,
|
name: String,
|
||||||
description: String,
|
description: String,
|
||||||
has_primary: bool,
|
has_primary: bool,
|
||||||
@@ -221,6 +209,8 @@ struct ExportServiceInterfaceParams {
|
|||||||
masked: bool,
|
masked: bool,
|
||||||
address_info: AddressInfo,
|
address_info: AddressInfo,
|
||||||
r#type: ServiceInterfaceType,
|
r#type: ServiceInterfaceType,
|
||||||
|
host_kind: HostKind,
|
||||||
|
hostnames: Vec<ExportedHostnameInfo>,
|
||||||
}
|
}
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
|
||||||
#[ts(export)]
|
#[ts(export)]
|
||||||
@@ -336,9 +326,57 @@ async fn clear_network_interfaces(context: EffectContext, _: Empty) -> Result<Va
|
|||||||
}
|
}
|
||||||
async fn export_service_interface(
|
async fn export_service_interface(
|
||||||
context: EffectContext,
|
context: EffectContext,
|
||||||
data: ExportServiceInterfaceParams,
|
ExportServiceInterfaceParams {
|
||||||
) -> Result<Value, Error> {
|
id,
|
||||||
todo!()
|
name,
|
||||||
|
description,
|
||||||
|
has_primary,
|
||||||
|
disabled,
|
||||||
|
masked,
|
||||||
|
address_info,
|
||||||
|
r#type,
|
||||||
|
host_kind,
|
||||||
|
hostnames,
|
||||||
|
}: ExportServiceInterfaceParams,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let context = context.deref()?;
|
||||||
|
let package_id = context.id.clone();
|
||||||
|
let host_id = address_info.host_id.clone();
|
||||||
|
|
||||||
|
let service_interface = ServiceInterface {
|
||||||
|
id: id.clone(),
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
has_primary,
|
||||||
|
disabled,
|
||||||
|
masked,
|
||||||
|
address_info,
|
||||||
|
interface_type: r#type,
|
||||||
|
};
|
||||||
|
let host_info = ExportedHostInfo {
|
||||||
|
id: host_id,
|
||||||
|
kind: host_kind,
|
||||||
|
hostnames,
|
||||||
|
};
|
||||||
|
let svc_interface_with_host_info = ServiceInterfaceWithHostInfo {
|
||||||
|
service_interface,
|
||||||
|
host_info,
|
||||||
|
};
|
||||||
|
|
||||||
|
context
|
||||||
|
.ctx
|
||||||
|
.db
|
||||||
|
.mutate(|db| {
|
||||||
|
db.as_public_mut()
|
||||||
|
.as_package_data_mut()
|
||||||
|
.as_idx_mut(&package_id)
|
||||||
|
.or_not_found(&package_id)?
|
||||||
|
.as_service_interfaces_mut()
|
||||||
|
.insert(&id, &svc_interface_with_host_info)?;
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.await?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
async fn get_primary_url(
|
async fn get_primary_url(
|
||||||
context: EffectContext,
|
context: EffectContext,
|
||||||
@@ -349,9 +387,23 @@ async fn get_primary_url(
|
|||||||
async fn list_service_interfaces(
|
async fn list_service_interfaces(
|
||||||
context: EffectContext,
|
context: EffectContext,
|
||||||
data: ListServiceInterfacesParams,
|
data: ListServiceInterfacesParams,
|
||||||
) -> Result<Value, Error> {
|
) -> Result<BTreeMap<ServiceInterfaceId, ServiceInterfaceWithHostInfo>, Error> {
|
||||||
todo!()
|
let context = context.deref()?;
|
||||||
|
let package_id = context.id.clone();
|
||||||
|
|
||||||
|
context
|
||||||
|
.ctx
|
||||||
|
.db
|
||||||
|
.peek()
|
||||||
|
.await
|
||||||
|
.into_public()
|
||||||
|
.into_package_data()
|
||||||
|
.into_idx(&package_id)
|
||||||
|
.or_not_found(&package_id)?
|
||||||
|
.into_service_interfaces()
|
||||||
|
.de()
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn remove_address(context: EffectContext, data: RemoveAddressParams) -> Result<Value, Error> {
|
async fn remove_address(context: EffectContext, data: RemoveAddressParams) -> Result<Value, Error> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user