wombat-cli 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
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'