wombat-cli 0.6.1 → 0.6.2

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.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +23 -23
  3. data/.travis.yml +22 -27
  4. data/CHANGELOG.md +438 -423
  5. data/DESIGN.md +49 -49
  6. data/Gemfile +5 -5
  7. data/README.md +146 -146
  8. data/Rakefile +26 -26
  9. data/bin/wombat +24 -24
  10. data/generator_files/Vagrantfile +120 -120
  11. data/generator_files/cookbooks/automate/.gitignore +16 -16
  12. data/generator_files/cookbooks/automate/.kitchen.ec2.yml +34 -34
  13. data/generator_files/cookbooks/automate/.kitchen.yml +24 -24
  14. data/generator_files/cookbooks/automate/Berksfile +6 -6
  15. data/generator_files/cookbooks/automate/README.md +4 -4
  16. data/generator_files/cookbooks/automate/chefignore +102 -102
  17. data/generator_files/cookbooks/automate/libraries/_helper.rb +52 -52
  18. data/generator_files/cookbooks/automate/libraries/delivery_api.rb +204 -204
  19. data/generator_files/cookbooks/automate/libraries/delivery_project.rb +31 -31
  20. data/generator_files/cookbooks/automate/libraries/dsl.rb +4 -4
  21. data/generator_files/cookbooks/automate/metadata.rb +11 -11
  22. data/generator_files/cookbooks/automate/recipes/default.rb +118 -124
  23. data/generator_files/cookbooks/automate/recipes/update-users.rb +48 -48
  24. data/generator_files/cookbooks/automate/templates/delivery.erb +6 -6
  25. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  26. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  27. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  28. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  29. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  30. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  31. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  32. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  33. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/metadata.rb +3 -3
  34. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/recipes/default.rb +27 -27
  35. data/generator_files/cookbooks/automate/test/integration/default/automate_spec.rb +56 -56
  36. data/generator_files/cookbooks/build_node/.gitignore +16 -16
  37. data/generator_files/cookbooks/build_node/.kitchen.ec2.yml +37 -37
  38. data/generator_files/cookbooks/build_node/.kitchen.yml +23 -23
  39. data/generator_files/cookbooks/build_node/Berksfile +8 -8
  40. data/generator_files/cookbooks/build_node/README.md +4 -4
  41. data/generator_files/cookbooks/build_node/chefignore +102 -102
  42. data/generator_files/cookbooks/build_node/metadata.rb +12 -12
  43. data/generator_files/cookbooks/build_node/recipes/default.rb +38 -38
  44. data/generator_files/cookbooks/build_node/templates/client.erb +2 -2
  45. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  46. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  47. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  48. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  49. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  50. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  51. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  52. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  53. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/metadata.rb +2 -2
  54. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/recipes/default.rb +18 -18
  55. data/generator_files/cookbooks/build_node/test/integration/default/build-node_spec.rb +40 -40
  56. data/generator_files/cookbooks/chef_server/.gitignore +16 -16
  57. data/generator_files/cookbooks/chef_server/.kitchen.ec2.yml +34 -34
  58. data/generator_files/cookbooks/chef_server/.kitchen.yml +24 -24
  59. data/generator_files/cookbooks/chef_server/Berksfile +6 -6
  60. data/generator_files/cookbooks/chef_server/README.md +4 -4
  61. data/generator_files/cookbooks/chef_server/chefignore +102 -102
  62. data/generator_files/cookbooks/chef_server/metadata.rb +11 -11
  63. data/generator_files/cookbooks/chef_server/recipes/bootstrap_users.rb +91 -91
  64. data/generator_files/cookbooks/chef_server/recipes/default.rb +113 -113
  65. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  66. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  67. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  68. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  69. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  70. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  71. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  72. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  73. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/metadata.rb +2 -2
  74. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/recipes/default.rb +23 -23
  75. data/generator_files/cookbooks/chef_server/test/integration/default/chef_server_spec.rb +50 -50
  76. data/generator_files/cookbooks/compliance/.gitignore +16 -16
  77. data/generator_files/cookbooks/compliance/.kitchen.ec2.yml +34 -34
  78. data/generator_files/cookbooks/compliance/.kitchen.yml +24 -24
  79. data/generator_files/cookbooks/compliance/Berksfile +7 -7
  80. data/generator_files/cookbooks/compliance/README.md +4 -4
  81. data/generator_files/cookbooks/compliance/chefignore +102 -102
  82. data/generator_files/cookbooks/compliance/metadata.rb +11 -11
  83. data/generator_files/cookbooks/compliance/recipes/default.rb +57 -57
  84. data/generator_files/cookbooks/compliance/spec/spec_helper.rb +2 -2
  85. data/generator_files/cookbooks/compliance/spec/unit/recipes/default_spec.rb +20 -20
  86. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  87. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  88. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  89. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  90. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  91. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  92. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  93. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  94. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/metadata.rb +4 -4
  95. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/recipes/default.rb +21 -21
  96. data/generator_files/cookbooks/compliance/test/integration/default/compliance.rb +28 -28
  97. data/generator_files/cookbooks/infranodes/.gitignore +16 -16
  98. data/generator_files/cookbooks/infranodes/.kitchen.ec2.yml +48 -48
  99. data/generator_files/cookbooks/infranodes/.kitchen.yml +21 -21
  100. data/generator_files/cookbooks/infranodes/Berksfile +6 -6
  101. data/generator_files/cookbooks/infranodes/README.md +4 -4
  102. data/generator_files/cookbooks/infranodes/attributes/default.rb +2 -2
  103. data/generator_files/cookbooks/infranodes/chefignore +102 -102
  104. data/generator_files/cookbooks/infranodes/metadata.rb +13 -13
  105. data/generator_files/cookbooks/infranodes/recipes/default.rb +57 -57
  106. data/generator_files/cookbooks/infranodes/spec/spec_helper.rb +2 -2
  107. data/generator_files/cookbooks/infranodes/spec/unit/recipes/default_spec.rb +20 -20
  108. data/generator_files/cookbooks/infranodes/templates/default/client.rb.erb +5 -5
  109. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  110. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  111. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  112. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  113. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  114. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  115. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  116. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  117. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/metadata.rb +3 -3
  118. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/recipes/default.rb +27 -27
  119. data/generator_files/cookbooks/infranodes/test/integration/default/infranodes_spec.rb +22 -22
  120. data/generator_files/cookbooks/infranodes/test/integration/helpers/serverspec/spec_helper.rb +8 -8
  121. data/generator_files/cookbooks/wombat/.gitignore +16 -16
  122. data/generator_files/cookbooks/wombat/.kitchen.yml +43 -43
  123. data/generator_files/cookbooks/wombat/Berksfile +5 -5
  124. data/generator_files/cookbooks/wombat/README.md +4 -4
  125. data/generator_files/cookbooks/wombat/attributes/default.rb +79 -80
  126. data/generator_files/cookbooks/wombat/attributes/packer.rb +18 -18
  127. data/generator_files/cookbooks/wombat/chefignore +102 -102
  128. data/generator_files/cookbooks/wombat/metadata.rb +13 -13
  129. data/generator_files/cookbooks/wombat/recipes/authorized-keys.rb +20 -20
  130. data/generator_files/cookbooks/wombat/recipes/default.rb +111 -111
  131. data/generator_files/cookbooks/wombat/recipes/etc-hosts.rb +51 -51
  132. data/generator_files/cookbooks/workstation/.gitignore +16 -16
  133. data/generator_files/cookbooks/workstation/.kitchen.azure.yml +45 -0
  134. data/generator_files/cookbooks/workstation/.kitchen.ec2.yml +46 -30
  135. data/generator_files/cookbooks/workstation/.kitchen.yml +42 -22
  136. data/generator_files/cookbooks/workstation/Berksfile +7 -7
  137. data/generator_files/cookbooks/workstation/README.md +3 -3
  138. data/generator_files/cookbooks/workstation/chefignore +106 -102
  139. data/generator_files/cookbooks/workstation/files/atom.apm.list +10 -7
  140. data/generator_files/cookbooks/workstation/files/atom.config.cson +6 -3
  141. data/generator_files/cookbooks/workstation/{templates/default/ise_profile.ps1.erb → files/ise_profile.ps1} +11 -11
  142. data/generator_files/cookbooks/workstation/libraries/home.rb +4 -4
  143. data/generator_files/cookbooks/workstation/metadata.rb +14 -14
  144. data/generator_files/cookbooks/workstation/recipes/browser.rb +53 -58
  145. data/generator_files/cookbooks/workstation/recipes/certs-keys.rb +41 -45
  146. data/generator_files/cookbooks/workstation/recipes/chef.rb +29 -28
  147. data/generator_files/cookbooks/workstation/recipes/default.rb +24 -21
  148. data/generator_files/cookbooks/workstation/recipes/dotnet.rb +19 -17
  149. data/generator_files/cookbooks/workstation/recipes/editor.rb +46 -18
  150. data/generator_files/cookbooks/workstation/recipes/profile.rb +14 -41
  151. data/generator_files/cookbooks/workstation/recipes/terminal.rb +11 -11
  152. data/generator_files/cookbooks/workstation/templates/default/bookmarks.html.erb +23 -23
  153. data/generator_files/cookbooks/workstation/templates/default/data_collector.rb.erb +2 -2
  154. data/generator_files/cookbooks/workstation/templates/default/knife.rb.erb +10 -10
  155. data/generator_files/cookbooks/workstation/templates/default/master_preferences.json.erb +28 -28
  156. data/generator_files/cookbooks/workstation/templates/default/ssh_config.erb +16 -16
  157. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  158. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  159. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/chef.crt +26 -26
  160. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  161. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  162. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  163. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  164. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  165. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/metadata.rb +2 -2
  166. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/recipes/default.rb +21 -21
  167. data/generator_files/cookbooks/workstation/test/integration/default/workstation_spec.rb +77 -37
  168. data/generator_files/packer/automate.json +136 -136
  169. data/generator_files/packer/build-node.json +142 -142
  170. data/generator_files/packer/chef-server.json +137 -137
  171. data/generator_files/packer/compliance.json +133 -133
  172. data/generator_files/packer/infranodes-windows.json +143 -143
  173. data/generator_files/packer/infranodes.json +134 -134
  174. data/generator_files/packer/scripts/PreSysprep.ps1 +9 -0
  175. data/generator_files/packer/workstation.json +160 -142
  176. data/generator_files/templates/arm.md.json.erb +754 -754
  177. data/generator_files/templates/arm.vhd.json.erb +630 -630
  178. data/generator_files/templates/bootstrap-aws.erb +39 -39
  179. data/generator_files/templates/cfn.json.erb +675 -674
  180. data/generator_files/wombat.yml +75 -74
  181. data/lib/wombat/aws.rb +67 -67
  182. data/lib/wombat/build.rb +392 -392
  183. data/lib/wombat/cli.rb +254 -254
  184. data/lib/wombat/common.rb +420 -420
  185. data/lib/wombat/crypto.rb +65 -65
  186. data/lib/wombat/delete.rb +67 -67
  187. data/lib/wombat/deploy.rb +128 -128
  188. data/lib/wombat/init.rb +32 -32
  189. data/lib/wombat/latest.rb +27 -27
  190. data/lib/wombat/output.rb +101 -101
  191. data/lib/wombat/update.rb +20 -20
  192. data/lib/wombat/version.rb +3 -3
  193. data/lib/wombat.rb +8 -8
  194. data/spec/functional/common_spec.rb +26 -26
  195. data/spec/spec_helper.rb +103 -103
  196. data/spec/unit/common_spec.rb +116 -116
  197. data/terraform/README.md +13 -13
  198. data/terraform/templates/terraform.tfvars.erb +12 -12
  199. data/terraform/wombat.tf +328 -328
  200. data/wombat-cli.gemspec +36 -36
  201. metadata +6 -4
@@ -1,52 +1,52 @@
1
- #
2
- # Cookbook Name:: automate
3
- # Recipe:: _helper
4
- #
5
- # Author:: Salim Afiune (<afiune@chef.io>)
6
- #
7
- # Copyright 2015, Chef Software, Inc.
8
- #
9
- # All rights reserved - Do Not Redistribute
10
- #
11
-
12
- module Delivery
13
-
14
- module Helper
15
- # Delivery API helper
16
- #
17
- # This little helper will let us just type:
18
- # e.g.
19
- # delivery_api.get(...)
20
- # delivery_api.put(...)
21
- # delivery_api.post(...)
22
- # delivery_api.delete(...)
23
- #
24
- def delivery_api
25
- @api ||= begin
26
- Delivery::API.new(delivery_fqdn, 'admin', delivery_admin_password, delivery_enterprise)
27
- end
28
- end
29
-
30
- # Get delivery enterprise
31
-
32
- def delivery_fqdn
33
- "#{node['demo']['domain_prefix']}automate.#{node['demo']['domain']}"
34
- end
35
-
36
- def delivery_organization
37
- node['demo']['org']
38
- end
39
-
40
- def delivery_enterprise
41
- node['demo']['enterprise']
42
- end
43
-
44
- def delivery_admin_password
45
- node['demo']['users']['admin']['password']
46
- end
47
-
48
- def return_key(key)
49
- key =~ /\// ? File.read(key) : key
50
- end
51
- end
52
- end
1
+ #
2
+ # Cookbook Name:: automate
3
+ # Recipe:: _helper
4
+ #
5
+ # Author:: Salim Afiune (<afiune@chef.io>)
6
+ #
7
+ # Copyright 2015, Chef Software, Inc.
8
+ #
9
+ # All rights reserved - Do Not Redistribute
10
+ #
11
+
12
+ module Delivery
13
+
14
+ module Helper
15
+ # Delivery API helper
16
+ #
17
+ # This little helper will let us just type:
18
+ # e.g.
19
+ # delivery_api.get(...)
20
+ # delivery_api.put(...)
21
+ # delivery_api.post(...)
22
+ # delivery_api.delete(...)
23
+ #
24
+ def delivery_api
25
+ @api ||= begin
26
+ Delivery::API.new(delivery_fqdn, 'admin', delivery_admin_password, delivery_enterprise)
27
+ end
28
+ end
29
+
30
+ # Get delivery enterprise
31
+
32
+ def delivery_fqdn
33
+ "#{node['demo']['domain_prefix']}automate.#{node['demo']['domain']}"
34
+ end
35
+
36
+ def delivery_organization
37
+ node['demo']['org']
38
+ end
39
+
40
+ def delivery_enterprise
41
+ node['demo']['enterprise']
42
+ end
43
+
44
+ def delivery_admin_password
45
+ node['demo']['users']['admin']['password']
46
+ end
47
+
48
+ def return_key(key)
49
+ key =~ /\// ? File.read(key) : key
50
+ end
51
+ end
52
+ end
@@ -1,204 +1,204 @@
1
- #
2
- # Cookbook Name:: automate
3
- # Libraries:: delivery_api
4
- #
5
- # Author:: Salim Afiune (<afiune@chef.io>)
6
- #
7
- # Copyright 2015, Chef Software, Inc.
8
- #
9
- # All rights reserved - Do Not Redistribute
10
- #
11
- require 'net/http'
12
- require 'json'
13
- require 'logger'
14
-
15
- module Delivery
16
-
17
- # Delivery API
18
- #
19
- # @author Salim Afiune <afiune@chef.io>
20
- #
21
- class API
22
-
23
- attr_accessor :logger
24
- attr_accessor :hostname
25
- attr_accessor :token
26
- attr_accessor :username
27
- attr_accessor :password
28
- attr_accessor :enterprise
29
- attr_accessor :organization
30
-
31
- # @example Instance a Delivery API
32
- # => Delivery::API.new('delivery-server', 'my_user', 'my_password', 'my_enterprise')
33
- #
34
- # @example [block usage for multiple requests] Create multiple projects
35
- # => Delivery::API.new('delivery-server', 'my_user', 'my_password', 'marvel') do |api|
36
- # %W{
37
- # thor
38
- # hulk
39
- # ironman
40
- # hawkeye
41
- # BlackWidow
42
- # CaptainAmerica
43
- # }.each do |project|
44
- # api.post('/e/marvel/orgs/avengers/projects',
45
- # {
46
- # "name": project
47
- # }
48
- # )
49
- # end
50
- # end
51
- #
52
- # @yield [self] if a block is given then the constructed object yields
53
- def initialize (hostname, username, password, enterprise = nil, organization = nil)
54
- @hostname = hostname
55
- @username = username
56
- @password = password
57
- @enterprise = enterprise
58
- @organization = organization
59
- token
60
- if block_given?
61
- yield self
62
- end
63
- end
64
-
65
- def delivery_url
66
- "https://#{@hostname}/api/v0"
67
- end
68
-
69
- def headers
70
- {
71
- "chef-delivery-token" => token,
72
- "chef-delivery-user" => @username
73
- }
74
- end
75
-
76
- def logger
77
- @logger ||= Logger.new(STDOUT)
78
- end
79
-
80
- def get_delivery_endpoint(endpoint)
81
- if endpoint.start_with?('/e')
82
- URI("#{delivery_url}#{endpoint}")
83
- else
84
- URI("#{delivery_url}/e/#{enterprise}#{endpoint}")
85
- end
86
- end
87
-
88
- def enterprise=(enterprise)
89
- @enterprise = enterprise
90
- @token = nil
91
- end
92
-
93
- def http(uri)
94
- http = Net::HTTP.new(uri.host, uri.port)
95
- http.use_ssl = true
96
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
97
- http
98
- end
99
-
100
- def token
101
- @token ||= begin
102
- resp = post("/e/#{@enterprise}/get-token", {'username'=> @username, 'password'=> @password})
103
- resp['token']
104
- end
105
- end
106
-
107
- # POST Method
108
- # Perform a POST to a Delivery Endpoint
109
- #
110
- # @example Create an organization. [Using Data::String]
111
- # => post(
112
- # '/e/marvel/orgs',
113
- # '{ "name": "Stark Industries" }'
114
- # )
115
- #
116
- # @example Create a pipeline. [Using Data::Hash]
117
- # => post(
118
- # '/e/marvel/orgs/Stark Industries/projects/hulkbuster/pipelines',
119
- # {
120
- # "name" => "v2",
121
- # "base" => "master"
122
- # }
123
- # )
124
- #
125
- # @param endpoint [String] The Delivery Endpoint
126
- # @param data [String][Hash] The Body of the request
127
- # @return [Hash]
128
- def post(endpoint, data)
129
- uri = get_delivery_endpoint(endpoint)
130
- request = Net::HTTP::Post.new(uri.request_uri)
131
- request.content_type = "application/json"
132
- request.body = data.class.eql?(Hash) ? JSON.unparse(data) : data
133
- headers.keys.each do |key|
134
- request[key] = headers[key]
135
- end unless endpoint =~ /get-token/
136
- response = http(uri).request(request)
137
- response_error(response)
138
- JSON.parse(response.body) if response.body
139
- end
140
-
141
- # GET Method
142
- # Perform a GET to a Delivery Endpoint
143
- #
144
- # @example List all users.
145
- # => get('/e/marvel/users')
146
- #
147
- # @example List Organizations.
148
- # => get('/e/marvel/orgs')
149
- #
150
- # @param endpoint [String] The Delivery Endpoint
151
- # @return [Hash]
152
- def get(endpoint)
153
- uri = get_delivery_endpoint(endpoint)
154
- response = http(uri).get(uri.path, headers)
155
- response_error(response)
156
- JSON.parse(response.body) if response.body
157
- end
158
-
159
- # PUT Method
160
- # Perform a PUT to a Delivery Endpoint
161
- #
162
- # @param endpoint [String] The Delivery Endpoint
163
- # @param data [String][Hash] The Body of the request
164
- # @return [Hash]
165
- def put(endpoint, data)
166
- uri = get_delivery_endpoint(endpoint)
167
- request = Net::HTTP::Put.new(uri.request_uri)
168
- request.content_type = "application/json"
169
- request.body = data.class.eql?(Hash) ? JSON.unparse(data) : data
170
- headers.keys.each do |key|
171
- request[key] = headers[key]
172
- end
173
- response = http(uri).request(request)
174
- response_error(response)
175
- JSON.parse(response.body) if response.body
176
- end
177
-
178
- # DELETE Method
179
- # Perform a DELETE to a Delivery Endpoint
180
- #
181
- # @param endpoint [String] The Delivery Endpoint
182
- # @return [Hash]
183
- def delete(endpoint)
184
- uri = get_delivery_endpoint(endpoint)
185
- response = http(uri).delete(uri.path, headers)
186
- response_error(response)
187
- JSON.parse(response.body) if response.body
188
- end
189
-
190
- def response_error(response)
191
- if '200' <= response.code && response.code <= '301'
192
- logger.debug(response.body) if Chef::Log.level == :debug
193
- else
194
- case response.code
195
- when '409', '404'
196
- logger.debug(response.body) if Chef::Log.level == :debug
197
- else
198
- logger.error(response.body)
199
- response.error!
200
- end
201
- end
202
- end
203
- end
204
- end
1
+ #
2
+ # Cookbook Name:: automate
3
+ # Libraries:: delivery_api
4
+ #
5
+ # Author:: Salim Afiune (<afiune@chef.io>)
6
+ #
7
+ # Copyright 2015, Chef Software, Inc.
8
+ #
9
+ # All rights reserved - Do Not Redistribute
10
+ #
11
+ require 'net/http'
12
+ require 'json'
13
+ require 'logger'
14
+
15
+ module Delivery
16
+
17
+ # Delivery API
18
+ #
19
+ # @author Salim Afiune <afiune@chef.io>
20
+ #
21
+ class API
22
+
23
+ attr_accessor :logger
24
+ attr_accessor :hostname
25
+ attr_accessor :token
26
+ attr_accessor :username
27
+ attr_accessor :password
28
+ attr_accessor :enterprise
29
+ attr_accessor :organization
30
+
31
+ # @example Instance a Delivery API
32
+ # => Delivery::API.new('delivery-server', 'my_user', 'my_password', 'my_enterprise')
33
+ #
34
+ # @example [block usage for multiple requests] Create multiple projects
35
+ # => Delivery::API.new('delivery-server', 'my_user', 'my_password', 'marvel') do |api|
36
+ # %W{
37
+ # thor
38
+ # hulk
39
+ # ironman
40
+ # hawkeye
41
+ # BlackWidow
42
+ # CaptainAmerica
43
+ # }.each do |project|
44
+ # api.post('/e/marvel/orgs/avengers/projects',
45
+ # {
46
+ # "name": project
47
+ # }
48
+ # )
49
+ # end
50
+ # end
51
+ #
52
+ # @yield [self] if a block is given then the constructed object yields
53
+ def initialize (hostname, username, password, enterprise = nil, organization = nil)
54
+ @hostname = hostname
55
+ @username = username
56
+ @password = password
57
+ @enterprise = enterprise
58
+ @organization = organization
59
+ token
60
+ if block_given?
61
+ yield self
62
+ end
63
+ end
64
+
65
+ def delivery_url
66
+ "https://#{@hostname}/api/v0"
67
+ end
68
+
69
+ def headers
70
+ {
71
+ "chef-delivery-token" => token,
72
+ "chef-delivery-user" => @username
73
+ }
74
+ end
75
+
76
+ def logger
77
+ @logger ||= Logger.new(STDOUT)
78
+ end
79
+
80
+ def get_delivery_endpoint(endpoint)
81
+ if endpoint.start_with?('/e')
82
+ URI("#{delivery_url}#{endpoint}")
83
+ else
84
+ URI("#{delivery_url}/e/#{enterprise}#{endpoint}")
85
+ end
86
+ end
87
+
88
+ def enterprise=(enterprise)
89
+ @enterprise = enterprise
90
+ @token = nil
91
+ end
92
+
93
+ def http(uri)
94
+ http = Net::HTTP.new(uri.host, uri.port)
95
+ http.use_ssl = true
96
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
97
+ http
98
+ end
99
+
100
+ def token
101
+ @token ||= begin
102
+ resp = post("/e/#{@enterprise}/get-token", {'username'=> @username, 'password'=> @password})
103
+ resp['token']
104
+ end
105
+ end
106
+
107
+ # POST Method
108
+ # Perform a POST to a Delivery Endpoint
109
+ #
110
+ # @example Create an organization. [Using Data::String]
111
+ # => post(
112
+ # '/e/marvel/orgs',
113
+ # '{ "name": "Stark Industries" }'
114
+ # )
115
+ #
116
+ # @example Create a pipeline. [Using Data::Hash]
117
+ # => post(
118
+ # '/e/marvel/orgs/Stark Industries/projects/hulkbuster/pipelines',
119
+ # {
120
+ # "name" => "v2",
121
+ # "base" => "master"
122
+ # }
123
+ # )
124
+ #
125
+ # @param endpoint [String] The Delivery Endpoint
126
+ # @param data [String][Hash] The Body of the request
127
+ # @return [Hash]
128
+ def post(endpoint, data)
129
+ uri = get_delivery_endpoint(endpoint)
130
+ request = Net::HTTP::Post.new(uri.request_uri)
131
+ request.content_type = "application/json"
132
+ request.body = data.class.eql?(Hash) ? JSON.unparse(data) : data
133
+ headers.keys.each do |key|
134
+ request[key] = headers[key]
135
+ end unless endpoint =~ /get-token/
136
+ response = http(uri).request(request)
137
+ response_error(response)
138
+ JSON.parse(response.body) if response.body
139
+ end
140
+
141
+ # GET Method
142
+ # Perform a GET to a Delivery Endpoint
143
+ #
144
+ # @example List all users.
145
+ # => get('/e/marvel/users')
146
+ #
147
+ # @example List Organizations.
148
+ # => get('/e/marvel/orgs')
149
+ #
150
+ # @param endpoint [String] The Delivery Endpoint
151
+ # @return [Hash]
152
+ def get(endpoint)
153
+ uri = get_delivery_endpoint(endpoint)
154
+ response = http(uri).get(uri.path, headers)
155
+ response_error(response)
156
+ JSON.parse(response.body) if response.body
157
+ end
158
+
159
+ # PUT Method
160
+ # Perform a PUT to a Delivery Endpoint
161
+ #
162
+ # @param endpoint [String] The Delivery Endpoint
163
+ # @param data [String][Hash] The Body of the request
164
+ # @return [Hash]
165
+ def put(endpoint, data)
166
+ uri = get_delivery_endpoint(endpoint)
167
+ request = Net::HTTP::Put.new(uri.request_uri)
168
+ request.content_type = "application/json"
169
+ request.body = data.class.eql?(Hash) ? JSON.unparse(data) : data
170
+ headers.keys.each do |key|
171
+ request[key] = headers[key]
172
+ end
173
+ response = http(uri).request(request)
174
+ response_error(response)
175
+ JSON.parse(response.body) if response.body
176
+ end
177
+
178
+ # DELETE Method
179
+ # Perform a DELETE to a Delivery Endpoint
180
+ #
181
+ # @param endpoint [String] The Delivery Endpoint
182
+ # @return [Hash]
183
+ def delete(endpoint)
184
+ uri = get_delivery_endpoint(endpoint)
185
+ response = http(uri).delete(uri.path, headers)
186
+ response_error(response)
187
+ JSON.parse(response.body) if response.body
188
+ end
189
+
190
+ def response_error(response)
191
+ if '200' <= response.code && response.code <= '301'
192
+ logger.debug(response.body) if Chef::Log.level == :debug
193
+ else
194
+ case response.code
195
+ when '409', '404'
196
+ logger.debug(response.body) if Chef::Log.level == :debug
197
+ else
198
+ logger.error(response.body)
199
+ response.error!
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -1,31 +1,31 @@
1
- #
2
- # Cookbook Name:: automate
3
- # Libraries:: delivery_project
4
- #
5
- # Author:: Salim Afiune (<afiune@chef.io>)
6
- #
7
- # Copyright 2015, Chef Software, Inc.
8
- #
9
- # All rights reserved - Do Not Redistribute
10
- #
11
-
12
- module Delivery
13
-
14
- # Delivery Project
15
- #
16
- # @author Salim Afiune <afiune@chef.io>
17
- #
18
- class DeliveryProject
19
-
20
- attr_accessor :project
21
- attr_accessor :organization
22
- attr_accessor :enterprise
23
-
24
- def initialize (project, organization, enterprise)
25
- @project = project
26
- @organization = organization
27
- @enterprise = enterprise
28
- end
29
-
30
- end
31
- end
1
+ #
2
+ # Cookbook Name:: automate
3
+ # Libraries:: delivery_project
4
+ #
5
+ # Author:: Salim Afiune (<afiune@chef.io>)
6
+ #
7
+ # Copyright 2015, Chef Software, Inc.
8
+ #
9
+ # All rights reserved - Do Not Redistribute
10
+ #
11
+
12
+ module Delivery
13
+
14
+ # Delivery Project
15
+ #
16
+ # @author Salim Afiune <afiune@chef.io>
17
+ #
18
+ class DeliveryProject
19
+
20
+ attr_accessor :project
21
+ attr_accessor :organization
22
+ attr_accessor :enterprise
23
+
24
+ def initialize (project, organization, enterprise)
25
+ @project = project
26
+ @organization = organization
27
+ @enterprise = enterprise
28
+ end
29
+
30
+ end
31
+ end
@@ -1,5 +1,5 @@
1
-
2
-
3
- # Mixin DeliveryDemo::Helper to Recipes & Resources
4
- ::Chef::Recipe.send(:include, Delivery::Helper)
1
+
2
+
3
+ # Mixin DeliveryDemo::Helper to Recipes & Resources
4
+ ::Chef::Recipe.send(:include, Delivery::Helper)
5
5
  ::Chef::Resource.send(:include, Delivery::Helper)
@@ -1,11 +1,11 @@
1
- name 'automate'
2
- maintainer 'The Authors'
3
- maintainer_email 'you@example.com'
4
- license 'all_rights'
5
- description 'Installs/Configures automate'
6
- long_description 'Installs/Configures automate'
7
- version '0.2.2'
8
-
9
- depends 'chef-ingredient'
10
- depends 'line'
11
- depends 'wombat'
1
+ name 'automate'
2
+ maintainer 'The Authors'
3
+ maintainer_email 'you@example.com'
4
+ license 'all_rights'
5
+ description 'Installs/Configures automate'
6
+ long_description 'Installs/Configures automate'
7
+ version '0.2.2'
8
+
9
+ depends 'chef-ingredient'
10
+ depends 'line'
11
+ depends 'wombat'