From 62338d84319715663eebdaa6af9d6f66c506ca8b Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 15 Feb 2023 18:37:34 +0700 Subject: [PATCH 1/6] feat(builtins): impl srv.info, dist.get_blueprint --- particle-builtins/src/builtins.rs | 30 +++++++++++++++++++++++---- particle-services/src/app_services.rs | 24 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/particle-builtins/src/builtins.rs b/particle-builtins/src/builtins.rs index 184e362e75..74db2791af 100644 --- a/particle-builtins/src/builtins.rs +++ b/particle-builtins/src/builtins.rs @@ -24,8 +24,6 @@ use std::time::{Duration, Instant}; use derivative::Derivative; use fluence_keypair::{KeyPair, Signature}; -use futures::stream::FuturesUnordered; -use futures::StreamExt; use humantime_serde::re::humantime::format_duration as pretty; use libp2p::{core::Multiaddr, kad::kbucket::Key, kad::K_VALUE, PeerId}; use multihash::{Code, MultihashDigest, MultihashGeneric}; @@ -194,7 +192,8 @@ where ("srv", "get_interface") => wrap(self.get_interface(args, particle)), ("srv", "resolve_alias") => wrap(self.resolve_alias(args, particle)), ("srv", "add_alias") => wrap_unit(self.add_alias(args, particle)), - ("srv", "remove") => wrap_unit(self.remove_service(args, particle)), + ("srv", "remove") => wrap_unit(self.remove_service(args, particle)), + ("srv", "info") => wrap(self.get_service_info(args, particle)), ("dist", "add_module_from_vault") => wrap(self.add_module_from_vault(args, particle)), ("dist", "add_module") => wrap(self.add_module(args)), @@ -206,7 +205,8 @@ where ("dist", "load_blueprint") => wrap(self.load_blueprint_from_vault(args, particle)), ("dist", "list_modules") => wrap(self.list_modules()), ("dist", "get_module_interface") => wrap(self.get_module_interface(args)), - ("dist", "list_blueprints") => wrap(self.get_blueprints()), + ("dist", "list_blueprints") => wrap(self.get_blueprints()), + ("dist", "get_blueprint") => wrap(self.get_blueprint(args)), ("script", "add") => wrap(self.add_script_from_arg(args, particle)), ("script", "add_from_vault") => wrap(self.add_script_from_vault(args, particle)), @@ -303,6 +303,9 @@ where } async fn neighborhood_with_addresses(&self, args: Args) -> Result { + use futures::stream::FuturesUnordered; + use futures::StreamExt; + let neighbors = self.neighbor_peers(args).await?; let neighbors = neighbors .into_iter() @@ -789,6 +792,15 @@ where .collect() } + fn get_blueprint(&self, args: Args) -> Result { + let mut args = args.function_args.into_iter(); + let blueprint_id: String = Args::next("blueprint_id", &mut args)?; + + let blueprint = self.modules.get_blueprint_from_cache(&blueprint_id)?; + + Ok(json!(blueprint)) + } + fn create_service(&self, args: Args, params: ParticleParams) -> Result { let mut args = args.function_args.into_iter(); let blueprint_id: String = Args::next("blueprint_id", &mut args)?; @@ -844,6 +856,16 @@ where Ok(JValue::String(service_id)) } + fn get_service_info(&self, args: Args, params: ParticleParams) -> Result { + let mut args = args.function_args.into_iter(); + let service_id_or_alias: String = Args::next("service_id_or_alias", &mut args)?; + let info = self + .services + .get_service_info(params.host_id, service_id_or_alias)?; + + Ok(info) + } + fn kademlia(&self) -> &KademliaApi { self.connectivity.as_ref() } diff --git a/particle-services/src/app_services.rs b/particle-services/src/app_services.rs index a483198da5..81a9c5072c 100644 --- a/particle-services/src/app_services.rs +++ b/particle-services/src/app_services.rs @@ -187,6 +187,30 @@ impl ParticleAppServices { Ok(service_id) } + pub fn get_service_info( + &self, + worker_id: PeerId, + service_id_or_alias: String, + ) -> Result { + let services_read = self.services.read(); + let (service, service_id) = get_service( + &services_read, + &self.aliases.read(), + worker_id, + self.config.local_peer_id, + service_id_or_alias, + ) + .map_err(ServiceError::NoSuchService)?; + + Ok(json!({ + "id": service_id, + "blueprint_id": service.blueprint_id, + "owner_id": service.owner_id.to_string(), + "aliases": service.aliases, + "worker_id": service.worker_id.to_string() + })) + } + pub fn remove_service( &self, worker_id: PeerId, From 65221ecfa7a03200874ef75e665031316ff9ae76 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 15 Feb 2023 18:39:43 +0700 Subject: [PATCH 2/6] chore: fix formatting --- particle-builtins/src/builtins.rs | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/particle-builtins/src/builtins.rs b/particle-builtins/src/builtins.rs index 74db2791af..c917d1b584 100644 --- a/particle-builtins/src/builtins.rs +++ b/particle-builtins/src/builtins.rs @@ -183,40 +183,40 @@ where ("peer", "get_contact") => self.get_contact(args).await, ("peer", "timeout") => self.timeout(args).await, - ("kad", "neighborhood") => wrap(self.neighborhood(args).await), - ("kad", "neigh_with_addrs") => wrap(self.neighborhood_with_addresses(args).await), - ("kad", "merge") => wrap(self.kad_merge(args.function_args)), - - ("srv", "list") => ok(self.list_services()), - ("srv", "create") => wrap(self.create_service(args, particle)), - ("srv", "get_interface") => wrap(self.get_interface(args, particle)), - ("srv", "resolve_alias") => wrap(self.resolve_alias(args, particle)), - ("srv", "add_alias") => wrap_unit(self.add_alias(args, particle)), + ("kad", "neighborhood") => wrap(self.neighborhood(args).await), + ("kad", "neigh_with_addrs") => wrap(self.neighborhood_with_addresses(args).await), + ("kad", "merge") => wrap(self.kad_merge(args.function_args)), + + ("srv", "list") => ok(self.list_services()), + ("srv", "create") => wrap(self.create_service(args, particle)), + ("srv", "get_interface") => wrap(self.get_interface(args, particle)), + ("srv", "resolve_alias") => wrap(self.resolve_alias(args, particle)), + ("srv", "add_alias") => wrap_unit(self.add_alias(args, particle)), ("srv", "remove") => wrap_unit(self.remove_service(args, particle)), ("srv", "info") => wrap(self.get_service_info(args, particle)), ("dist", "add_module_from_vault") => wrap(self.add_module_from_vault(args, particle)), - ("dist", "add_module") => wrap(self.add_module(args)), - ("dist", "add_blueprint") => wrap(self.add_blueprint(args)), - ("dist", "make_module_config") => wrap(make_module_config(args)), - ("dist", "load_module_config") => wrap(self.load_module_config_from_vault(args, particle)), + ("dist", "add_module") => wrap(self.add_module(args)), + ("dist", "add_blueprint") => wrap(self.add_blueprint(args)), + ("dist", "make_module_config") => wrap(make_module_config(args)), + ("dist", "load_module_config") => wrap(self.load_module_config_from_vault(args, particle)), ("dist", "default_module_config") => wrap(self.default_module_config(args)), - ("dist", "make_blueprint") => wrap(self.make_blueprint(args)), - ("dist", "load_blueprint") => wrap(self.load_blueprint_from_vault(args, particle)), - ("dist", "list_modules") => wrap(self.list_modules()), - ("dist", "get_module_interface") => wrap(self.get_module_interface(args)), + ("dist", "make_blueprint") => wrap(self.make_blueprint(args)), + ("dist", "load_blueprint") => wrap(self.load_blueprint_from_vault(args, particle)), + ("dist", "list_modules") => wrap(self.list_modules()), + ("dist", "get_module_interface") => wrap(self.get_module_interface(args)), ("dist", "list_blueprints") => wrap(self.get_blueprints()), ("dist", "get_blueprint") => wrap(self.get_blueprint(args)), - ("script", "add") => wrap(self.add_script_from_arg(args, particle)), - ("script", "add_from_vault") => wrap(self.add_script_from_vault(args, particle)), - ("script", "remove") => wrap(self.remove_script(args, particle).await), - ("script", "list") => wrap(self.list_scripts().await), + ("script", "add") => wrap(self.add_script_from_arg(args, particle)), + ("script", "add_from_vault") => wrap(self.add_script_from_vault(args, particle)), + ("script", "remove") => wrap(self.remove_script(args, particle).await), + ("script", "list") => wrap(self.list_scripts().await), - ("op", "noop") => FunctionOutcome::Empty, - ("op", "array") => ok(Array(args.function_args)), - ("op", "array_length") => wrap(self.array_length(args.function_args)), - ("op", "concat") => wrap(self.concat(args.function_args)), + ("op", "noop") => FunctionOutcome::Empty, + ("op", "array") => ok(Array(args.function_args)), + ("op", "array_length") => wrap(self.array_length(args.function_args)), + ("op", "concat") => wrap(self.concat(args.function_args)), ("op", "string_to_b58") => wrap(self.string_to_b58(args.function_args)), ("op", "string_from_b58") => wrap(self.string_from_b58(args.function_args)), ("op", "bytes_from_b58") => wrap(self.bytes_from_b58(args.function_args)), From d0a779e55084c604934499feb354682571b585be Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 15 Feb 2023 18:40:17 +0700 Subject: [PATCH 3/6] chore: fix formatting wtf --- particle-builtins/src/builtins.rs | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/particle-builtins/src/builtins.rs b/particle-builtins/src/builtins.rs index c917d1b584..4ad7c26819 100644 --- a/particle-builtins/src/builtins.rs +++ b/particle-builtins/src/builtins.rs @@ -175,13 +175,13 @@ where use Result as R; #[rustfmt::skip] match (args.service_id.as_str(), args.function_name.as_str()) { - ("peer", "identify") => ok(json!(self.node_info)), - ("peer", "timestamp_ms") => ok(json!(now_ms() as u64)), - ("peer", "timestamp_sec") => ok(json!(now_sec())), - ("peer", "is_connected") => wrap(self.is_connected(args).await), - ("peer", "connect") => wrap(self.connect(args).await), - ("peer", "get_contact") => self.get_contact(args).await, - ("peer", "timeout") => self.timeout(args).await, + ("peer", "identify") => ok(json!(self.node_info)), + ("peer", "timestamp_ms") => ok(json!(now_ms() as u64)), + ("peer", "timestamp_sec") => ok(json!(now_sec())), + ("peer", "is_connected") => wrap(self.is_connected(args).await), + ("peer", "connect") => wrap(self.connect(args).await), + ("peer", "get_contact") => self.get_contact(args).await, + ("peer", "timeout") => self.timeout(args).await, ("kad", "neighborhood") => wrap(self.neighborhood(args).await), ("kad", "neigh_with_addrs") => wrap(self.neighborhood_with_addresses(args).await), @@ -217,15 +217,15 @@ where ("op", "array") => ok(Array(args.function_args)), ("op", "array_length") => wrap(self.array_length(args.function_args)), ("op", "concat") => wrap(self.concat(args.function_args)), - ("op", "string_to_b58") => wrap(self.string_to_b58(args.function_args)), - ("op", "string_from_b58") => wrap(self.string_from_b58(args.function_args)), - ("op", "bytes_from_b58") => wrap(self.bytes_from_b58(args.function_args)), - ("op", "bytes_to_b58") => wrap(self.bytes_to_b58(args.function_args)), - ("op", "sha256_string") => wrap(self.sha256_string(args.function_args)), - ("op", "concat_strings") => wrap(self.concat_strings(args.function_args)), - ("op", "identity") => self.identity(args.function_args), - - ("debug", "stringify") => self.stringify(args.function_args), + ("op", "string_to_b58") => wrap(self.string_to_b58(args.function_args)), + ("op", "string_from_b58") => wrap(self.string_from_b58(args.function_args)), + ("op", "bytes_from_b58") => wrap(self.bytes_from_b58(args.function_args)), + ("op", "bytes_to_b58") => wrap(self.bytes_to_b58(args.function_args)), + ("op", "sha256_string") => wrap(self.sha256_string(args.function_args)), + ("op", "concat_strings") => wrap(self.concat_strings(args.function_args)), + ("op", "identity") => self.identity(args.function_args), + + ("debug", "stringify") => self.stringify(args.function_args), ("stat", "service_memory") => wrap(self.service_mem_stats(args, particle)), ("stat", "service_stat") => wrap(self.service_stat(args, particle)), From 40beffab7758bab563815a8b461c11af22b965a3 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 15 Feb 2023 18:42:09 +0700 Subject: [PATCH 4/6] chore: i'm starting to hate CLion --- particle-builtins/src/builtins.rs | 96 +++++++++++++++---------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/particle-builtins/src/builtins.rs b/particle-builtins/src/builtins.rs index 4ad7c26819..69afe81c93 100644 --- a/particle-builtins/src/builtins.rs +++ b/particle-builtins/src/builtins.rs @@ -175,57 +175,57 @@ where use Result as R; #[rustfmt::skip] match (args.service_id.as_str(), args.function_name.as_str()) { - ("peer", "identify") => ok(json!(self.node_info)), - ("peer", "timestamp_ms") => ok(json!(now_ms() as u64)), - ("peer", "timestamp_sec") => ok(json!(now_sec())), - ("peer", "is_connected") => wrap(self.is_connected(args).await), - ("peer", "connect") => wrap(self.connect(args).await), - ("peer", "get_contact") => self.get_contact(args).await, - ("peer", "timeout") => self.timeout(args).await, - - ("kad", "neighborhood") => wrap(self.neighborhood(args).await), - ("kad", "neigh_with_addrs") => wrap(self.neighborhood_with_addresses(args).await), - ("kad", "merge") => wrap(self.kad_merge(args.function_args)), - - ("srv", "list") => ok(self.list_services()), - ("srv", "create") => wrap(self.create_service(args, particle)), - ("srv", "get_interface") => wrap(self.get_interface(args, particle)), - ("srv", "resolve_alias") => wrap(self.resolve_alias(args, particle)), - ("srv", "add_alias") => wrap_unit(self.add_alias(args, particle)), - ("srv", "remove") => wrap_unit(self.remove_service(args, particle)), - ("srv", "info") => wrap(self.get_service_info(args, particle)), + ("peer", "identify") => ok(json!(self.node_info)), + ("peer", "timestamp_ms") => ok(json!(now_ms() as u64)), + ("peer", "timestamp_sec") => ok(json!(now_sec())), + ("peer", "is_connected") => wrap(self.is_connected(args).await), + ("peer", "connect") => wrap(self.connect(args).await), + ("peer", "get_contact") => self.get_contact(args).await, + ("peer", "timeout") => self.timeout(args).await, + + ("kad", "neighborhood") => wrap(self.neighborhood(args).await), + ("kad", "neigh_with_addrs") => wrap(self.neighborhood_with_addresses(args).await), + ("kad", "merge") => wrap(self.kad_merge(args.function_args)), + + ("srv", "list") => ok(self.list_services()), + ("srv", "create") => wrap(self.create_service(args, particle)), + ("srv", "get_interface") => wrap(self.get_interface(args, particle)), + ("srv", "resolve_alias") => wrap(self.resolve_alias(args, particle)), + ("srv", "add_alias") => wrap_unit(self.add_alias(args, particle)), + ("srv", "remove") => wrap_unit(self.remove_service(args, particle)), + ("srv", "info") => wrap(self.get_service_info(args, particle)), ("dist", "add_module_from_vault") => wrap(self.add_module_from_vault(args, particle)), - ("dist", "add_module") => wrap(self.add_module(args)), - ("dist", "add_blueprint") => wrap(self.add_blueprint(args)), - ("dist", "make_module_config") => wrap(make_module_config(args)), - ("dist", "load_module_config") => wrap(self.load_module_config_from_vault(args, particle)), + ("dist", "add_module") => wrap(self.add_module(args)), + ("dist", "add_blueprint") => wrap(self.add_blueprint(args)), + ("dist", "make_module_config") => wrap(make_module_config(args)), + ("dist", "load_module_config") => wrap(self.load_module_config_from_vault(args, particle)), ("dist", "default_module_config") => wrap(self.default_module_config(args)), - ("dist", "make_blueprint") => wrap(self.make_blueprint(args)), - ("dist", "load_blueprint") => wrap(self.load_blueprint_from_vault(args, particle)), - ("dist", "list_modules") => wrap(self.list_modules()), - ("dist", "get_module_interface") => wrap(self.get_module_interface(args)), - ("dist", "list_blueprints") => wrap(self.get_blueprints()), - ("dist", "get_blueprint") => wrap(self.get_blueprint(args)), - - ("script", "add") => wrap(self.add_script_from_arg(args, particle)), - ("script", "add_from_vault") => wrap(self.add_script_from_vault(args, particle)), - ("script", "remove") => wrap(self.remove_script(args, particle).await), - ("script", "list") => wrap(self.list_scripts().await), - - ("op", "noop") => FunctionOutcome::Empty, - ("op", "array") => ok(Array(args.function_args)), - ("op", "array_length") => wrap(self.array_length(args.function_args)), - ("op", "concat") => wrap(self.concat(args.function_args)), - ("op", "string_to_b58") => wrap(self.string_to_b58(args.function_args)), - ("op", "string_from_b58") => wrap(self.string_from_b58(args.function_args)), - ("op", "bytes_from_b58") => wrap(self.bytes_from_b58(args.function_args)), - ("op", "bytes_to_b58") => wrap(self.bytes_to_b58(args.function_args)), - ("op", "sha256_string") => wrap(self.sha256_string(args.function_args)), - ("op", "concat_strings") => wrap(self.concat_strings(args.function_args)), - ("op", "identity") => self.identity(args.function_args), - - ("debug", "stringify") => self.stringify(args.function_args), + ("dist", "make_blueprint") => wrap(self.make_blueprint(args)), + ("dist", "load_blueprint") => wrap(self.load_blueprint_from_vault(args, particle)), + ("dist", "list_modules") => wrap(self.list_modules()), + ("dist", "get_module_interface") => wrap(self.get_module_interface(args)), + ("dist", "list_blueprints") => wrap(self.get_blueprints()), + ("dist", "get_blueprint") => wrap(self.get_blueprint(args)), + + ("script", "add") => wrap(self.add_script_from_arg(args, particle)), + ("script", "add_from_vault") => wrap(self.add_script_from_vault(args, particle)), + ("script", "remove") => wrap(self.remove_script(args, particle).await), + ("script", "list") => wrap(self.list_scripts().await), + + ("op", "noop") => FunctionOutcome::Empty, + ("op", "array") => ok(Array(args.function_args)), + ("op", "array_length") => wrap(self.array_length(args.function_args)), + ("op", "concat") => wrap(self.concat(args.function_args)), + ("op", "string_to_b58") => wrap(self.string_to_b58(args.function_args)), + ("op", "string_from_b58") => wrap(self.string_from_b58(args.function_args)), + ("op", "bytes_from_b58") => wrap(self.bytes_from_b58(args.function_args)), + ("op", "bytes_to_b58") => wrap(self.bytes_to_b58(args.function_args)), + ("op", "sha256_string") => wrap(self.sha256_string(args.function_args)), + ("op", "concat_strings") => wrap(self.concat_strings(args.function_args)), + ("op", "identity") => self.identity(args.function_args), + + ("debug", "stringify") => self.stringify(args.function_args), ("stat", "service_memory") => wrap(self.service_mem_stats(args, particle)), ("stat", "service_stat") => wrap(self.service_stat(args, particle)), From b4486467d47e208bdee02cb83d242bf23d3e78e3 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 15 Feb 2023 18:42:46 +0700 Subject: [PATCH 5/6] chore: fix formatting wtf --- particle-builtins/src/builtins.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/particle-builtins/src/builtins.rs b/particle-builtins/src/builtins.rs index 69afe81c93..b87537024a 100644 --- a/particle-builtins/src/builtins.rs +++ b/particle-builtins/src/builtins.rs @@ -173,6 +173,7 @@ where // TODO: get rid of all blocking methods (std::fs and such) pub async fn builtins_call(&self, args: Args, particle: ParticleParams) -> FunctionOutcome { use Result as R; + #[rustfmt::skip] match (args.service_id.as_str(), args.function_name.as_str()) { ("peer", "identify") => ok(json!(self.node_info)), From 7b5412d6427a706c831da35f7741da4c3a2fc377 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 15 Feb 2023 18:54:53 +0700 Subject: [PATCH 6/6] feat: add worker_id to srv.list --- particle-services/src/app_services.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/particle-services/src/app_services.rs b/particle-services/src/app_services.rs index 81a9c5072c..d1d0344fde 100644 --- a/particle-services/src/app_services.rs +++ b/particle-services/src/app_services.rs @@ -597,7 +597,8 @@ impl ParticleAppServices { "id": id, "blueprint_id": srv.blueprint_id, "owner_id": srv.owner_id.to_string(), - "aliases": srv.aliases + "aliases": srv.aliases, + "worker_id": srv.worker_id.to_string() }) }) .collect();