serverspec-extra-types 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rspec +0 -0
  4. data/.rubocop.yml +0 -0
  5. data/.travis.yml +0 -0
  6. data/CODE_OF_CONDUCT.md +0 -0
  7. data/Gemfile +0 -0
  8. data/LICENSE.txt +0 -0
  9. data/README.md +657 -4
  10. data/Rakefile +0 -0
  11. data/bin/consul_gen.rb +115 -0
  12. data/bin/http_doc_gem.rb +67 -0
  13. data/http_matchers.md +1771 -0
  14. data/lib/serverspec_extra_types.rb +0 -0
  15. data/lib/serverspec_extra_types/helpers/properties.rb +0 -0
  16. data/lib/serverspec_extra_types/matchers.rb +4 -0
  17. data/lib/serverspec_extra_types/matchers/allowed_to_run_anything.rb +38 -0
  18. data/lib/serverspec_extra_types/matchers/allowed_to_run_command.rb +40 -0
  19. data/lib/serverspec_extra_types/matchers/be_a_manager_node.rb +0 -0
  20. data/lib/serverspec_extra_types/matchers/be_a_worker_node.rb +0 -0
  21. data/lib/serverspec_extra_types/matchers/be_active.rb +0 -0
  22. data/lib/serverspec_extra_types/matchers/configure_queue.rb +0 -0
  23. data/lib/serverspec_extra_types/matchers/have_count.rb +0 -0
  24. data/lib/serverspec_extra_types/matchers/have_domain_name.rb +0 -0
  25. data/lib/serverspec_extra_types/matchers/have_engine_version.rb +0 -0
  26. data/lib/serverspec_extra_types/matchers/have_environment_variable.rb +0 -0
  27. data/lib/serverspec_extra_types/matchers/have_ha_mode.rb +0 -0
  28. data/lib/serverspec_extra_types/matchers/have_ha_nodes.rb +0 -0
  29. data/lib/serverspec_extra_types/matchers/have_ha_sync_mode.rb +0 -0
  30. data/lib/serverspec_extra_types/matchers/have_host.rb +0 -0
  31. data/lib/serverspec_extra_types/matchers/have_hostname.rb +0 -0
  32. data/lib/serverspec_extra_types/matchers/have_image.rb +4 -0
  33. data/lib/serverspec_extra_types/matchers/have_image_sha.rb +0 -0
  34. data/lib/serverspec_extra_types/matchers/have_label.rb +0 -0
  35. data/lib/serverspec_extra_types/matchers/have_mount.rb +0 -0
  36. data/lib/serverspec_extra_types/matchers/have_network.rb +0 -0
  37. data/lib/serverspec_extra_types/matchers/have_placement_constraint.rb +0 -0
  38. data/lib/serverspec_extra_types/matchers/have_replica_count.rb +0 -0
  39. data/lib/serverspec_extra_types/matchers/have_restart_limit.rb +0 -0
  40. data/lib/serverspec_extra_types/matchers/have_restart_policy.rb +0 -0
  41. data/lib/serverspec_extra_types/matchers/have_user.rb +0 -0
  42. data/lib/serverspec_extra_types/matchers/have_vhost.rb +0 -0
  43. data/lib/serverspec_extra_types/matchers/http_1xx.rb +0 -0
  44. data/lib/serverspec_extra_types/matchers/http_2xx.rb +0 -0
  45. data/lib/serverspec_extra_types/matchers/http_3xx.rb +0 -0
  46. data/lib/serverspec_extra_types/matchers/http_4xx.rb +0 -0
  47. data/lib/serverspec_extra_types/matchers/http_5xx.rb +0 -0
  48. data/lib/serverspec_extra_types/matchers/include_regex.rb +0 -0
  49. data/lib/serverspec_extra_types/matchers/map_port.rb +0 -0
  50. data/lib/serverspec_extra_types/matchers/mirror_all.rb +0 -0
  51. data/lib/serverspec_extra_types/matchers/publish_all_ports.rb +0 -0
  52. data/lib/serverspec_extra_types/matchers/read_from_queue.rb +0 -0
  53. data/lib/serverspec_extra_types/matchers/url_matchers.rb +0 -0
  54. data/lib/serverspec_extra_types/matchers/write_to_queue.rb +0 -0
  55. data/lib/serverspec_extra_types/types.rb +2 -1
  56. data/lib/serverspec_extra_types/types/api_base.rb +10 -1
  57. data/lib/serverspec_extra_types/types/consul_base.rb +6 -2
  58. data/lib/serverspec_extra_types/types/consul_node.rb +21 -1
  59. data/lib/serverspec_extra_types/types/consul_node_list.rb +1 -1
  60. data/lib/serverspec_extra_types/types/consul_service.rb +188 -1
  61. data/lib/serverspec_extra_types/types/consul_service_list.rb +0 -0
  62. data/lib/serverspec_extra_types/types/curl.rb +5 -1
  63. data/lib/serverspec_extra_types/types/docker_config.rb +55 -0
  64. data/lib/serverspec_extra_types/types/docker_container.rb +0 -0
  65. data/lib/serverspec_extra_types/types/docker_network.rb +74 -1
  66. data/lib/serverspec_extra_types/types/docker_node.rb +12 -0
  67. data/lib/serverspec_extra_types/types/docker_secret.rb +56 -0
  68. data/lib/serverspec_extra_types/types/docker_service.rb +0 -0
  69. data/lib/serverspec_extra_types/types/rabbitmq_base.rb +7 -1
  70. data/lib/serverspec_extra_types/types/rabbitmq_node_list.rb +5 -1
  71. data/lib/serverspec_extra_types/types/rabbitmq_user_permission.rb +0 -0
  72. data/lib/serverspec_extra_types/types/rabbitmq_vhost_list.rb +4 -0
  73. data/lib/serverspec_extra_types/types/rabbitmq_vhost_policy.rb +0 -0
  74. data/lib/serverspec_extra_types/types/sudo_user.rb +90 -0
  75. data/lib/serverspec_extra_types/version.rb +1 -1
  76. data/properties.yml +45 -7
  77. data/serverspec-extra-types.gemspec +4 -1
  78. metadata +55 -5
File without changes
File without changes
@@ -36,3 +36,7 @@ require 'serverspec_extra_types/matchers/configure_queue'
36
36
  require 'serverspec_extra_types/matchers/have_count'
37
37
 
38
38
  require 'serverspec_extra_types/matchers/url_matchers'
39
+
40
+ #--- sudo matchers
41
+ require 'serverspec_extra_types/matchers/allowed_to_run_command'
42
+ require 'serverspec_extra_types/matchers/allowed_to_run_anything'
@@ -0,0 +1,38 @@
1
+ RSpec::Matchers.define :be_allowed_to_run_anything do
2
+ chain :as do |user|
3
+ @user = user
4
+ end
5
+ chain :as_anybody do
6
+ @user = 'ALL'
7
+ end
8
+ chain :without_password do
9
+ @checkpw = true
10
+ end
11
+ chain :without_a_password do
12
+ @checkpw = true
13
+ end
14
+ match do |actual|
15
+ if @user
16
+ actual.allowed_to_run_command?('ALL', @user, @checkpw)
17
+ else
18
+ actual.allowed_to_run_command?('ALL', @checkpw)
19
+ end
20
+ end
21
+
22
+ failure_message do |actual|
23
+ msg = if @user
24
+ "expected to be able to run anything as #{@user} got #{actual.permission('ALL')[:user]}"
25
+ else
26
+ "expected anything} to be in #{actual.permissions.map{|x| x[:command]}}"
27
+ end
28
+ msg << %( without a password ) if @checkpw
29
+ msg
30
+ end
31
+
32
+ description do
33
+ msg = "be allowed to run anything"
34
+ msg << %( as #{@user}) if @user
35
+ msg << %( without a password ) if @checkpw
36
+ msg
37
+ end
38
+ end
@@ -0,0 +1,40 @@
1
+ RSpec::Matchers.define :be_allowed_to_run_command do |command|
2
+ chain :as do |user|
3
+ @user = user
4
+ end
5
+ chain :as_anybody do
6
+ @anybody = true
7
+ end
8
+ chain :without_password do
9
+ @checkpw = true
10
+ end
11
+ chain :without_a_password do
12
+ @checkpw = true
13
+ end
14
+ match do |actual|
15
+ if @user
16
+ actual.allowed_to_run_command?(command, @user, @checkpw)
17
+ elsif @anybody
18
+ (actual.allowed_to_run_command?(command, 'ALL', @checkpw) || actual.allowed_to_run_command?(command, 'ALL:ALL' ,@checkpw))
19
+ else
20
+ actual.allowed_to_run_command?(command, @checkpw)
21
+ end
22
+ end
23
+
24
+ failure_message do |actual|
25
+ msg = if @user
26
+ "expected to be able to run #{command} as #{@user} got #{actual.permission(command)[:user]}"
27
+ else
28
+ "expected #{command} to be in #{actual.permissions.map{|x| x[:command]}}"
29
+ end
30
+ msg << %( without a password ) if @checkpw
31
+ msg
32
+ end
33
+
34
+ description do
35
+ msg = "be allowed to run #{command}"
36
+ msg << %( as #{@user}) if @user
37
+ msg << %( without a password ) if @checkpw
38
+ msg
39
+ end
40
+ end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
+ require 'rspec/expectations'
2
3
 
3
4
  RSpec::Matchers.define :have_image do |image|
4
5
  match do |actual|
5
6
  actual.has_image?(image)
6
7
  end
8
+ description do
9
+ "have image #{image}"
10
+ end
7
11
  failure_message do |actual|
8
12
  "expected image to be #{image} was #{actual.image}"
9
13
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -8,7 +8,8 @@ module Serverspec
8
8
  module Type
9
9
  types = %w[docker_service docker_node rabbitmq_vhost_policy rabbitmq_node_list rabbitmq_vhost_list
10
10
  rabbitmq_user_permission consul_service consul_service_list consul_node consul_node_list
11
- curl nfs_export jenkins_credential jenkins_job jenkins_plugin]
11
+ curl nfs_export jenkins_credential jenkins_job jenkins_plugin sudo_user docker_network
12
+ docker_config docker_secret]
12
13
 
13
14
  types.each do |type|
14
15
  require "serverspec_extra_types/types/#{type}"
@@ -26,14 +26,23 @@ module Serverspec::Type
26
26
  @url_base
27
27
  end
28
28
 
29
+
29
30
  def inspection
30
31
  @inspection ||= ::MultiJson.load(get_inspection.stdout)
31
32
  end
32
33
 
33
34
  private
34
35
 
36
+ def extra_args
37
+ ""
38
+ end
39
+
40
+ def curl_command
41
+ "curl #{extra_args} -s #{url} #{@insecure ? '-k' : ''} #{@redirects ? '-L' : ''}"
42
+ end
43
+
35
44
  def get_inspection
36
- command = "curl -s #{url} #{@insecure ? '-k' : ''} #{@redirects ? '-L' : ''}"
45
+ command = curl_command
37
46
  @get_inspection ||= @runner.run_command(command)
38
47
  end
39
48
  end
@@ -33,9 +33,13 @@ module Serverspec::Type
33
33
 
34
34
  private
35
35
 
36
+ def extra_args
37
+ @token ? "--header 'X-Consul-Token: #{@token}'" : ''
38
+ end
39
+
36
40
  def get_inspection
37
- headers = @token ? "--header 'X-Consul-Token: #{@token}'" : ''
38
- command = "curl -s #{headers} #{url}"
41
+
42
+ command = curl_command
39
43
  @get_inspection ||= @runner.run_command(command)
40
44
  end
41
45
  end
@@ -9,8 +9,28 @@ module Serverspec::Type
9
9
  "#{@url_base}/v1/catalog/node/#{@name}"
10
10
  end
11
11
 
12
+ def has_datacenter?(dc)
13
+ datacenter == dc
14
+ end
15
+
16
+ def datacenter
17
+ inspection['Node']['Datacenter']
18
+ end
19
+
20
+ def has_service?(service_name)
21
+ service(service_name) != nil
22
+ end
23
+
24
+ def service(service_name)
25
+ services.find service_name
26
+ end
27
+
28
+ def services
29
+ inspection['Services']
30
+ end
31
+
12
32
  def inspection
13
- @inspection ||= ::MultiJson.load(get_inspection.stdout) # Need a find
33
+ @inspection ||= ::MultiJson.load(get_inspection.stdout)
14
34
  end
15
35
  end
16
36
  end
@@ -20,7 +20,7 @@ module Serverspec::Type
20
20
  end
21
21
 
22
22
  def nodes
23
- inspection.keys
23
+ inspection.map { |node| node['Node']}
24
24
  end
25
25
 
26
26
  def inspection
@@ -16,7 +16,194 @@ module Serverspec::Type
16
16
  end
17
17
 
18
18
  def inspection
19
- @inspection ||= ::MultiJson.load(get_inspection.stdout)
19
+ @inspection ||= ::MultiJson.load(get_inspection.stdout)[0]
20
20
  end
21
+
22
+
23
+ ##= Generated Code Start =##
24
+ # TODO: Make these better
25
+ # Key Type: String
26
+ def id
27
+ inspection['ID']
28
+ end
29
+
30
+ def has_id?(id)
31
+ self.id == id
32
+ end
33
+
34
+ # Key Type: String
35
+ def node
36
+ inspection['Node']
37
+ end
38
+
39
+ def has_node?(node)
40
+ self.node == node
41
+ end
42
+
43
+ # Key Type: String
44
+ def address
45
+ inspection['Address']
46
+ end
47
+
48
+ def has_address?(address)
49
+ self.address == address
50
+ end
51
+
52
+ # Key Type: String
53
+ def datacenter
54
+ inspection['Datacenter']
55
+ end
56
+
57
+ def has_datacenter?(datacenter)
58
+ self.datacenter == datacenter
59
+ end
60
+
61
+ # Key Type: Hash
62
+ def tagged_addresses
63
+ inspection['TaggedAddresses']
64
+ end
65
+
66
+ # Todo: do method for indiviual tagged addresses
67
+ def has_tagged_addresses?(tagged_addresses)
68
+ self.tagged_addresses == tagged_addresses
69
+ end
70
+
71
+ # Key Type: Hash
72
+ def node_meta
73
+ inspection['NodeMeta']
74
+ end
75
+
76
+ def has_node_meta?(node_meta)
77
+ self.node_meta == node_meta
78
+ end
79
+
80
+ # Key Type: String
81
+ def service_kind
82
+ inspection['ServiceKind']
83
+ end
84
+
85
+ def has_service_kind?(service_kind)
86
+ self.service_kind == service_kind
87
+ end
88
+
89
+ # Key Type: String
90
+ def service_id
91
+ inspection['ServiceID']
92
+ end
93
+
94
+ def has_service_id?(service_id)
95
+ self.service_id == service_id
96
+ end
97
+
98
+ # Key Type: String
99
+ def service_name
100
+ inspection['ServiceName']
101
+ end
102
+
103
+ def has_service_name?(service_name)
104
+ self.service_name == service_name
105
+ end
106
+
107
+ # Key Type: Array
108
+ def service_tags
109
+ inspection['ServiceTags']
110
+ end
111
+
112
+ def has_service_tags?(service_tags)
113
+ self.service_tags == service_tags
114
+ end
115
+
116
+ # Key Type: String
117
+ def service_address
118
+ inspection['ServiceAddress']
119
+ end
120
+
121
+ def has_service_address?(service_address)
122
+ self.service_address == service_address
123
+ end
124
+
125
+ # Key Type: Hash
126
+ def service_weights
127
+ inspection['ServiceWeights']
128
+ end
129
+
130
+ # Todo: do method for indiviual service weight are well as passing/warning
131
+ def has_service_weights?(service_weights)
132
+ self.service_weights == service_weights
133
+ end
134
+
135
+ # Key Type: Hash
136
+ def service_meta
137
+ inspection['ServiceMeta']
138
+ end
139
+
140
+ def has_service_meta?(service_meta)
141
+ self.service_meta == service_meta
142
+ end
143
+
144
+ # Key Type: Integer
145
+ def service_port
146
+ inspection['ServicePort']
147
+ end
148
+
149
+ def has_service_port?(service_port)
150
+ self.service_port == service_port
151
+ end
152
+
153
+ # Key Type: FalseClass
154
+ def service_enable_tag_override
155
+ inspection['ServiceEnableTagOverride']
156
+ end
157
+
158
+ def has_service_enable_tag_override?(service_enable_tag_override)
159
+ self.service_enable_tag_override == service_enable_tag_override
160
+ end
161
+
162
+ # Key Type: String
163
+ def service_proxy_destination
164
+ inspection['ServiceProxyDestination']
165
+ end
166
+
167
+ def has_service_proxy_destination?(service_proxy_destination)
168
+ self.service_proxy_destination == service_proxy_destination
169
+ end
170
+
171
+ # Key Type: Hash
172
+ def service_proxy
173
+ inspection['ServiceProxy']
174
+ end
175
+
176
+ def has_service_proxy?(service_proxy)
177
+ self.service_proxy == service_proxy
178
+ end
179
+
180
+ # Key Type: Hash
181
+ def service_connect
182
+ inspection['ServiceConnect']
183
+ end
184
+
185
+ def has_service_connect?(service_connect)
186
+ self.service_connect == service_connect
187
+ end
188
+
189
+ # Key Type: Integer
190
+ def create_index
191
+ inspection['CreateIndex']
192
+ end
193
+
194
+ def has_create_index?(create_index)
195
+ self.create_index == create_index
196
+ end
197
+
198
+ # Key Type: Integer
199
+ def modify_index
200
+ inspection['ModifyIndex']
201
+ end
202
+
203
+ def has_modify_index?(modify_index)
204
+ self.modify_index == modify_index
205
+ end
206
+ ##= Generated Code End =##
207
+
21
208
  end
22
209
  end