cloud_compose 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 911ce0a7cef992d7d2f3444a8af8b4a048607b7bc7ab1654f4f393ae0f99601b
4
- data.tar.gz: a140ca4dab194b1baa95af251caf6932451626f385e9461728818b962c6b45de
3
+ metadata.gz: ac283bb55bcf40add93a3946568a01957ee43960a19fd5be45bb9c68a0d73191
4
+ data.tar.gz: 1c34ac3b7fb9170826d1f8c4a948885def05de9608a35b317d618e1ac9bd04ff
5
5
  SHA512:
6
- metadata.gz: 9b28093b6baf4811a934554a76bed2bb8733628ea7e8f3f5b58d77173a5fb1cc561435b3466195cbe851d12a548c2b22ce8c8745756ad805fa185a179b75116c
7
- data.tar.gz: 99f7e122d7b1729c406abb88ec26c7fcf7358a202c0ac6ad2ae925b64d6213bdb2a965e3e264ed847b7c3839c3dc5ce5c9d0b05ea434b9f13ac3bf379d60703a
6
+ metadata.gz: 1a1ae8b4a4e5ef9b76c108b9c9d3325ed8e8a125018060b18f466a79b659a60d4d9cea20b037cc52d04e87b0636e94f586fba6e515a880781e1fcc6bea093a35
7
+ data.tar.gz: 591cb3e9ba60076644ef7dd61f6b23c7111f3eb7e3685cdecd0feeaff623503362da05515d5940531fc23189b9a7caec119bd1baab0034a4b4774d6572b60a14
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Compose multiple cloud formation templates into one file.
4
4
 
5
- `cloud-compose ./template.yml ./output`
5
+ `cloud-compose build ./template.yml ./output`
6
6
 
7
7
  ```yaml
8
8
  # template.yml
@@ -15,6 +15,22 @@ $cloud_compose:
15
15
  path: ./sub_readme.yml
16
16
  - name: SubTemplateTwo
17
17
  path: ./sub_readme.yml
18
+ - name: DevUserOne
19
+ path: !Builtin iam_console_user.yml
20
+ parameters:
21
+ username: dev-user-one
22
+ ---
23
+
24
+ Resources:
25
+ $(GlobalName)MainResource:
26
+ Type: AWS::Fake::Thing
27
+ Properties:
28
+ Name: My Main Resource
29
+ SecondaryResource:
30
+ Type: AWS::Fake::Thing
31
+ Properties:
32
+ ParentThing: !Ref $(GlobalName)MainResource
33
+
18
34
  ---
19
35
 
20
36
  Resources:
@@ -66,9 +82,42 @@ Resources:
66
82
  Type: AWS::Fake::Thing
67
83
  Properties:
68
84
  ParentThing: !Ref TestTemplateMainResource
85
+ DevUserOneUserAccount:
86
+ Type: AWS::IAM::User
87
+ Properties:
88
+ UserName: dev-user-one
89
+ ManagedPolicyArns: !Ref DevUserOneManagedPolicyArnsParameter
90
+ LoginProfile:
91
+ Password: !FindInMap
92
+ - DevUserOneUserAccount
93
+ - Password
94
+ - Value
95
+ PasswordResetRequired: true
96
+ Parameters:
97
+ DevUserOneManagedPolicyArnsParameter:
98
+ Type: CommaDelimitedList
99
+ Description: List of Managed Profile Arns.
100
+ Default: arn:aws:iam::aws:policy/ReadOnlyAccess
101
+ Mappings:
102
+ DevUserOneUserAccount:
103
+ Password:
104
+ Value: 124aa4d58a48b77b8b4397be
69
105
  Outputs:
70
106
  SubTemplateOneResourceOutput:
71
107
  Value: !Ref SubTemplateOneResource
72
108
  SubTemplateTwoResourceOutput:
73
109
  Value: !Ref SubTemplateTwoResource
110
+ DevUserOneUserAccountName:
111
+ Value: !Ref DevUserOneUserAccount
112
+ DevUserOneUserAccountArn:
113
+ Value: !GetAtt
114
+ - DevUserOneUserAccount
115
+ - Arn
116
+ DevUserOneUserAccountTemporaryPassword:
117
+ Value: !FindInMap
118
+ - DevUserOneUserAccount
119
+ - Password
120
+ - Value
121
+
122
+
74
123
  ```
data/exe/cloud-compose CHANGED
@@ -1,17 +1,30 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'cloud_compose'
4
+ require 'cloud_compose/cli'
4
5
 
5
- command = ARGV.shift
6
+ COMMANDS = {
7
+ 'build' => CloudCompose::Cli::Build,
8
+ 'version' => ->(_) { STDOUT.puts CloudCompose::VERSION },
9
+ 'help' => ->(_) { STDERR.puts HELP_MESSAGE },
10
+ 'print' => CloudCompose::Cli::Print
11
+ }.freeze
6
12
 
7
- case command
8
- when 'build'
9
- input_file_path = File.expand_path(ARGV.shift)
10
- output_file_path = File.expand_path(ARGV.shift || './') + '/' + File.basename(input_file_path)
13
+ HELP_MESSAGE = <<~EOF.freeze
14
+ CloudCompose #{CloudCompose::VERSION} Help
11
15
 
12
- template = CloudCompose::Template.new(input_file_path, File.expand_path('.'))
13
- File.open(output_file_path, 'w') { |f| f.write(template.to_s) }
14
- else
15
- STDERR.puts "Unknown Command #{command}"
16
+ Commands
17
+ #{COMMANDS.keys.map { |k| " - #{k}" }.join("\n")}
18
+ EOF
19
+
20
+ command_name = ARGV.shift
21
+
22
+ command_name = 'help' if command_name.nil? || command_name.empty?
23
+
24
+ begin
25
+ command = COMMANDS.fetch(command_name)
26
+ command.call(ARGV)
27
+ rescue StandardError => error
28
+ STDERR.puts "Error: #{error}"
16
29
  exit(1)
17
30
  end
@@ -0,0 +1,31 @@
1
+ ---
2
+ $cloud_compose:
3
+ partial: true
4
+ require:
5
+ - username
6
+ ---
7
+ Parameters:
8
+ $(name)ManagedPolicyArnsParameter:
9
+ Type: CommaDelimitedList
10
+ Description: List of Managed Profile Arns.
11
+ Default: arn:aws:iam::aws:policy/ReadOnlyAccess
12
+ Mappings:
13
+ $(name)UserAccount:
14
+ Password:
15
+ Value: !Random [ hex, 12 ]
16
+ Resources:
17
+ $(name)UserAccount:
18
+ Type: AWS::IAM::User
19
+ Properties:
20
+ UserName: $(username)
21
+ ManagedPolicyArns: !Ref $(name)ManagedPolicyArnsParameter
22
+ LoginProfile:
23
+ Password: !FindInMap [ $(name)UserAccount, Password, Value ]
24
+ PasswordResetRequired: true
25
+ Outputs:
26
+ $(name)UserAccountName:
27
+ Value: !Ref $(name)UserAccount
28
+ $(name)UserAccountArn:
29
+ Value: !GetAtt [ $(name)UserAccount, Arn ]
30
+ $(name)UserAccountTemporaryPassword:
31
+ Value: !FindInMap [ $(name)UserAccount, Password, Value ]
@@ -0,0 +1,2 @@
1
+ require_relative 'cli/build'
2
+ require_relative 'cli/print'
@@ -0,0 +1,33 @@
1
+ require 'pry'
2
+
3
+ module CloudCompose
4
+ module Cli
5
+ class Build
6
+ class << self
7
+ def call(args)
8
+ input_file = args.shift
9
+
10
+ if input_file.nil?
11
+ raise ArgumentError, 'Missing input path `cloud-compose build <input-path>`'
12
+ end
13
+
14
+ template_path = File.expand_path(input_file)
15
+ template = CloudCompose::Template.new(template_path, File.expand_path('.'))
16
+ content = template.to_s
17
+
18
+ file_name = File.basename(template_path)
19
+ file_name.slice!(File.extname(file_name))
20
+ file_name += '-build.yml'
21
+ output_path = File.dirname(template_path)
22
+ output_path += "/#{file_name}"
23
+
24
+ File.open(output_path, 'w') do |f|
25
+ f.write(content)
26
+ end
27
+
28
+ STDERR.puts "Built: #{output_path}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../template'
2
+
3
+ module CloudCompose
4
+ module Cli
5
+ class Print
6
+ class << self
7
+ def call(args)
8
+ input_file = args.shift
9
+
10
+ if input_file.nil?
11
+ raise ArgumentError, 'Missing input path `cloud-compose print <input-path>`'
12
+ end
13
+
14
+ template_path = File.expand_path(input_file)
15
+ template = CloudCompose::Template.new(template_path, File.expand_path('.'))
16
+ STDOUT.puts(template.to_s)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -35,7 +35,7 @@ module CloudCompose
35
35
  private
36
36
 
37
37
  def import_path(obj)
38
- File.expand_path(obj.fetch('path'), @root)
38
+ File.expand_path(obj.fetch('path').to_s, @root)
39
39
  end
40
40
  end
41
41
  end
@@ -2,14 +2,17 @@ require 'psych'
2
2
 
3
3
  require_relative 'tags/simple_type'
4
4
 
5
+ require_relative 'tags/builtin'
5
6
  require_relative 'tags/get_att'
6
7
  require_relative 'tags/sub'
8
+ require_relative 'tags/random'
7
9
 
8
10
  module CloudCompose
9
11
  class Parser
10
12
  CUSTOM_TAGS = {
11
13
  '!And' => CloudCompose::Tags::And,
12
14
  '!Base64' => CloudCompose::Tags::Base64,
15
+ '!Builtin' => CloudCompose::Tags::Builtin,
13
16
  '!Cidr' => CloudCompose::Tags::Cidr,
14
17
  '!Condition' => CloudCompose::Tags::Condition,
15
18
  '!Equals' => CloudCompose::Tags::Equals,
@@ -21,6 +24,7 @@ module CloudCompose
21
24
  '!Join' => CloudCompose::Tags::Join,
22
25
  '!Not' => CloudCompose::Tags::Not,
23
26
  '!Or' => CloudCompose::Tags::Or,
27
+ '!Random' => CloudCompose::Tags::Random,
24
28
  '!Ref' => CloudCompose::Tags::Ref,
25
29
  '!Select' => CloudCompose::Tags::Select,
26
30
  '!Split' => CloudCompose::Tags::Split,
@@ -0,0 +1,32 @@
1
+ require_relative 'base'
2
+
3
+ module CloudCompose
4
+ module Tags
5
+ class Builtin < Base
6
+ def type_from_coder(_coder)
7
+ :scalar
8
+ end
9
+
10
+ def value_from_coder(coder)
11
+ case coder.type
12
+ when :scalar
13
+ path = File.expand_path('../builtin', File.dirname(__FILE__))
14
+ path += File::SEPARATOR
15
+ path += coder.scalar
16
+ path
17
+ else
18
+ raise InvalidTypeError.new(coder.tag, coder.type)
19
+ end
20
+ end
21
+
22
+ def encode_with(coder)
23
+ coder.tag = nil
24
+ coder.scalar = value
25
+ end
26
+
27
+ def to_s
28
+ value
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ require 'securerandom'
2
+
3
+ require_relative 'base'
4
+
5
+ module CloudCompose
6
+ module Tags
7
+ class Random < Base
8
+ def type_from_coder(_coder)
9
+ :scalar
10
+ end
11
+
12
+ def value_from_coder(coder)
13
+ case coder.type
14
+ when :seq
15
+ @random_type = coder.seq[0]
16
+ @random_count = coder.seq[1].to_i
17
+ []
18
+ else
19
+ raise InvalidTypeError.new(coder.tag, coder.type)
20
+ end
21
+ end
22
+
23
+ def encode_with(coder)
24
+ coder.tag = nil
25
+ case @random_type
26
+ when 'hex'
27
+ coder.scalar = SecureRandom.hex(@random_count)
28
+ else
29
+ raise ArgumentError, "Invalid Random Type #{@random_type}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -36,7 +36,7 @@ module CloudCompose
36
36
  @checksum = Digest::SHA256.hexdigest(content)
37
37
  parts = content.split(/^---/, 3)
38
38
  @config = CloudCompose::Config.new(parts[1], @root)
39
- @content = parts[2]
39
+ @content = parts[2] || ''
40
40
  end
41
41
 
42
42
  def to_h
@@ -133,9 +133,7 @@ module CloudCompose
133
133
  end
134
134
 
135
135
  def create_hash(context)
136
- CloudCompose::Parser.load_yaml(
137
- CloudCompose::Processor.preprocess(content, context)
138
- )
136
+ CloudCompose::Parser.load_yaml(CloudCompose::Processor.preprocess(content, context)) || {}
139
137
  end
140
138
 
141
139
  def preload_imports!
@@ -1,3 +1,3 @@
1
1
  module CloudCompose
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloud_compose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maddie Schipper
@@ -106,12 +106,18 @@ files:
106
106
  - Rakefile
107
107
  - exe/cloud-compose
108
108
  - lib/cloud_compose.rb
109
+ - lib/cloud_compose/builtin/iam_console_user.yml
110
+ - lib/cloud_compose/cli.rb
111
+ - lib/cloud_compose/cli/build.rb
112
+ - lib/cloud_compose/cli/print.rb
109
113
  - lib/cloud_compose/config.rb
110
114
  - lib/cloud_compose/parser.rb
111
115
  - lib/cloud_compose/processor.rb
112
116
  - lib/cloud_compose/tags/base.rb
117
+ - lib/cloud_compose/tags/builtin.rb
113
118
  - lib/cloud_compose/tags/get_att.rb
114
119
  - lib/cloud_compose/tags/map_type.rb
120
+ - lib/cloud_compose/tags/random.rb
115
121
  - lib/cloud_compose/tags/scalar_type.rb
116
122
  - lib/cloud_compose/tags/sequenced_type.rb
117
123
  - lib/cloud_compose/tags/simple_type.rb