Skip to content

Commit bdb096a

Browse files
committed
add environment variables to all command flags
1 parent 0e658c0 commit bdb096a

File tree

3 files changed

+83
-52
lines changed

3 files changed

+83
-52
lines changed

README.md

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,14 @@ Usage:
5555
cain backup [flags]
5656
5757
Flags:
58-
-b, --buffer-size float in memory buffer size (MB) to use for files copy (buffer per file) (default 6.75)
58+
-b, --buffer-size float in memory buffer size (MB) to use for files copy (buffer per file). Overrides $CAIN_BUFFER_SIZE (default 6.75)
5959
--cassandra-data-dir string cassandra data directory. Overrides $CAIN_CASSANDRA_DATA_DIR (default "/var/lib/cassandra/data")
60-
-c, --container string container name to act on (default "cassandra")
61-
--dst string destination to backup to. Example: s3://bucket/cassandra
62-
-h, --help help for backup
63-
-k, --keyspace string keyspace to act on
64-
-n, --namespace string namespace to find cassandra cluster
65-
-p, --parallel int number of files to copy in parallel. set this flag to 0 for full parallelism (default 1)
66-
-l, --selector string selector to filter on
60+
-c, --container string container name to act on. Overrides $CAIN_CONTAINER (default "cassandra")
61+
--dst string destination to backup to. Example: s3://bucket/cassandra. Overrides $CAIN_DST
62+
-k, --keyspace string keyspace to act on. Overrides $CAIN_KEYSPACE
63+
-n, --namespace string namespace to find cassandra cluster. Overrides $CAIN_NAMESPACE (default "default")
64+
-p, --parallel int number of files to copy in parallel. set this flag to 0 for full parallelism. Overrides $CAIN_PARALLEL (default 1)
65+
-l, --selector string selector to filter on. Overrides $CAIN_SELECTOR (default "app=cassandra")
6766
```
6867

6968
#### Examples
@@ -106,18 +105,17 @@ Usage:
106105
cain restore [flags]
107106
108107
Flags:
109-
-b, --buffer-size float in memory buffer size (MB) to use for files copy (buffer per file) (default 6.75)
108+
-b, --buffer-size float in memory buffer size (MB) to use for files copy (buffer per file). Overrides $CAIN_BUFFER_SIZE (default 6.75)
110109
--cassandra-data-dir string cassandra data directory. Overrides $CAIN_CASSANDRA_DATA_DIR (default "/var/lib/cassandra/data")
111-
-c, --container string container name to act on (default "cassandra")
112-
-h, --help help for restore
113-
-k, --keyspace string keyspace to act on
114-
-n, --namespace string namespace to find cassandra cluster
115-
-p, --parallel int number of files to copy in parallel. set this flag to 0 for full parallelism (default 1)
116-
-s, --schema string schema version to restore (optional)
117-
-l, --selector string selector to filter on
118-
--src string source to restore from. Example: s3://bucket/cassandra/namespace/cluster-name
119-
-t, --tag string tag to restore
120-
--user-group string user and group who should own restored files (default "cassandra:cassandra")
110+
-c, --container string container name to act on. Overrides $CAIN_CONTAINER (default "cassandra")
111+
-k, --keyspace string keyspace to act on. Overrides $CAIN_KEYSPACE
112+
-n, --namespace string namespace to find cassandra cluster. Overrides $CAIN_NAMESPACE (default "default")
113+
-p, --parallel int number of files to copy in parallel. set this flag to 0 for full parallelism. Overrides $CAIN_PARALLEL (default 1)
114+
-s, --schema string schema version to restore (optional). Overrides $CAIN_SCHEMA
115+
-l, --selector string selector to filter on. Overrides $CAIN_SELECTOR (default "app=cassandra")
116+
--src string source to restore from. Example: s3://bucket/cassandra/namespace/cluster-name. Overrides $CAIN_SRC
117+
-t, --tag string tag to restore. Overrides $CAIN_TAG
118+
--user-group string user and group who should own restored files. Overrides $CAIN_USER_GROUP (default "cassandra:cassandra")
121119
```
122120

123121
#### Examples
@@ -158,12 +156,11 @@ Usage:
158156
cain schema [flags]
159157
160158
Flags:
161-
-c, --container string container name to act on (default "cassandra")
162-
-h, --help help for schema
163-
-k, --keyspace string keyspace to act on
164-
-n, --namespace string namespace to find cassandra cluster
165-
-l, --selector string selector to filter on
166-
--sum print only checksum
159+
-c, --container string container name to act on. Overrides $CAIN_CONTAINER (default "cassandra")
160+
-k, --keyspace string keyspace to act on. Overrides $CAIN_KEYSPACE
161+
-n, --namespace string namespace to find cassandra cluster. Overrides $CAIN_NAMESPACE (default "default")
162+
-l, --selector string selector to filter on. Overrides $CAIN_SELECTOR (default "app=cassandra")
163+
--sum print only checksum. Overrides $CAIN_SUM
167164
```
168165

169166
#### Examples
@@ -182,6 +179,30 @@ cain schema \
182179
--sum
183180
```
184181

182+
## Environment variables support
183+
184+
Cain commands support the usage of environment variables instead of flags. For example:
185+
The `backup` command can be executed as mentioned in the example:
186+
187+
```
188+
cain backup \
189+
-n default \
190+
-l release=cassandra \
191+
-k keyspace \
192+
--dst s3://db-backup/cassandra
193+
```
194+
195+
You can also set the appropriate envrionment variables (CAIN_FLAG, _ instead of -):
196+
197+
```
198+
export CAIN_NAMESPACE=default
199+
export CAIN_SELECTOR=release=cassandra
200+
export CAIN_KEYSPACE=keyspace
201+
export CAIN_DST=s3://db-backup/cassandra
202+
203+
cain backup
204+
```
205+
185206
## Support for additional storage services
186207

187208
Since Cain uses [Skbn](https://github.com/nuvo/skbn), adding support for additional storage services is simple. Read [this post](https://medium.com/nuvo-group-tech/copy-files-and-directories-between-kubernetes-and-s3-d290ded9a5e0) for more information.

cmd/cain.go

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ func NewBackupCmd(out io.Writer) *cobra.Command {
8989
}
9090
f := cmd.Flags()
9191

92-
f.StringVarP(&b.namespace, "namespace", "n", "", "namespace to find cassandra cluster")
93-
f.StringVarP(&b.selector, "selector", "l", "", "selector to filter on")
94-
f.StringVarP(&b.container, "container", "c", "cassandra", "container name to act on")
95-
f.StringVarP(&b.keyspace, "keyspace", "k", "", "keyspace to act on")
96-
f.StringVar(&b.dst, "dst", "", "destination to backup to. Example: s3://bucket/cassandra")
97-
f.IntVarP(&b.parallel, "parallel", "p", 1, "number of files to copy in parallel. set this flag to 0 for full parallelism")
98-
f.Float64VarP(&b.bufferSize, "buffer-size", "b", 6.75, "in memory buffer size (MB) to use for files copy (buffer per file)")
99-
f.StringVarP(&b.cassandraDataDir, "cassandra-data-dir", "", utils.GetStringEnvVar("CAIN_CASSANDRA_DATA_DIR", "/var/lib/cassandra/data"), "cassandra data directory. Overrides $CAIN_CASSANDRA_DATA_DIR")
92+
f.StringVarP(&b.namespace, "namespace", "n", utils.GetStringEnvVar("CAIN_NAMESPACE", "default"), "namespace to find cassandra cluster. Overrides $CAIN_NAMESPACE")
93+
f.StringVarP(&b.selector, "selector", "l", utils.GetStringEnvVar("CAIN_SELECTOR", "app=cassandra"), "selector to filter on. Overrides $CAIN_SELECTOR")
94+
f.StringVarP(&b.container, "container", "c", utils.GetStringEnvVar("CAIN_CONTAINER", "cassandra"), "container name to act on. Overrides $CAIN_CONTAINER")
95+
f.StringVarP(&b.keyspace, "keyspace", "k", utils.GetStringEnvVar("CAIN_KEYSPACE", ""), "keyspace to act on. Overrides $CAIN_KEYSPACE")
96+
f.StringVar(&b.dst, "dst", utils.GetStringEnvVar("CAIN_DST", ""), "destination to backup to. Example: s3://bucket/cassandra. Overrides $CAIN_DST")
97+
f.IntVarP(&b.parallel, "parallel", "p", utils.GetIntEnvVar("CAIN_PARALLEL", 1), "number of files to copy in parallel. set this flag to 0 for full parallelism. Overrides $CAIN_PARALLEL")
98+
f.Float64VarP(&b.bufferSize, "buffer-size", "b", utils.GetFloat64EnvVar("CAIN_BUFFER_SIZE", 6.75), "in memory buffer size (MB) to use for files copy (buffer per file). Overrides $CAIN_BUFFER_SIZE")
99+
f.StringVar(&b.cassandraDataDir, "cassandra-data-dir", utils.GetStringEnvVar("CAIN_CASSANDRA_DATA_DIR", "/var/lib/cassandra/data"), "cassandra data directory. Overrides $CAIN_CASSANDRA_DATA_DIR")
100100

101101
return cmd
102102
}
@@ -161,17 +161,17 @@ func NewRestoreCmd(out io.Writer) *cobra.Command {
161161
}
162162
f := cmd.Flags()
163163

164-
f.StringVar(&r.src, "src", "", "source to restore from. Example: s3://bucket/cassandra/namespace/cluster-name")
165-
f.StringVarP(&r.keyspace, "keyspace", "k", "", "keyspace to act on")
166-
f.StringVarP(&r.tag, "tag", "t", "", "tag to restore")
167-
f.StringVarP(&r.schema, "schema", "s", "", "schema version to restore (optional)")
168-
f.StringVarP(&r.namespace, "namespace", "n", "", "namespace to find cassandra cluster")
169-
f.StringVarP(&r.selector, "selector", "l", "", "selector to filter on")
170-
f.StringVarP(&r.container, "container", "c", "cassandra", "container name to act on")
171-
f.IntVarP(&r.parallel, "parallel", "p", 1, "number of files to copy in parallel. set this flag to 0 for full parallelism")
172-
f.Float64VarP(&r.bufferSize, "buffer-size", "b", 6.75, "in memory buffer size (MB) to use for files copy (buffer per file)")
173-
f.StringVar(&r.userGroup, "user-group", "cassandra:cassandra", "user and group who should own restored files")
174-
f.StringVarP(&r.cassandraDataDir, "cassandra-data-dir", "", utils.GetStringEnvVar("CAIN_CASSANDRA_DATA_DIR", "/var/lib/cassandra/data"), "cassandra data directory. Overrides $CAIN_CASSANDRA_DATA_DIR")
164+
f.StringVar(&r.src, "src", utils.GetStringEnvVar("CAIN_SRC", ""), "source to restore from. Example: s3://bucket/cassandra/namespace/cluster-name. Overrides $CAIN_SRC")
165+
f.StringVarP(&r.keyspace, "keyspace", "k", utils.GetStringEnvVar("CAIN_KEYSPACE", ""), "keyspace to act on. Overrides $CAIN_KEYSPACE")
166+
f.StringVarP(&r.tag, "tag", "t", utils.GetStringEnvVar("CAIN_TAG", ""), "tag to restore. Overrides $CAIN_TAG")
167+
f.StringVarP(&r.schema, "schema", "s", utils.GetStringEnvVar("CAIN_SCHEMA", ""), "schema version to restore (optional). Overrides $CAIN_SCHEMA")
168+
f.StringVarP(&r.namespace, "namespace", "n", utils.GetStringEnvVar("CAIN_NAMESPACE", "default"), "namespace to find cassandra cluster. Overrides $CAIN_NAMESPACE")
169+
f.StringVarP(&r.selector, "selector", "l", utils.GetStringEnvVar("CAIN_SELECTOR", "app=cassandra"), "selector to filter on. Overrides $CAIN_SELECTOR")
170+
f.StringVarP(&r.container, "container", "c", utils.GetStringEnvVar("CAIN_CONTAINER", "cassandra"), "container name to act on. Overrides $CAIN_CONTAINER")
171+
f.IntVarP(&r.parallel, "parallel", "p", utils.GetIntEnvVar("CAIN_PARALLEL", 1), "number of files to copy in parallel. set this flag to 0 for full parallelism. Overrides $CAIN_PARALLEL")
172+
f.Float64VarP(&r.bufferSize, "buffer-size", "b", utils.GetFloat64EnvVar("CAIN_BUFFER_SIZE", 6.75), "in memory buffer size (MB) to use for files copy (buffer per file). Overrides $CAIN_BUFFER_SIZE")
173+
f.StringVar(&r.userGroup, "user-group", utils.GetStringEnvVar("CAIN_USER_GROUP", "cassandra:cassandra"), "user and group who should own restored files. Overrides $CAIN_USER_GROUP")
174+
f.StringVar(&r.cassandraDataDir, "cassandra-data-dir", utils.GetStringEnvVar("CAIN_CASSANDRA_DATA_DIR", "/var/lib/cassandra/data"), "cassandra data directory. Overrides $CAIN_CASSANDRA_DATA_DIR")
175175

176176
return cmd
177177
}
@@ -221,14 +221,11 @@ func NewSchemaCmd(out io.Writer) *cobra.Command {
221221
}
222222
f := cmd.Flags()
223223

224-
f.StringVarP(&s.namespace, "namespace", "n", "", "namespace to find cassandra cluster")
225-
f.StringVarP(&s.selector, "selector", "l", "", "selector to filter on")
226-
f.StringVarP(&s.container, "container", "c", "cassandra", "container name to act on")
227-
f.StringVarP(&s.keyspace, "keyspace", "k", "", "keyspace to act on")
228-
f.BoolVar(&s.sum, "sum", false, "print only checksum")
229-
230-
cmd.MarkFlagRequired("namespace")
231-
cmd.MarkFlagRequired("selector")
224+
f.StringVarP(&s.namespace, "namespace", "n", utils.GetStringEnvVar("CAIN_NAMESPACE", "default"), "namespace to find cassandra cluster. Overrides $CAIN_NAMESPACE")
225+
f.StringVarP(&s.selector, "selector", "l", utils.GetStringEnvVar("CAIN_SELECTOR", "app=cassandra"), "selector to filter on. Overrides $CAIN_SELECTOR")
226+
f.StringVarP(&s.container, "container", "c", utils.GetStringEnvVar("CAIN_CONTAINER", "cassandra"), "container name to act on. Overrides $CAIN_CONTAINER")
227+
f.StringVarP(&s.keyspace, "keyspace", "k", utils.GetStringEnvVar("CAIN_KEYSPACE", ""), "keyspace to act on. Overrides $CAIN_KEYSPACE")
228+
f.BoolVar(&s.sum, "sum", utils.GetBoolEnvVar("CAIN_SUM", false), "print only checksum. Overrides $CAIN_SUM")
232229

233230
return cmd
234231
}

pkg/utils/env.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,16 @@ func GetBoolEnvVar(name string, defVal bool) bool {
3939
}
4040
return defVal
4141
}
42+
43+
// GetFloat64EnvVar returns the default value if the variable is empty, else the value
44+
func GetFloat64EnvVar(name string, defVal float64) float64 {
45+
val := os.Getenv(name)
46+
if val == "" {
47+
return defVal
48+
}
49+
iVal, err := strconv.ParseFloat(val, 64)
50+
if err != nil {
51+
return defVal
52+
}
53+
return iVal
54+
}

0 commit comments

Comments
 (0)