rkubectl_app/cli/command/basic/
create.rs1use super::*;
2
3use rkubectl_ui::Created;
4
5use clusterrole::CreateClusterRole;
6use namespace::CreateNamespace;
7use secret::CreateSecret;
8
9mod clusterrole;
10mod namespace;
11mod secret;
12
13#[derive(Clone, Debug, Args)]
28#[command(arg_required_else_help(true), subcommand_negates_reqs(true))]
29pub struct Create {
30 #[arg(
33 long,
34 value_enum,
35 default_value_t = DryRun::None,
36 )]
38 dry_run: DryRun,
39
40 #[arg(long)]
42 edit: bool,
43
44 #[arg(long, default_value = "kubectl-create")]
46 field_manager: String,
47
48 #[arg(short, long, required = true)]
50 filename: Option<String>,
51
52 #[arg(long, short = 'R', requires = "filename")]
55 recursive: bool,
56
57 #[arg(long)]
61 save_config: bool,
62
63 #[arg(long)]
65 show_managed_fields: bool,
66
67 #[command(subcommand)]
68 command: Option<CreateResource>,
69}
70
71#[derive(Clone, Debug, Subcommand)]
72#[command(rename_all = "lowercase")]
73pub enum CreateResource {
74 ClusterRole(CreateClusterRole),
76 ClusterRoleBinding,
78 ConfigMap,
80 CronJob,
82 Deployment,
84 Ingress,
86 Job,
88 #[command(visible_alias = "ns")]
90 Namespace(CreateNamespace),
91 PodDisruptionBudget,
93 PriorityClass,
95 Quota,
97 Role,
99 RoleBinding,
101 #[command(subcommand)]
103 Secret(CreateSecret),
104 Service,
106 ServiceAccount,
108 Token,
110}
111
112impl Create {
113 pub async fn exec(self, context: &Context) -> RkResult<()> {
114 let kubeapi = context.kubeapi();
115 let created = if let Some(filename) = &self.filename {
116 self.create_from_file(filename, kubeapi).await
117 } else {
118 self.create_resource(kubeapi).await
119 }?;
120
121 let namespace = kubeapi.show_namespace();
122 let params = self.params();
123 let output = context.output_deprecated();
124 println!("{}", created.output(namespace, params, output));
125 Ok(())
126 }
127
128 async fn create_from_file(&self, filename: &str, kubeapi: &Kubeapi) -> RkResult<Box<dyn Show>> {
129 let pp = kubeapi.post_params_with_manager(&self.field_manager);
130 println!("Creating from {filename} [{pp:?}]");
131 Err(RkError::todo())
132 }
133
134 async fn create_resource(&self, kubeapi: &Kubeapi) -> RkResult<Box<dyn Show>> {
135 if let Some(command) = &self.command {
136 let pp = kubeapi.post_params_with_manager(&self.field_manager);
137 command.exec(kubeapi, &pp).await
138 } else {
139 unreachable!()
140 }
141 }
142
143 fn params(&self) -> ShowParams {
144 ShowParams {
145 show_managed_fields: self.show_managed_fields,
146 ..default()
147 }
148 }
149}
150
151impl CreateResource {
152 pub async fn exec(&self, kubeapi: &Kubeapi, pp: &api::PostParams) -> RkResult<Box<dyn Show>> {
153 match self {
154 Self::ClusterRole(cluster_role) => cluster_role.exec(kubeapi, pp).await,
155 Self::ClusterRoleBinding => Err(RkError::todo()),
156 Self::ConfigMap => Err(RkError::todo()),
157 Self::CronJob => Err(RkError::todo()),
158 Self::Deployment => Err(RkError::todo()),
159 Self::Ingress => Err(RkError::todo()),
160 Self::Job => Err(RkError::todo()),
161 Self::Namespace(namespace) => namespace.exec(kubeapi, pp).await,
162 Self::PodDisruptionBudget => Err(RkError::todo()),
163 Self::PriorityClass => Err(RkError::todo()),
164 Self::Quota => Err(RkError::todo()),
165 Self::Role => Err(RkError::todo()),
166 Self::RoleBinding => Err(RkError::todo()),
167 Self::Secret(secret) => secret.exec(kubeapi, pp).await,
168 Self::Service => Err(RkError::todo()),
169 Self::ServiceAccount => Err(RkError::todo()),
170 Self::Token => Err(RkError::todo()),
171 }
172 }
173}