al-infrastructure-configuration-storage 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/al-infrastructure-configuration-storage.rb +3 -0
- data/lib/infrastructure.rb +17 -0
- data/lib/infrastructure/configuration.rb +33 -0
- data/lib/infrastructure/formatters.rb +25 -0
- data/lib/infrastructure/formatters/base.rb +14 -0
- data/lib/infrastructure/formatters/bash_source.rb +19 -0
- data/lib/infrastructure/formatters/json.rb +17 -0
- data/lib/infrastructure/formatters/yaml.rb +17 -0
- data/lib/infrastructure/loaders.rb +22 -0
- data/lib/infrastructure/loaders/base.rb +20 -0
- data/lib/infrastructure/loaders/local.rb +36 -0
- data/lib/infrastructure/loaders/s3.rb +58 -0
- data/lib/infrastructure/settings.rb +48 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 336af31c8929ceb376f9b97e8696dd1029fc604b55195c5cfed393dac8f335c1
|
4
|
+
data.tar.gz: b702b62934327ca41328e02a72d3d34c60e5808df7967843c7753b3db2611bd5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e33538b2bc8a6b50c0c501b832be9ba5b5d62412208cce3d4382796ee49f71b1e1cf98a38a112092c7b5a02459d9970e655d8c1628589ef5ed57b63ac8dc69b0
|
7
|
+
data.tar.gz: ef677443e441517ccc039f7534079e88f62a88a7923cba097cdaa6fbac6bbe992da38727030a069ac3ea0d5f4c49f60c3bbacf124541bbc2a1e869265b33b86d
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/settings"
|
4
|
+
require "infrastructure/configuration"
|
5
|
+
|
6
|
+
# ::nodoc::
|
7
|
+
module Infrastructure
|
8
|
+
class << self
|
9
|
+
def configure
|
10
|
+
yield config
|
11
|
+
end
|
12
|
+
|
13
|
+
def config
|
14
|
+
@config ||= Configuration.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Infrastructure
|
4
|
+
# infrastructure settings configuration
|
5
|
+
class Configuration
|
6
|
+
class << self
|
7
|
+
def properties
|
8
|
+
@properties ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def property(name, env_var_name = nil)
|
12
|
+
attr_accessor name
|
13
|
+
properties << [name, (env_var_name || name.to_s.upcase)]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
property :aws_access_key_id
|
18
|
+
property :aws_secret_access_key
|
19
|
+
property :aws_region
|
20
|
+
property :storage, "INFRASTRUCTURE_SETTINGS_STORAGE"
|
21
|
+
property :location, "INFRASTRUCTURE_SETTINGS_LOCATION"
|
22
|
+
|
23
|
+
def initialize(attr = {})
|
24
|
+
self.class.properties.map do |property, env_var_name|
|
25
|
+
send("#{property}=", attr[property] || ENV[env_var_name])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def properties
|
30
|
+
self.class.properties.each_with_object({}) { |p, memo| memo[p] = send(p) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/formatters/bash_source"
|
4
|
+
require "infrastructure/formatters/json"
|
5
|
+
require "infrastructure/formatters/yaml"
|
6
|
+
|
7
|
+
module Infrastructure
|
8
|
+
# ::nodoc::
|
9
|
+
module Formatters
|
10
|
+
class << self
|
11
|
+
def build(format)
|
12
|
+
case format.to_sym
|
13
|
+
when :bash
|
14
|
+
BashSource.new
|
15
|
+
when :json
|
16
|
+
JSON.new
|
17
|
+
when :yaml
|
18
|
+
YAML.new
|
19
|
+
else
|
20
|
+
raise ArgumentError "Unknown format #{format}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/formatters/base"
|
4
|
+
|
5
|
+
module Infrastructure
|
6
|
+
module Formatters
|
7
|
+
# transform hashes to bash source format
|
8
|
+
class BashSource < Base
|
9
|
+
# @param [Hash] hash
|
10
|
+
# @return [String]
|
11
|
+
def format(hash)
|
12
|
+
hash.map do |key, value|
|
13
|
+
val = value.gsub(/[']/, "'" => "\\'")
|
14
|
+
"export #{key}='#{val}'\n"
|
15
|
+
end.join
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/formatters/base"
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
module Infrastructure
|
7
|
+
module Formatters
|
8
|
+
# transform hashes to YAML
|
9
|
+
class JSON < Base
|
10
|
+
# @param [Hash] hash
|
11
|
+
# @return [String]
|
12
|
+
def format(hash)
|
13
|
+
::JSON.pretty_generate(hash)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/formatters/base"
|
4
|
+
require "yaml"
|
5
|
+
|
6
|
+
module Infrastructure
|
7
|
+
module Formatters
|
8
|
+
# transform hashes to YAML
|
9
|
+
class YAML < Base
|
10
|
+
# @param [Hash] hash
|
11
|
+
# @return [String]
|
12
|
+
def format(hash)
|
13
|
+
"---\n#{hash.map { |k, v| "#{k}: '#{v.gsub(/['\n]/, "'" => "''", "\n" => '\\n')}'" }.join("\n")}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/loaders/local"
|
4
|
+
require "infrastructure/loaders/s3"
|
5
|
+
|
6
|
+
module Infrastructure
|
7
|
+
# ::nodoc::
|
8
|
+
module Loaders
|
9
|
+
class << self
|
10
|
+
def build(config)
|
11
|
+
case config.storage.to_s.downcase.to_sym
|
12
|
+
when :s3
|
13
|
+
S3.new(config)
|
14
|
+
when :local
|
15
|
+
Local.new(config)
|
16
|
+
else
|
17
|
+
raise ArgumentError, "Unknown storage type #{config.storage}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Infrastructure
|
4
|
+
module Loaders
|
5
|
+
# base loader class
|
6
|
+
class Base
|
7
|
+
def initialize(config = Infrastructure.config)
|
8
|
+
@config = config
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
attr_reader :config
|
14
|
+
|
15
|
+
def mkdir_unless_exists(dir)
|
16
|
+
FileUtils.mkpath(dir) unless File.directory?(dir)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/loaders/base"
|
4
|
+
require "fileutils"
|
5
|
+
|
6
|
+
module Infrastructure
|
7
|
+
module Loaders
|
8
|
+
# store and retrieve data in file system
|
9
|
+
class Local < Base
|
10
|
+
# @param [String] to directory to save file to
|
11
|
+
# @param [String] name file name
|
12
|
+
# @param [String] content file content
|
13
|
+
def push(to:, name:, content:)
|
14
|
+
path = File.dirname(File.join(to, name))
|
15
|
+
mkdir_unless_exists(path)
|
16
|
+
File.open(File.join(to, name), "w+") do |f|
|
17
|
+
f.write(content)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param [String] from source directory
|
22
|
+
# @param [String] name settings name
|
23
|
+
# @param [String] to destination directory
|
24
|
+
def pull(from:, name:, to:)
|
25
|
+
mkdir_unless_exists(to)
|
26
|
+
FileUtils.cp(Dir[File.join(from, "#{name}/#{name}.*")], to)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param [String] from directory
|
30
|
+
# @param [String] name settings name
|
31
|
+
def delete(from:, name:)
|
32
|
+
FileUtils.rm(Dir[File.join(from, "#{name}/#{name}.*")])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/loaders/base"
|
4
|
+
require "aws-sdk-s3"
|
5
|
+
|
6
|
+
module Infrastructure
|
7
|
+
module Loaders
|
8
|
+
# store and retrieve data on S3 bucket
|
9
|
+
class S3 < Base
|
10
|
+
# @param [String] to bucket name
|
11
|
+
# @param [String] name object key
|
12
|
+
# @param [String] content
|
13
|
+
def push(to:, name:, content:)
|
14
|
+
bucket = s3_bucket(to)
|
15
|
+
bucket.put_object(key: name, body: content)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param [String] from bucket name
|
19
|
+
# @param [String] name settings name
|
20
|
+
# @param [String] to destination directory
|
21
|
+
def pull(from:, name:, to:)
|
22
|
+
bucket = s3_bucket(from)
|
23
|
+
mkdir_unless_exists(to)
|
24
|
+
bucket.objects(prefix: "#{name}/#{name}.").each do |obj|
|
25
|
+
File.open(File.join(to, obj.key.split("/").last), "w+") do |f|
|
26
|
+
f.write(read_object_content(obj))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param [String] from bucket name
|
32
|
+
# @param [String] name settings name
|
33
|
+
def delete(from:, name:)
|
34
|
+
bucket = s3_bucket(from)
|
35
|
+
object_keys = bucket.objects(prefix: "#{name}/#{name}.").map { |obj| { key: obj.key } }
|
36
|
+
bucket.delete_objects(delete: { objects: object_keys })
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def read_object_content(obj)
|
42
|
+
obj.get.body.read
|
43
|
+
end
|
44
|
+
|
45
|
+
def s3_bucket(name)
|
46
|
+
s3 = s3_resource
|
47
|
+
s3.bucket(name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def s3_resource
|
51
|
+
Aws::S3::Resource.new(
|
52
|
+
region: config.aws_region,
|
53
|
+
credentials: Aws::Credentials.new(config.aws_access_key_id, config.aws_secret_access_key)
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "infrastructure/loaders"
|
4
|
+
require "infrastructure/formatters"
|
5
|
+
|
6
|
+
module Infrastructure
|
7
|
+
# upload and download settings
|
8
|
+
class Settings
|
9
|
+
class << self
|
10
|
+
def push(*attr)
|
11
|
+
new.push(*attr)
|
12
|
+
end
|
13
|
+
|
14
|
+
def pull(*attr)
|
15
|
+
new.pull(*attr)
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete(*attr)
|
19
|
+
new.delete(*attr)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(config: Infrastructure.config, formatters: Infrastructure::Formatters)
|
24
|
+
@config = config
|
25
|
+
@loader = Loaders.build(config)
|
26
|
+
@formatters = formatters
|
27
|
+
end
|
28
|
+
|
29
|
+
def push(name:, settings:, formats: %i[bash])
|
30
|
+
formats.each do |format|
|
31
|
+
content = formatters.build(format).format(settings)
|
32
|
+
loader.push(to: config.location, name: "#{name}/#{name}.#{format}", content: content)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def pull(name:, dir:)
|
37
|
+
loader.pull(from: config.location, to: dir, name: name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete(name:)
|
41
|
+
loader.delete(from: config.location, name: name)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
attr_reader :config, :loader, :formatters
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: al-infrastructure-configuration-storage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dmitry Pochapsky
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk-s3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.23'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.23'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fakefs
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.18'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.18'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.8'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.8'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.60'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.60'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.4'
|
83
|
+
description:
|
84
|
+
email: info@agiliumlabs.com
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- lib/al-infrastructure-configuration-storage.rb
|
90
|
+
- lib/infrastructure.rb
|
91
|
+
- lib/infrastructure/configuration.rb
|
92
|
+
- lib/infrastructure/formatters.rb
|
93
|
+
- lib/infrastructure/formatters/base.rb
|
94
|
+
- lib/infrastructure/formatters/bash_source.rb
|
95
|
+
- lib/infrastructure/formatters/json.rb
|
96
|
+
- lib/infrastructure/formatters/yaml.rb
|
97
|
+
- lib/infrastructure/loaders.rb
|
98
|
+
- lib/infrastructure/loaders/base.rb
|
99
|
+
- lib/infrastructure/loaders/local.rb
|
100
|
+
- lib/infrastructure/loaders/s3.rb
|
101
|
+
- lib/infrastructure/settings.rb
|
102
|
+
homepage: https://agiliumlabs.com
|
103
|
+
licenses: []
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 2.7.7
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: Save and load infrastructure configuration
|
125
|
+
test_files: []
|