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:
Dominion5254
2024-04-25 17:16:20 -06:00
committed by GitHub
parent 3a5ee4a296
commit e08d93b2aa

View File

@@ -11,7 +11,9 @@ use clap::Parser;
use emver::VersionRange;
use imbl::OrdMap;
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 rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler};
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::overlayfs::OverlayGuard;
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::s9pk::merkle_archive::source::http::{HttpReader, HttpSource};
use crate::s9pk::rpc::SKIP_ENV;
@@ -191,29 +197,11 @@ struct GetServicePortForwardParams {
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)]
#[ts(export)]
#[serde(rename_all = "camelCase")]
struct ExportServiceInterfaceParams {
id: String,
id: ServiceInterfaceId,
name: String,
description: String,
has_primary: bool,
@@ -221,6 +209,8 @@ struct ExportServiceInterfaceParams {
masked: bool,
address_info: AddressInfo,
r#type: ServiceInterfaceType,
host_kind: HostKind,
hostnames: Vec<ExportedHostnameInfo>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)]
#[ts(export)]
@@ -336,9 +326,57 @@ async fn clear_network_interfaces(context: EffectContext, _: Empty) -> Result<Va
}
async fn export_service_interface(
context: EffectContext,
data: ExportServiceInterfaceParams,
) -> Result<Value, Error> {
todo!()
ExportServiceInterfaceParams {
id,
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(
context: EffectContext,
@@ -349,9 +387,23 @@ async fn get_primary_url(
async fn list_service_interfaces(
context: EffectContext,
data: ListServiceInterfacesParams,
) -> Result<Value, Error> {
todo!()
) -> Result<BTreeMap<ServiceInterfaceId, ServiceInterfaceWithHostInfo>, Error> {
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> {
todo!()
}