constancy 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +75 -15
- data/lib/constancy/cli.rb +3 -0
- data/lib/constancy/cli/targets_command.rb +21 -0
- data/lib/constancy/sync_target.rb +22 -1
- data/lib/constancy/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d19ad8be143bf52f84efca8bcbec9b3883bba3b840ea77583179a41c03de514c
|
4
|
+
data.tar.gz: 6b403727f5ef73b943b09b33e127b701bf52b95fcfb287900a992198ae0cbbca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 865d4c79c77a83070381ecc61e7cad153bc4c8d540907d15d6798437615171cd061b36816ef0e2327cc7419f6a1f24cb61388e225ffb1646943058025befef5d
|
7
|
+
data.tar.gz: f07b781b03b708fe48c3ff010efcfc2e2df652848561af8bd332651b21368c6454602d52d7058c2600e16ead78f50a9d305e932c724b0f9c2404b05454c9a005
|
data/README.md
CHANGED
@@ -222,33 +222,92 @@ If the file `yourapp.yml` has the following content:
|
|
222
222
|
prod/dbname: yourapp
|
223
223
|
prod/message: |
|
224
224
|
Hello, world. This is a multiline message.
|
225
|
-
|
226
|
-
Thanks,
|
227
|
-
YourApp
|
225
|
+
Thanks.
|
228
226
|
prod/app/config.json: |
|
229
227
|
{
|
230
228
|
"port": 8080,
|
231
|
-
"listen": "0.0.0.0",
|
232
229
|
"enabled": true
|
233
230
|
}
|
234
231
|
|
235
232
|
Then `constancy push` will attempt to create and/or update the following keys
|
236
233
|
with the corresponding content from `yourapp.yml`:
|
237
234
|
|
238
|
-
|
239
|
-
|
240
|
-
|
235
|
+
| `config/yourapp/prod/dbname` | `yourapp` |
|
236
|
+
| `config/yourapp/prod/message` | `Hello, world. This is a multiline message.\nThanks.` |
|
237
|
+
| `config/yourapp/prod/app/config.json` | `{\n "port": 8080,\n "enabled": true\n}` |
|
241
238
|
|
242
|
-
|
243
|
-
|
244
|
-
whatever values are there.
|
239
|
+
In addition to specifying the entire relative path in each key, you may also
|
240
|
+
reference paths via your file's YAML structure directly. For example:
|
245
241
|
|
246
|
-
|
247
|
-
|
248
|
-
|
242
|
+
---
|
243
|
+
prod:
|
244
|
+
redis:
|
245
|
+
port: 6380
|
246
|
+
host: redis.example.com
|
247
|
+
|
248
|
+
When pushed, this document will create and/or update the following keys:
|
249
|
+
|
250
|
+
| `config/yourapp/prod/redis/port` | `6380` |
|
251
|
+
| `config/yourapp/prod/redis/host` | `redis.example.com` |
|
252
|
+
|
253
|
+
You may mix and match relative paths and document hierarchy to build paths as
|
254
|
+
you would like. And you may also use the special key `_` to embed a value for
|
255
|
+
a particular prefix while also nesting values underneath it. For example, given
|
256
|
+
this local file target content:
|
257
|
+
|
258
|
+
---
|
259
|
+
prod/postgres:
|
260
|
+
host: db.myproject.example.com
|
261
|
+
port: 10001
|
262
|
+
|
263
|
+
prod:
|
264
|
+
redis:
|
265
|
+
_: Embedded Value
|
266
|
+
port: 6380
|
267
|
+
|
268
|
+
prod/redis/host: cache.myproject.example.com
|
269
|
+
|
270
|
+
This file target content would correspond to the following values, when pushed:
|
271
|
+
|
272
|
+
| `config/yourapp/prod/postgres/host` | `db.myproject.example.com` |
|
273
|
+
| `config/yourapp/prod/postgres/port` | `10001` |
|
274
|
+
| `config/yourapp/prod/redis` | `Embedded Value` |
|
275
|
+
| `config/yourapp/prod/redis/port` | `6380` |
|
276
|
+
| `config/yourapp/prod/redis/host` | `cache.myproject.example.com` |
|
277
|
+
|
278
|
+
A `constancy pull` operation against a file type target will work in reverse,
|
279
|
+
and pull values from any keys under `config/yourapp/` into the file
|
280
|
+
`yourapp.yml`, overwriting whatever values are there.
|
281
|
+
|
282
|
+
**NOTE**: Values in local file targets are converted to strings before comparing
|
283
|
+
with or uploading to the remote Consul server. However, because YAML parsing
|
284
|
+
converts some values (such as `yes` or `no`) to boolean types, the effective
|
285
|
+
value of a key with a value of a bare `yes` will be `true` when converted to a
|
286
|
+
string. If you need the actual values `yes` or `no`, use quotes around the value
|
287
|
+
to force the YAML parser to interpret it as a string.
|
288
|
+
|
289
|
+
|
290
|
+
#### IMPORTANT NOTES ABOUT PULL MODE WITH FILE TARGETS
|
291
|
+
|
292
|
+
Against a file target, the structure of the local file can vary in a number
|
293
|
+
of ways while still producing the same remote structure. Thus, in pull mode,
|
294
|
+
Constancy must necessarily choose one particular rendering format, and will not
|
295
|
+
be able to retain the exact structure of the local file if you alternate push
|
296
|
+
and pull operations.
|
297
|
+
|
298
|
+
Specifically, the following caveats are important to note, when pulling a target
|
299
|
+
to a local file:
|
300
|
+
|
301
|
+
* The local file will be written out as YAML, even if it was originally
|
302
|
+
provided locally as a JSON file, and even if the extension is `.json`.
|
303
|
+
|
304
|
+
* Any existing comments in the local file will be lost.
|
305
|
+
|
306
|
+
* The document structure will be that of a flat hash will fully-specified
|
307
|
+
relative paths as the keys.
|
249
308
|
|
250
|
-
|
251
|
-
|
309
|
+
Future versions of Constancy may provide options to modify the behavior for pull
|
310
|
+
operations on a per-target basis. Pull requests are always welcome.
|
252
311
|
|
253
312
|
|
254
313
|
### Dynamic configuration
|
@@ -291,6 +350,7 @@ Constancy is relatively new software. There's more to be done. Some ideas, which
|
|
291
350
|
may or may not ever be implemented:
|
292
351
|
|
293
352
|
* Using CAS to verify the key has not changed in the interim before updating/deleting
|
353
|
+
* Options for file target pull-mode rendering
|
294
354
|
* Automation support for running non-interactively
|
295
355
|
* Pattern- and prefix-based exclusions
|
296
356
|
* Logging of changes to files, syslog, other services
|
data/lib/constancy/cli.rb
CHANGED
@@ -6,6 +6,7 @@ require 'constancy/cli/check_command'
|
|
6
6
|
require 'constancy/cli/push_command'
|
7
7
|
require 'constancy/cli/pull_command'
|
8
8
|
require 'constancy/cli/config_command'
|
9
|
+
require 'constancy/cli/targets_command'
|
9
10
|
|
10
11
|
class Constancy
|
11
12
|
class CLI
|
@@ -56,6 +57,7 @@ Commands:
|
|
56
57
|
push Push changes from filesystem to Consul
|
57
58
|
pull Pull changes from Consul to filesystem
|
58
59
|
config Print a summary of the active configuration
|
60
|
+
targets List target names
|
59
61
|
|
60
62
|
General options:
|
61
63
|
--help Print help for the given command
|
@@ -125,6 +127,7 @@ USAGE
|
|
125
127
|
when 'push' then Constancy::CLI::PushCommand.run
|
126
128
|
when 'pull' then Constancy::CLI::PullCommand.run
|
127
129
|
when 'config' then Constancy::CLI::ConfigCommand.run
|
130
|
+
when 'targets' then Constancy::CLI::TargetsCommand.run
|
128
131
|
when nil then self.print_usage
|
129
132
|
|
130
133
|
else
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This software is public domain. No rights are reserved. See LICENSE for more information.
|
2
|
+
|
3
|
+
class Constancy
|
4
|
+
class CLI
|
5
|
+
class TargetsCommand
|
6
|
+
class << self
|
7
|
+
def run
|
8
|
+
Constancy::CLI.configure(call_external_apis: false)
|
9
|
+
|
10
|
+
Constancy.config.sync_targets.each do |target|
|
11
|
+
if target.name
|
12
|
+
puts target.name
|
13
|
+
else
|
14
|
+
puts "[unnamed target] #{target.datacenter}:#{target.prefix}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -98,7 +98,7 @@ class Constancy
|
|
98
98
|
|
99
99
|
when :file
|
100
100
|
if File.exist?(self.base_path)
|
101
|
-
@local_items = YAML.load_file(self.base_path)
|
101
|
+
@local_items = flatten_hash(nil, YAML.load_file(self.base_path))
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
@@ -122,5 +122,26 @@ class Constancy
|
|
122
122
|
def diff(mode)
|
123
123
|
Constancy::Diff.new(target: self, local: self.local_items, remote: self.remote_items, mode: mode)
|
124
124
|
end
|
125
|
+
|
126
|
+
private def flatten_hash(prefix, hash)
|
127
|
+
new_hash = {}
|
128
|
+
|
129
|
+
hash.each do |k, v|
|
130
|
+
if k == '_' && !prefix.nil?
|
131
|
+
new_key = prefix
|
132
|
+
else
|
133
|
+
new_key = [prefix, k].compact.join('/')
|
134
|
+
end
|
135
|
+
|
136
|
+
case v
|
137
|
+
when Hash
|
138
|
+
new_hash.merge!(flatten_hash(new_key, v))
|
139
|
+
else
|
140
|
+
new_hash[new_key] = v.to_s
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
new_hash
|
145
|
+
end
|
125
146
|
end
|
126
147
|
end
|
data/lib/constancy/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: constancy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Adams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: imperium
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/constancy/cli/config_command.rb
|
84
84
|
- lib/constancy/cli/pull_command.rb
|
85
85
|
- lib/constancy/cli/push_command.rb
|
86
|
+
- lib/constancy/cli/targets_command.rb
|
86
87
|
- lib/constancy/config.rb
|
87
88
|
- lib/constancy/diff.rb
|
88
89
|
- lib/constancy/sync_target.rb
|