Skip to main content

mz_secrets_cli/
lib.rs

1// Copyright Materialize, Inc. and contributors. All rights reserved.
2//
3// Use of this software is governed by the Business Source License
4// included in the LICENSE file.
5//
6// As of the Change Date specified in that file, in accordance with
7// the Business Source License, use of this software will be governed
8// by the Apache License, Version 2.0.
9
10use std::path::PathBuf;
11
12use clap::ValueEnum;
13
14#[derive(clap::Parser, Clone, Debug)]
15pub struct SecretsReaderCliArgs {
16    /// The secrets reader implementation to use.
17    #[structopt(long, value_enum, env = "SECRETS_READER")]
18    pub secrets_reader: SecretsControllerKind,
19    /// When using the process secrets reader, the directory on the filesystem
20    /// where secrets are stored.
21    #[structopt(
22        long,
23        required_if_eq("secrets_reader", "local-file"),
24        env = "SECRETS_READER_LOCAL_FILE_DIR"
25    )]
26    pub secrets_reader_local_file_dir: Option<PathBuf>,
27    /// When using the Kubernetes secrets reader, the Kubernetes context to
28    /// load.
29    #[structopt(
30        long,
31        required_if_eq("secrets_reader", "kubernetes"),
32        env = "SECRETS_READER_KUBERNETES_CONTEXT"
33    )]
34    pub secrets_reader_kubernetes_context: Option<String>,
35    /// When using the AWS secrets reader, we need both of the following.
36    #[structopt(
37        long,
38        required_if_eq("secrets_reader", "aws-secrets-manager"),
39        env = "SECRETS_READER_AWS_PREFIX"
40    )]
41    pub secrets_reader_aws_prefix: Option<String>,
42    /// When using the Kubernetes secrets reader, the prefix to use for secret
43    /// names.
44    #[structopt(long, env = "SECRETS_READER_NAME_PREFIX")]
45    pub secrets_reader_name_prefix: Option<String>,
46}
47
48#[derive(ValueEnum, Debug, Clone, Copy)]
49pub enum SecretsControllerKind {
50    LocalFile,
51    Kubernetes,
52    AwsSecretsManager,
53}
54
55impl SecretsReaderCliArgs {
56    /// Turn this struct back into arguments. Useful for passing through to other services.
57    ///
58    /// Expects the correct arguments to be filled in, based on the `clap` requirements.
59    pub fn to_flags(&self) -> Vec<String> {
60        match self.secrets_reader {
61            SecretsControllerKind::LocalFile => {
62                vec![
63                    "--secrets-reader=local-file".to_string(),
64                    format!(
65                        "--secrets-reader-local-file-dir={}",
66                        self.secrets_reader_local_file_dir
67                            .as_ref()
68                            .expect("initialized correctly")
69                            .display()
70                    ),
71                ]
72            }
73            SecretsControllerKind::Kubernetes => {
74                vec![
75                    "--secrets-reader=kubernetes".to_string(),
76                    format!(
77                        "--secrets-reader-kubernetes-context={}",
78                        self.secrets_reader_kubernetes_context
79                            .as_ref()
80                            .expect("initialized correctly")
81                    ),
82                ]
83            }
84            SecretsControllerKind::AwsSecretsManager => {
85                vec![
86                    "--secrets-reader=aws-secrets-manager".to_string(),
87                    format!(
88                        "--secrets-reader-aws-prefix={}",
89                        self.secrets_reader_aws_prefix
90                            .as_ref()
91                            .expect("initialized correctly")
92                    ),
93                ]
94            }
95        }
96    }
97}