octopus-serverspec-extensions 0.18.1 → 0.19.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -14
  3. data/.rspec +2 -2
  4. data/.travis.yml +5 -5
  5. data/Gemfile +4 -4
  6. data/LICENSE.txt +12 -12
  7. data/README.md +39 -39
  8. data/Rakefile +6 -6
  9. data/bin/console +14 -14
  10. data/bin/setup +8 -8
  11. data/docs/authentication.md +45 -45
  12. data/docs/octopus_deploy_account.md +37 -37
  13. data/docs/octopus_deploy_doc_template.md +16 -16
  14. data/docs/octopus_deploy_environment.md +32 -32
  15. data/docs/octopus_deploy_project_group.md +30 -30
  16. data/docs/octopus_deploy_smtp_config.md +39 -39
  17. data/docs/octopus_deploy_space.md +32 -32
  18. data/docs/octopus_deploy_team.md +25 -25
  19. data/docs/octopus_deploy_tentacle.md +40 -40
  20. data/docs/octopus_deploy_upgrade_config.md +33 -33
  21. data/docs/octopus_deploy_user.md +33 -33
  22. data/docs/octopus_deploy_worker.md +38 -38
  23. data/docs/octopus_deploy_worker_pool.md +25 -25
  24. data/lib/octopus_serverspec_extensions.rb +85 -85
  25. data/lib/octopus_serverspec_extensions/matcher/allow_dynamic_infrastructure.rb +12 -12
  26. data/lib/octopus_serverspec_extensions/matcher/have_linux_line_endings.rb +13 -13
  27. data/lib/octopus_serverspec_extensions/matcher/have_version.rb +36 -36
  28. data/lib/octopus_serverspec_extensions/matcher/have_windows_line_endings.rb +13 -13
  29. data/lib/octopus_serverspec_extensions/matcher/run_under_account.rb +17 -17
  30. data/lib/octopus_serverspec_extensions/matcher/use_guided_failure.rb +12 -12
  31. data/lib/octopus_serverspec_extensions/type/chocolatey_package.rb +33 -33
  32. data/lib/octopus_serverspec_extensions/type/java_property_file.rb +28 -28
  33. data/lib/octopus_serverspec_extensions/type/npm_package.rb +36 -36
  34. data/lib/octopus_serverspec_extensions/type/octopus_deploy_account.rb +176 -176
  35. data/lib/octopus_serverspec_extensions/type/octopus_deploy_environment.rb +117 -117
  36. data/lib/octopus_serverspec_extensions/type/octopus_deploy_project_group.rb +127 -127
  37. data/lib/octopus_serverspec_extensions/type/octopus_deploy_smtp_config.rb +109 -109
  38. data/lib/octopus_serverspec_extensions/type/octopus_deploy_space.rb +92 -92
  39. data/lib/octopus_serverspec_extensions/type/octopus_deploy_team.rb +81 -81
  40. data/lib/octopus_serverspec_extensions/type/octopus_deploy_tentacle.rb +208 -208
  41. data/lib/octopus_serverspec_extensions/type/octopus_deploy_upgrade_config.rb +112 -112
  42. data/lib/octopus_serverspec_extensions/type/octopus_deploy_user.rb +110 -110
  43. data/lib/octopus_serverspec_extensions/type/octopus_deploy_worker.rb +173 -173
  44. data/lib/octopus_serverspec_extensions/type/octopus_deploy_worker_pool.rb +88 -88
  45. data/lib/octopus_serverspec_extensions/type/windows_dsc.rb +37 -37
  46. data/lib/octopus_serverspec_extensions/type/windows_firewall.rb +32 -32
  47. data/lib/octopus_serverspec_extensions/type/windows_scheduled_task.rb +33 -33
  48. data/lib/octopus_serverspec_extensions/version.rb +3 -3
  49. data/octopus-serverspec-extensions.gemspec +34 -34
  50. metadata +15 -16
@@ -1,208 +1,208 @@
1
- require 'serverspec'
2
- require 'serverspec/type/base'
3
- require 'net/http'
4
- require 'json'
5
-
6
- module Serverspec::Type
7
- class OctopusDeployTentacle < Base
8
- @machine = nil
9
- @serverUrl = nil
10
- @apiKey = nil
11
- @serverSupportsSpaces = nil
12
- @spaceId = nil
13
- @spaceFragment = ""
14
-
15
- def initialize(serverUrl, apiKey, instance, spaceId = 'Spaces-1')
16
- @name = "Octopus Deploy Tentacle #{instance}"
17
- @runner = Specinfra::Runner
18
- @serverUrl = serverUrl
19
- @apiKey = apiKey
20
- @spaceId = spaceId
21
-
22
- if (serverUrl.nil?)
23
- raise "'serverUrl' was not provided. Unable to connect to Octopus server to validate configuration."
24
- end
25
- if (apiKey.nil?)
26
- raise "'apiKey' was not provided. Unable to connect to Octopus server to validate configuration."
27
- end
28
-
29
- if (exists?)
30
- thumbprint = `"c:\\program files\\Octopus Deploy\\Tentacle\\Tentacle.exe" show-thumbprint --console --nologo --instance #{instance}`
31
- thumbprint = thumbprint.gsub('==== ShowThumbprintCommand starting ====', '').strip
32
- thumbprint = thumbprint.gsub('The thumbprint of this Tentacle is: ', '').strip
33
- thumbprint = thumbprint.gsub('==== ShowThumbprintCommand completed ====', '').strip
34
- thumbprint = thumbprint.gsub('==== ShowThumbprintCommand ====', '').strip
35
-
36
- @serverSupportsSpaces = check_supports_spaces(serverUrl)
37
-
38
- if (@serverSupportsSpaces)
39
- @spaceFragment = "#{@spaceId}/"
40
- end
41
-
42
- @machine = get_machine_via_api(serverUrl, apiKey, thumbprint)
43
- else
44
- puts "tentacle.exe does not exist"
45
- end
46
- end
47
-
48
- def registered_with_the_server?
49
- !@machine.nil?
50
- end
51
-
52
- def online?
53
- return nil if @machine.nil?
54
- @machine = poll_until_machine_has_completed_healthcheck(@serverUrl, @apiKey, @machine["Thumbprint"])
55
- status = @machine['Status']
56
- if ("#{status}" == "")
57
- status = @machine['HealthStatus'] if "#{status}" == ""
58
- puts "Expected status 'Healthy|HasWarnings' for Tentacle #{@name}, but got '#{status}'" if (status != "Healthy" && status != "HasWarnings")
59
- status == "Healthy" || status == "HasWarnings"
60
- else
61
- puts "Expected status 'Online|CalamariNeedsUpgrade|NeedsUpgrade' for Tentacle #{@name}, but got '#{status}'" if (status != "Online" && status != "CalamariNeedsUpgrade" && status != "NeedsUpgrade")
62
- status == "Online" || status == "CalamariNeedsUpgrade" || status == "NeedsUpgrade"
63
- end
64
- end
65
-
66
- def in_environment?(environment_name)
67
- return false if @machine.nil?
68
- url = "#{@serverUrl}/api/#{@spaceFragment}environments/all?api-key=#{@apiKey}"
69
- resp = Net::HTTP.get_response(URI.parse(url))
70
- environments = JSON.parse(resp.body)
71
- environment_id = environments.select {|e| e["Name"] == environment_name}.first["Id"]
72
- !@machine["EnvironmentIds"].select {|e| e == environment_id}.empty?
73
- end
74
-
75
- def in_space?(space_name)
76
- return false if @machine.nil?
77
- return false if @serverSupportsSpaces
78
- url = "#{@serverUrl}/api/spaces/all?api-key=#{@apiKey}"
79
- resp = Net::HTTP.get_response(URI.parse(url))
80
- spaces = JSON.parse(resp.body)
81
- space_id = spaces.select {|e| e["Name"] == space_name}.first["Id"]
82
- @machine["SpaceId"] == space_id
83
- end
84
-
85
- def has_tenant?(tenant_name)
86
- return false if @machine.nil?
87
- url = "#{@serverUrl}/api/#{@spaceFragment}tenants/all?api-key=#{@apiKey}"
88
- resp = Net::HTTP.get_response(URI.parse(url))
89
- tenants = JSON.parse(resp.body)
90
- tenant_id = tenants.select {|e| e["Name"] == tenant_name}.first["Id"]
91
- !@machine["TenantIds"].select {|e| e == tenant_id}.empty?
92
- end
93
-
94
- def has_tenant_tag?(tag_set, tag)
95
- return false if @machine.nil?
96
- tenant_tags = @machine["TenantTags"]
97
- !tenant_tags.select {|e| e == "#{tag_set}/#{tag}"}.empty?
98
- end
99
-
100
- def has_policy?(policy_name)
101
- return false if @machine.nil?
102
- url = "#{@serverUrl}/api/#{@spaceFragment}machinepolicies/all?api-key=#{@apiKey}"
103
- resp = Net::HTTP.get_response(URI.parse(url))
104
- policies = JSON.parse(resp.body)
105
- policy_id = policies.select {|e| e["Name"] == policy_name}.first["Id"]
106
- @machine["MachinePolicyId"] == policy_id
107
- end
108
-
109
- def has_role?(role_name)
110
- return false if @machine.nil?
111
- roles = @machine["Roles"]
112
- !roles.select {|e| e == role_name}.empty?
113
- end
114
-
115
- def has_display_name?(name)
116
- return false if @machine.nil?
117
- @machine["Name"] == name
118
- end
119
-
120
- def has_endpoint?(uri)
121
- return false if @machine.nil?
122
- return false if @machine["Uri"].nil? # polling tentacles have null endpoint. catch that.
123
- puts "Expected uri '#{uri}' for Tentacle #{@name}, but got '#{@machine["Uri"]}'" unless (@machine["Uri"].casecmp(uri) == 0)
124
- @machine["Uri"].casecmp(uri) == 0
125
- end
126
-
127
- def has_tenanted_deployment_participation?(mode)
128
- return false if @machine.nil?
129
- @machine["TenantedDeploymentParticipation"] == mode
130
- end
131
-
132
- def listening_tentacle?
133
- return false if @machine.nil?
134
- puts "Expected CommunicationStyle 'TentaclePassive' for Tentacle #{@name}, but got '#{@machine["Endpoint"]["CommunicationStyle"]}'" if (@machine["Endpoint"]["CommunicationStyle"] != "TentaclePassive")
135
- @machine["Endpoint"]["CommunicationStyle"] == "TentaclePassive"
136
- end
137
-
138
- def polling_tentacle?
139
- return false if @machine.nil?
140
- puts "Expected CommunicationStyle 'TentacleActive' for Tentacle #{@name}, but got '#{@machine["Endpoint"]["CommunicationStyle"]}'" if (@machine["Endpoint"]["CommunicationStyle"] != "TentacleActive")
141
- @machine["Endpoint"]["CommunicationStyle"] == "TentacleActive"
142
- end
143
-
144
- def exists?
145
- ::File.exists?("c:\\program files\\Octopus Deploy\\Tentacle\\Tentacle.exe")
146
- end
147
- end
148
-
149
- def octopus_deploy_tentacle(serverUrl, apiKey, instance)
150
- OctopusDeployTentacle.new(serverUrl, apiKey, instance)
151
- end
152
-
153
- private
154
-
155
- def check_supports_spaces(serverUrl)
156
- begin
157
- resp = Net::HTTP.get_response(URI.parse("#{serverUrl}/api/"))
158
- body = JSON.parse(resp.body)
159
- version = body['Version']
160
- return Gem::Version.new(version) > Gem::Version.new('2019.0.0')
161
- rescue => e
162
- puts "Unable to connect to #{serverUrl}: #{e}"
163
- end
164
-
165
- return false
166
- end
167
-
168
- def poll_until_machine_has_completed_healthcheck(serverUrl, apiKey, thumbprint)
169
- machine = nil
170
- url = "#{serverUrl}/api/#{@spaceFragment}machines/all?api-key=#{apiKey}"
171
-
172
- now = Time.now
173
- counter = 1
174
- loop do
175
- machine = get_machine_via_api(serverUrl, apiKey, thumbprint)
176
-
177
- break if machine.nil?
178
- break if counter > 10
179
- break if !machine_healthcheck_outstanding(machine)
180
- puts "Machine health check for #{machine["Name"]} has not yet completed. Waiting 5 seconds to try again."
181
- counter += 1
182
- sleep 5
183
- end
184
-
185
- machine
186
- end
187
-
188
- def machine_healthcheck_outstanding(machine)
189
- machine["StatusSummary"] == "This machine was recently added. Please perform a health check."
190
- end
191
-
192
- def get_machine_via_api(serverUrl, apiKey, thumbprint)
193
- machine = nil
194
- url = "#{serverUrl}/api/#{@spaceFragment}machines/all?api-key=#{apiKey}"
195
-
196
- begin
197
- resp = Net::HTTP.get_response(URI.parse(url))
198
- body = JSON.parse(resp.body)
199
- machine = body.select {|e| e["Thumbprint"] == thumbprint}.first unless body.nil?
200
- rescue => e
201
- puts "Unable to connect to #{url}: #{e}"
202
- end
203
-
204
- machine
205
- end
206
- end
207
-
208
- include Serverspec::Type
1
+ require 'serverspec'
2
+ require 'serverspec/type/base'
3
+ require 'net/http'
4
+ require 'json'
5
+
6
+ module Serverspec::Type
7
+ class OctopusDeployTentacle < Base
8
+ @machine = nil
9
+ @serverUrl = nil
10
+ @apiKey = nil
11
+ @serverSupportsSpaces = nil
12
+ @spaceId = nil
13
+ @spaceFragment = ""
14
+
15
+ def initialize(serverUrl, apiKey, instance, spaceId = 'Spaces-1')
16
+ @name = "Octopus Deploy Tentacle #{instance}"
17
+ @runner = Specinfra::Runner
18
+ @serverUrl = serverUrl
19
+ @apiKey = apiKey
20
+ @spaceId = spaceId
21
+
22
+ if (serverUrl.nil?)
23
+ raise "'serverUrl' was not provided. Unable to connect to Octopus server to validate configuration."
24
+ end
25
+ if (apiKey.nil?)
26
+ raise "'apiKey' was not provided. Unable to connect to Octopus server to validate configuration."
27
+ end
28
+
29
+ if (exists?)
30
+ thumbprint = `"c:\\program files\\Octopus Deploy\\Tentacle\\Tentacle.exe" show-thumbprint --console --nologo --instance #{instance}`
31
+ thumbprint = thumbprint.gsub('==== ShowThumbprintCommand starting ====', '').strip
32
+ thumbprint = thumbprint.gsub('The thumbprint of this Tentacle is: ', '').strip
33
+ thumbprint = thumbprint.gsub('==== ShowThumbprintCommand completed ====', '').strip
34
+ thumbprint = thumbprint.gsub('==== ShowThumbprintCommand ====', '').strip
35
+
36
+ @serverSupportsSpaces = check_supports_spaces(serverUrl)
37
+
38
+ if (@serverSupportsSpaces)
39
+ @spaceFragment = "#{@spaceId}/"
40
+ end
41
+
42
+ @machine = get_machine_via_api(serverUrl, apiKey, thumbprint)
43
+ else
44
+ puts "tentacle.exe does not exist"
45
+ end
46
+ end
47
+
48
+ def registered_with_the_server?
49
+ !@machine.nil?
50
+ end
51
+
52
+ def online?
53
+ return nil if @machine.nil?
54
+ @machine = poll_until_machine_has_completed_healthcheck(@serverUrl, @apiKey, @machine["Thumbprint"])
55
+ status = @machine['Status']
56
+ if ("#{status}" == "")
57
+ status = @machine['HealthStatus'] if "#{status}" == ""
58
+ puts "Expected status 'Healthy|HasWarnings' for Tentacle #{@name}, but got '#{status}'" if (status != "Healthy" && status != "HasWarnings")
59
+ status == "Healthy" || status == "HasWarnings"
60
+ else
61
+ puts "Expected status 'Online|CalamariNeedsUpgrade|NeedsUpgrade' for Tentacle #{@name}, but got '#{status}'" if (status != "Online" && status != "CalamariNeedsUpgrade" && status != "NeedsUpgrade")
62
+ status == "Online" || status == "CalamariNeedsUpgrade" || status == "NeedsUpgrade"
63
+ end
64
+ end
65
+
66
+ def in_environment?(environment_name)
67
+ return false if @machine.nil?
68
+ url = "#{@serverUrl}/api/#{@spaceFragment}environments/all?api-key=#{@apiKey}"
69
+ resp = Net::HTTP.get_response(URI.parse(url))
70
+ environments = JSON.parse(resp.body)
71
+ environment_id = environments.select {|e| e["Name"] == environment_name}.first["Id"]
72
+ !@machine["EnvironmentIds"].select {|e| e == environment_id}.empty?
73
+ end
74
+
75
+ def in_space?(space_name)
76
+ return false if @machine.nil?
77
+ return false if @serverSupportsSpaces
78
+ url = "#{@serverUrl}/api/spaces/all?api-key=#{@apiKey}"
79
+ resp = Net::HTTP.get_response(URI.parse(url))
80
+ spaces = JSON.parse(resp.body)
81
+ space_id = spaces.select {|e| e["Name"] == space_name}.first["Id"]
82
+ @machine["SpaceId"] == space_id
83
+ end
84
+
85
+ def has_tenant?(tenant_name)
86
+ return false if @machine.nil?
87
+ url = "#{@serverUrl}/api/#{@spaceFragment}tenants/all?api-key=#{@apiKey}"
88
+ resp = Net::HTTP.get_response(URI.parse(url))
89
+ tenants = JSON.parse(resp.body)
90
+ tenant_id = tenants.select {|e| e["Name"] == tenant_name}.first["Id"]
91
+ !@machine["TenantIds"].select {|e| e == tenant_id}.empty?
92
+ end
93
+
94
+ def has_tenant_tag?(tag_set, tag)
95
+ return false if @machine.nil?
96
+ tenant_tags = @machine["TenantTags"]
97
+ !tenant_tags.select {|e| e == "#{tag_set}/#{tag}"}.empty?
98
+ end
99
+
100
+ def has_policy?(policy_name)
101
+ return false if @machine.nil?
102
+ url = "#{@serverUrl}/api/#{@spaceFragment}machinepolicies/all?api-key=#{@apiKey}"
103
+ resp = Net::HTTP.get_response(URI.parse(url))
104
+ policies = JSON.parse(resp.body)
105
+ policy_id = policies.select {|e| e["Name"] == policy_name}.first["Id"]
106
+ @machine["MachinePolicyId"] == policy_id
107
+ end
108
+
109
+ def has_role?(role_name)
110
+ return false if @machine.nil?
111
+ roles = @machine["Roles"]
112
+ !roles.select {|e| e == role_name}.empty?
113
+ end
114
+
115
+ def has_display_name?(name)
116
+ return false if @machine.nil?
117
+ @machine["Name"] == name
118
+ end
119
+
120
+ def has_endpoint?(uri)
121
+ return false if @machine.nil?
122
+ return false if @machine["Uri"].nil? # polling tentacles have null endpoint. catch that.
123
+ puts "Expected uri '#{uri}' for Tentacle #{@name}, but got '#{@machine["Uri"]}'" unless (@machine["Uri"].casecmp(uri) == 0)
124
+ @machine["Uri"].casecmp(uri) == 0
125
+ end
126
+
127
+ def has_tenanted_deployment_participation?(mode)
128
+ return false if @machine.nil?
129
+ @machine["TenantedDeploymentParticipation"] == mode
130
+ end
131
+
132
+ def listening_tentacle?
133
+ return false if @machine.nil?
134
+ puts "Expected CommunicationStyle 'TentaclePassive' for Tentacle #{@name}, but got '#{@machine["Endpoint"]["CommunicationStyle"]}'" if (@machine["Endpoint"]["CommunicationStyle"] != "TentaclePassive")
135
+ @machine["Endpoint"]["CommunicationStyle"] == "TentaclePassive"
136
+ end
137
+
138
+ def polling_tentacle?
139
+ return false if @machine.nil?
140
+ puts "Expected CommunicationStyle 'TentacleActive' for Tentacle #{@name}, but got '#{@machine["Endpoint"]["CommunicationStyle"]}'" if (@machine["Endpoint"]["CommunicationStyle"] != "TentacleActive")
141
+ @machine["Endpoint"]["CommunicationStyle"] == "TentacleActive"
142
+ end
143
+
144
+ def exists?
145
+ ::File.exists?("c:\\program files\\Octopus Deploy\\Tentacle\\Tentacle.exe")
146
+ end
147
+ end
148
+
149
+ def octopus_deploy_tentacle(serverUrl, apiKey, instance)
150
+ OctopusDeployTentacle.new(serverUrl, apiKey, instance)
151
+ end
152
+
153
+ private
154
+
155
+ def check_supports_spaces(serverUrl)
156
+ begin
157
+ resp = Net::HTTP.get_response(URI.parse("#{serverUrl}/api/"))
158
+ body = JSON.parse(resp.body)
159
+ version = body['Version']
160
+ return Gem::Version.new(version) > Gem::Version.new('2019.0.0')
161
+ rescue => e
162
+ puts "Unable to connect to #{serverUrl}: #{e}"
163
+ end
164
+
165
+ return false
166
+ end
167
+
168
+ def poll_until_machine_has_completed_healthcheck(serverUrl, apiKey, thumbprint)
169
+ machine = nil
170
+ url = "#{serverUrl}/api/#{@spaceFragment}machines/all?api-key=#{apiKey}"
171
+
172
+ now = Time.now
173
+ counter = 1
174
+ loop do
175
+ machine = get_machine_via_api(serverUrl, apiKey, thumbprint)
176
+
177
+ break if machine.nil?
178
+ break if counter > 10
179
+ break if !machine_healthcheck_outstanding(machine)
180
+ puts "Machine health check for #{machine["Name"]} has not yet completed. Waiting 5 seconds to try again."
181
+ counter += 1
182
+ sleep 5
183
+ end
184
+
185
+ machine
186
+ end
187
+
188
+ def machine_healthcheck_outstanding(machine)
189
+ machine["StatusSummary"] == "This machine was recently added. Please perform a health check."
190
+ end
191
+
192
+ def get_machine_via_api(serverUrl, apiKey, thumbprint)
193
+ machine = nil
194
+ url = "#{serverUrl}/api/#{@spaceFragment}machines/all?api-key=#{apiKey}"
195
+
196
+ begin
197
+ resp = Net::HTTP.get_response(URI.parse(url))
198
+ body = JSON.parse(resp.body)
199
+ machine = body.select {|e| e["Thumbprint"] == thumbprint}.first unless body.nil?
200
+ rescue => e
201
+ puts "Unable to connect to #{url}: #{e}"
202
+ end
203
+
204
+ machine
205
+ end
206
+ end
207
+
208
+ include Serverspec::Type
@@ -1,112 +1,112 @@
1
- require 'serverspec/type/base'
2
- require 'net/http'
3
- require 'json'
4
-
5
- module Serverspec::Type
6
- class OctopusDeployUpgradeConfig < Base
7
- @serverUrl = nil
8
- @apiKey = nil
9
- @upgradeConfig = nil
10
-
11
- @NotificationModes = ['AlwaysShow', 'ShowOnlyMajorMinor', 'NeverShow']
12
-
13
- def initialize(*url_and_api_key)
14
- serverUrl, apiKey = get_octopus_creds(url_and_api_key)
15
-
16
- @name = "Octopus Deploy Upgrade Config #{serverUrl}"
17
- @runner = Specinfra::Runner
18
- @serverUrl = serverUrl
19
- @apiKey = apiKey
20
-
21
- # is it still nil?
22
- if serverUrl.nil?
23
- raise "'serverUrl' was not provided. Unable to connect to Octopus server to validate configuration."
24
- end
25
- if apiKey.nil?
26
- raise "'apiKey' was not provided. Unable to connect to Octopus server to validate configuration."
27
- end
28
-
29
- @upgradeConfig = get_upgrade_config_via_api(serverUrl, apiKey)
30
- end
31
-
32
- def has_notification_mode?(mode)
33
- false if @upgradeConfig.nil?
34
- @upgradeConfig['NotificationMode'] == mode
35
- end
36
-
37
- def never_show_notifications?
38
- false if @upgradeConfig.nil?
39
- has_notification_mode?('NeverShow')
40
- end
41
-
42
- def always_show_notifications?
43
- false if @upgradeConfig.nil?
44
- has_notification_mode?('AlwaysShow')
45
- end
46
-
47
- def show_major_minor_notifications?
48
- false if @upgradeConfig.nil?
49
- has_notification_mode?('ShowOnlyMajorMinor')
50
- end
51
-
52
- def include_statistics?
53
- false if @upgradeConfig.nil?
54
- @upgradeConfig['IncludeStatistics'] == true
55
- end
56
-
57
- def allow_checking?
58
- false if @upgradeConfig.nil?
59
- @upgradeConfig['AllowChecking'] == true
60
- end
61
- end
62
-
63
- # module-level constructors/entrypoints
64
-
65
- def octopus_deploy_upgrade_config(*url_and_api_key)
66
- serverUrl, apiKey = get_octopus_creds(url_and_api_key)
67
- OctopusDeployUpgradeConfig.new(serverUrl, apiKey)
68
- end
69
-
70
- def octopus_upgrade_config(*url_and_api_key)
71
- serverUrl, apiKey = get_octopus_creds(url_and_api_key)
72
- octopus_deploy_upgrade_config(serverUrl, apiKey)
73
- end
74
-
75
- private
76
-
77
- def get_upgrade_config_endpoint(serverUrl)
78
- endpoint = nil
79
-
80
- url = "#{serverUrl}/api/"
81
-
82
- begin
83
- resp = Net::HTTP.get_response(URI.parse(url))
84
- body = JSON.parse(resp.body)
85
- json = body unless body.nil?
86
- endpoint = json['Links']['UpgradeConfiguration']
87
- rescue => e
88
- raise "get_upgrade_config_endpoint: Unable to connect to #{url}: #{e}"
89
- end
90
-
91
- endpoint
92
- end
93
-
94
- def get_upgrade_config_via_api(serverUrl, apiKey)
95
- smtp = nil
96
-
97
- stem = get_upgrade_config_endpoint(serverUrl)
98
- url = "#{serverUrl}#{stem}?api-key=#{apiKey}"
99
-
100
- begin
101
- resp = Net::HTTP.get_response(URI.parse(url))
102
- body = JSON.parse(resp.body)
103
- smtp = body unless body.nil?
104
- rescue => e
105
- raise "get_upgrade_config_via_api: Unable to connect to #{url}: #{e}"
106
- end
107
-
108
- smtp
109
- end
110
- end
111
-
112
- include Serverspec::Type
1
+ require 'serverspec/type/base'
2
+ require 'net/http'
3
+ require 'json'
4
+
5
+ module Serverspec::Type
6
+ class OctopusDeployUpgradeConfig < Base
7
+ @serverUrl = nil
8
+ @apiKey = nil
9
+ @upgradeConfig = nil
10
+
11
+ @NotificationModes = ['AlwaysShow', 'ShowOnlyMajorMinor', 'NeverShow']
12
+
13
+ def initialize(*url_and_api_key)
14
+ serverUrl, apiKey = get_octopus_creds(url_and_api_key)
15
+
16
+ @name = "Octopus Deploy Upgrade Config #{serverUrl}"
17
+ @runner = Specinfra::Runner
18
+ @serverUrl = serverUrl
19
+ @apiKey = apiKey
20
+
21
+ # is it still nil?
22
+ if serverUrl.nil?
23
+ raise "'serverUrl' was not provided. Unable to connect to Octopus server to validate configuration."
24
+ end
25
+ if apiKey.nil?
26
+ raise "'apiKey' was not provided. Unable to connect to Octopus server to validate configuration."
27
+ end
28
+
29
+ @upgradeConfig = get_upgrade_config_via_api(serverUrl, apiKey)
30
+ end
31
+
32
+ def has_notification_mode?(mode)
33
+ false if @upgradeConfig.nil?
34
+ @upgradeConfig['NotificationMode'] == mode
35
+ end
36
+
37
+ def never_show_notifications?
38
+ false if @upgradeConfig.nil?
39
+ has_notification_mode?('NeverShow')
40
+ end
41
+
42
+ def always_show_notifications?
43
+ false if @upgradeConfig.nil?
44
+ has_notification_mode?('AlwaysShow')
45
+ end
46
+
47
+ def show_major_minor_notifications?
48
+ false if @upgradeConfig.nil?
49
+ has_notification_mode?('ShowOnlyMajorMinor')
50
+ end
51
+
52
+ def include_statistics?
53
+ false if @upgradeConfig.nil?
54
+ @upgradeConfig['IncludeStatistics'] == true
55
+ end
56
+
57
+ def allow_checking?
58
+ false if @upgradeConfig.nil?
59
+ @upgradeConfig['AllowChecking'] == true
60
+ end
61
+ end
62
+
63
+ # module-level constructors/entrypoints
64
+
65
+ def octopus_deploy_upgrade_config(*url_and_api_key)
66
+ serverUrl, apiKey = get_octopus_creds(url_and_api_key)
67
+ OctopusDeployUpgradeConfig.new(serverUrl, apiKey)
68
+ end
69
+
70
+ def octopus_upgrade_config(*url_and_api_key)
71
+ serverUrl, apiKey = get_octopus_creds(url_and_api_key)
72
+ octopus_deploy_upgrade_config(serverUrl, apiKey)
73
+ end
74
+
75
+ private
76
+
77
+ def get_upgrade_config_endpoint(serverUrl)
78
+ endpoint = nil
79
+
80
+ url = "#{serverUrl}/api/"
81
+
82
+ begin
83
+ resp = Net::HTTP.get_response(URI.parse(url))
84
+ body = JSON.parse(resp.body)
85
+ json = body unless body.nil?
86
+ endpoint = json['Links']['UpgradeConfiguration']
87
+ rescue => e
88
+ raise "get_upgrade_config_endpoint: Unable to connect to #{url}: #{e}"
89
+ end
90
+
91
+ endpoint
92
+ end
93
+
94
+ def get_upgrade_config_via_api(serverUrl, apiKey)
95
+ smtp = nil
96
+
97
+ stem = get_upgrade_config_endpoint(serverUrl)
98
+ url = "#{serverUrl}#{stem}?api-key=#{apiKey}"
99
+
100
+ begin
101
+ resp = Net::HTTP.get_response(URI.parse(url))
102
+ body = JSON.parse(resp.body)
103
+ smtp = body unless body.nil?
104
+ rescue => e
105
+ raise "get_upgrade_config_via_api: Unable to connect to #{url}: #{e}"
106
+ end
107
+
108
+ smtp
109
+ end
110
+ end
111
+
112
+ include Serverspec::Type