reactive_graph_plugin_graphql_schema/mutation/
mod.rs1use std::sync::Arc;
2
3use async_graphql::*;
4
5use reactive_graph_plugin_service_api::PluginContainerManager;
6use reactive_graph_plugin_service_api::PluginResolver;
7
8use crate::query::GraphQLPlugin;
9
10pub struct PluginMutation;
11
12#[Object(name = "Mutation")]
14impl PluginMutation {
15 async fn stop(&self, context: &Context<'_>, name: String) -> Result<GraphQLPlugin> {
17 let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
18 let plugin_resolver = context.data::<Arc<dyn PluginResolver + Send + Sync>>()?;
19 let id = plugin_container_manager.get_id(&name).ok_or_else(|| Error::new("Plugin with name not found"))?;
20 plugin_container_manager
22 .stop(&id)
23 .map_err(|e| Error::new(format!("Failed to start {}: {:?}", &id, e)))?;
24 plugin_resolver.resolve_until_idle().await;
26 plugin_resolver.transition_to_fallback_states().await;
27 Ok(GraphQLPlugin { id })
28 }
29
30 async fn start(&self, context: &Context<'_>, name: String) -> Result<GraphQLPlugin> {
32 let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
33 let plugin_resolver = context.data::<Arc<dyn PluginResolver + Send + Sync>>()?;
34 let id = plugin_container_manager.get_id(&name).ok_or_else(|| Error::new("Plugin with name not found"))?;
35 plugin_container_manager
37 .start(&id)
38 .map_err(|e| Error::new(format!("Failed to start {}: {:?}", &id, e)))?;
39 plugin_resolver.resolve_until_idle().await;
41 while plugin_container_manager.start_dependent_with_satisfied_dependencies(&id) {
43 plugin_resolver.resolve_until_idle().await;
45 }
46 plugin_resolver.transition_to_fallback_states().await;
47 Ok(GraphQLPlugin { id })
48 }
49
50 async fn restart(&self, context: &Context<'_>, name: String) -> Result<GraphQLPlugin> {
52 let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
53 let plugin_resolver = context.data::<Arc<dyn PluginResolver + Send + Sync>>()?;
54 let id = plugin_container_manager.get_id(&name).ok_or_else(|| Error::new("Plugin with name not found"))?;
55 plugin_container_manager
57 .stop(&id)
58 .map_err(|e| Error::new(format!("Failed to start {}: {:?}", &id, e)))?;
59 plugin_resolver.resolve_until_idle().await;
61 plugin_container_manager
63 .start(&id)
64 .map_err(|e| Error::new(format!("Failed to start {}: {:?}", &id, e)))?;
65 plugin_resolver.resolve_until_idle().await;
67 while plugin_container_manager.start_dependent_with_satisfied_dependencies(&id) {
69 plugin_resolver.resolve_until_idle().await;
71 }
72 plugin_resolver.transition_to_fallback_states().await;
73 Ok(GraphQLPlugin { id })
74 }
75
76 async fn uninstall(&self, context: &Context<'_>, name: String) -> Result<bool> {
78 let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
79 let plugin_resolver = context.data::<Arc<dyn PluginResolver + Send + Sync>>()?;
80 let id = plugin_container_manager.get_id(&name).ok_or_else(|| Error::new("Plugin with name not found"))?;
81 plugin_container_manager
83 .uninstall(&id)
84 .map_err(|e| Error::new(format!("Failed to uninstall {}: {:?}", &id, e)))?;
85 plugin_resolver.resolve_until_idle().await;
86 plugin_resolver.transition_to_fallback_states().await;
87 Ok(true)
88 }
89
90 async fn redeploy(&self, context: &Context<'_>, name: String) -> Result<GraphQLPlugin> {
92 let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
93 let plugin_resolver = context.data::<Arc<dyn PluginResolver + Send + Sync>>()?;
94 let id = plugin_container_manager.get_id(&name).ok_or_else(|| Error::new("Plugin with name not found"))?;
95 plugin_container_manager
96 .redeploy(&id)
97 .map_err(|e| Error::new(format!("Failed to start {}: {:?}", &id, e)))?;
98 plugin_resolver.resolve_until_idle().await;
99 plugin_resolver.transition_to_fallback_states().await;
100 Ok(GraphQLPlugin { id })
101 }
102}