serverspec-extra-types 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +117 -0
- data/.rubocop.yml +24 -2
- data/.simplecov +7 -0
- data/README.md +344 -15
- data/lib/serverspec-extra-types.rb +5 -0
- data/lib/serverspec_extra_types.rb +4 -3
- data/lib/serverspec_extra_types/matchers.rb +2 -1
- data/lib/serverspec_extra_types/matchers/allowed_to_run_anything.rb +12 -9
- data/lib/serverspec_extra_types/matchers/allowed_to_run_command.rb +8 -6
- data/lib/serverspec_extra_types/matchers/apply_to.rb +7 -0
- data/lib/serverspec_extra_types/matchers/have_host.rb +8 -1
- data/lib/serverspec_extra_types/matchers/have_image.rb +1 -0
- data/lib/serverspec_extra_types/matchers/have_label.rb +1 -3
- data/lib/serverspec_extra_types/types/api_base.rb +3 -2
- data/lib/serverspec_extra_types/types/consul_base.rb +5 -1
- data/lib/serverspec_extra_types/types/consul_node_list.rb +1 -1
- data/lib/serverspec_extra_types/types/consul_service.rb +2 -4
- data/lib/serverspec_extra_types/types/curl.rb +2 -0
- data/lib/serverspec_extra_types/types/docker_config.rb +4 -1
- data/lib/serverspec_extra_types/types/docker_container.rb +2 -0
- data/lib/serverspec_extra_types/types/docker_network.rb +6 -4
- data/lib/serverspec_extra_types/types/docker_node.rb +3 -1
- data/lib/serverspec_extra_types/types/docker_secret.rb +4 -2
- data/lib/serverspec_extra_types/types/docker_service.rb +3 -1
- data/lib/serverspec_extra_types/types/jenkins_base.rb +0 -1
- data/lib/serverspec_extra_types/types/jenkins_credential.rb +5 -6
- data/lib/serverspec_extra_types/types/jenkins_job.rb +7 -6
- data/lib/serverspec_extra_types/types/jenkins_plugin.rb +8 -4
- data/lib/serverspec_extra_types/types/nfs_export.rb +16 -4
- data/lib/serverspec_extra_types/types/rabbitmq_base.rb +2 -2
- data/lib/serverspec_extra_types/types/rabbitmq_node_list.rb +1 -1
- data/lib/serverspec_extra_types/types/rabbitmq_vhost_list.rb +1 -1
- data/lib/serverspec_extra_types/types/rabbitmq_vhost_policy.rb +13 -1
- data/lib/serverspec_extra_types/types/sudo_user.rb +18 -15
- data/lib/serverspec_extra_types/version.rb +1 -1
- data/properties.yml +31 -5
- data/serverspec-extra-types.gemspec +1 -1
- metadata +8 -4
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require '
|
5
|
-
|
3
|
+
puts "Deprecation WARNING: this file has been deprecated as the entry point to the gem. please use:"
|
4
|
+
puts "require 'serverspec-extra-types'"
|
5
|
+
|
6
|
+
require 'serverspec-extra-types'
|
@@ -30,6 +30,7 @@ require 'serverspec_extra_types/matchers/have_ha_nodes'
|
|
30
30
|
require 'serverspec_extra_types/matchers/have_vhost'
|
31
31
|
require 'serverspec_extra_types/matchers/have_ha_sync_mode'
|
32
32
|
require 'serverspec_extra_types/matchers/mirror_all'
|
33
|
+
require 'serverspec_extra_types/matchers/apply_to'
|
33
34
|
require 'serverspec_extra_types/matchers/read_from_queue'
|
34
35
|
require 'serverspec_extra_types/matchers/write_to_queue'
|
35
36
|
require 'serverspec_extra_types/matchers/configure_queue'
|
@@ -39,4 +40,4 @@ require 'serverspec_extra_types/matchers/url_matchers'
|
|
39
40
|
|
40
41
|
#--- sudo matchers
|
41
42
|
require 'serverspec_extra_types/matchers/allowed_to_run_command'
|
42
|
-
require 'serverspec_extra_types/matchers/allowed_to_run_anything'
|
43
|
+
require 'serverspec_extra_types/matchers/allowed_to_run_anything'
|
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
RSpec::Matchers.define :be_allowed_to_run_anything do
|
2
4
|
chain :as do |user|
|
3
5
|
@user = user
|
4
6
|
end
|
5
7
|
chain :as_anybody do
|
6
8
|
@user = 'ALL'
|
9
|
+
@anybody = true
|
7
10
|
end
|
8
11
|
chain :without_password do
|
9
12
|
@checkpw = true
|
@@ -20,19 +23,19 @@ RSpec::Matchers.define :be_allowed_to_run_anything do
|
|
20
23
|
end
|
21
24
|
|
22
25
|
failure_message do |actual|
|
23
|
-
msg = if
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
msg = if @user
|
27
|
+
"expected to be able to run anything as #{@user} got #{actual.permission('ALL')[:user]}"
|
28
|
+
else
|
29
|
+
"expected 'ALL' to be in #{actual.permissions.map { |x| x[:command] }}"
|
27
30
|
end
|
28
|
-
msg << %( without a password
|
31
|
+
msg << %( without a password) if @checkpw
|
29
32
|
msg
|
30
33
|
end
|
31
34
|
|
32
35
|
description do
|
33
|
-
msg =
|
34
|
-
msg << %( as #{@user}) if @user
|
35
|
-
msg << %( without a password
|
36
|
+
msg = 'be allowed to run anything'
|
37
|
+
msg << %( as #{@anybody ? 'anybody' : "'#{@user}'"}) if @user
|
38
|
+
msg << %( without a password) if @checkpw
|
36
39
|
msg
|
37
40
|
end
|
38
|
-
end
|
41
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
RSpec::Matchers.define :be_allowed_to_run_command do |command|
|
2
4
|
chain :as do |user|
|
3
5
|
@user = user
|
@@ -15,17 +17,17 @@ RSpec::Matchers.define :be_allowed_to_run_command do |command|
|
|
15
17
|
if @user
|
16
18
|
actual.allowed_to_run_command?(command, @user, @checkpw)
|
17
19
|
elsif @anybody
|
18
|
-
(actual.allowed_to_run_command?(command, 'ALL', @checkpw) || actual.allowed_to_run_command?(command, 'ALL:ALL'
|
20
|
+
(actual.allowed_to_run_command?(command, 'ALL', @checkpw) || actual.allowed_to_run_command?(command, 'ALL:ALL', @checkpw))
|
19
21
|
else
|
20
22
|
actual.allowed_to_run_command?(command, @checkpw)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
failure_message do |actual|
|
25
|
-
msg = if
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
msg = if @user
|
28
|
+
"expected to be able to run #{command} as #{@user} got #{actual.permission(command)[:user]}"
|
29
|
+
else
|
30
|
+
"expected #{command} to be in #{actual.permissions.map { |x| x[:command] }}"
|
29
31
|
end
|
30
32
|
msg << %( without a password ) if @checkpw
|
31
33
|
msg
|
@@ -37,4 +39,4 @@ RSpec::Matchers.define :be_allowed_to_run_command do |command|
|
|
37
39
|
msg << %( without a password ) if @checkpw
|
38
40
|
msg
|
39
41
|
end
|
40
|
-
end
|
42
|
+
end
|
@@ -3,7 +3,11 @@
|
|
3
3
|
RSpec::Matchers.define :have_host do |host|
|
4
4
|
match do |actual|
|
5
5
|
if !@option
|
6
|
-
|
6
|
+
if !@options
|
7
|
+
actual.has_host? host
|
8
|
+
else
|
9
|
+
actual.has_host? host, @option
|
10
|
+
end
|
7
11
|
else
|
8
12
|
actual.has_host? host, @option
|
9
13
|
end
|
@@ -11,13 +15,16 @@ RSpec::Matchers.define :have_host do |host|
|
|
11
15
|
description do
|
12
16
|
msg = "have #{host}"
|
13
17
|
msg << " with option #{@option}" if @option
|
18
|
+
msg << " with options #{@options}" if @options
|
14
19
|
msg
|
15
20
|
end
|
16
21
|
failure_message do |actual|
|
17
22
|
msg = "expected #{actual.hosts} to contain #{host}"
|
18
23
|
msg << " with option '#{@option}'" if @option
|
24
|
+
msg << " with options '#{@options}'" if @options
|
19
25
|
msg
|
20
26
|
end
|
21
27
|
|
22
28
|
chain :with_option, :option
|
29
|
+
chain :with_options, :options
|
23
30
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec::Matchers.define :be_labeled do |label|
|
4
|
-
|
5
|
-
|
6
4
|
match do |actual|
|
7
5
|
if !@value
|
8
6
|
actual.labels.key? label
|
@@ -31,4 +29,4 @@ RSpec::Matchers.define :be_labeled do |label|
|
|
31
29
|
end
|
32
30
|
end
|
33
31
|
RSpec::Matchers.alias_matcher :have_label, :be_labeled
|
34
|
-
RSpec::Matchers.alias_matcher :be_labelled, :be_labeled
|
32
|
+
RSpec::Matchers.alias_matcher :be_labelled, :be_labeled
|
@@ -26,7 +26,6 @@ module Serverspec::Type
|
|
26
26
|
@url_base
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
29
|
def inspection
|
31
30
|
@inspection ||= ::MultiJson.load(get_inspection.stdout)
|
32
31
|
end
|
@@ -34,16 +33,18 @@ module Serverspec::Type
|
|
34
33
|
private
|
35
34
|
|
36
35
|
def extra_args
|
37
|
-
|
36
|
+
''
|
38
37
|
end
|
39
38
|
|
40
39
|
def curl_command
|
41
40
|
"curl #{extra_args} -s #{url} #{@insecure ? '-k' : ''} #{@redirects ? '-L' : ''}"
|
42
41
|
end
|
43
42
|
|
43
|
+
# rubocop:disable Naming/AccessorMethodName
|
44
44
|
def get_inspection
|
45
45
|
command = curl_command
|
46
46
|
@get_inspection ||= @runner.run_command(command)
|
47
47
|
end
|
48
|
+
# rubocop:enable Naming/AccessorMethodName
|
48
49
|
end
|
49
50
|
end
|
@@ -28,6 +28,8 @@ module Serverspec::Type
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def inspection
|
31
|
+
puts get_inspection.stdout
|
32
|
+
puts get_inspection.stderr
|
31
33
|
@inspection ||= ::MultiJson.load(get_inspection.stdout)[0]
|
32
34
|
end
|
33
35
|
|
@@ -37,10 +39,12 @@ module Serverspec::Type
|
|
37
39
|
@token ? "--header 'X-Consul-Token: #{@token}'" : ''
|
38
40
|
end
|
39
41
|
|
42
|
+
# rubocop:disable Naming/AccessorMethodName
|
40
43
|
def get_inspection
|
41
|
-
|
42
44
|
command = curl_command
|
43
45
|
@get_inspection ||= @runner.run_command(command)
|
44
46
|
end
|
47
|
+
# rubocop:enable Naming/AccessorMethodName
|
48
|
+
|
45
49
|
end
|
46
50
|
end
|
@@ -19,7 +19,6 @@ module Serverspec::Type
|
|
19
19
|
@inspection ||= ::MultiJson.load(get_inspection.stdout)[0]
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
22
|
##= Generated Code Start =##
|
24
23
|
# TODO: Make these better
|
25
24
|
# Key Type: String
|
@@ -63,7 +62,7 @@ module Serverspec::Type
|
|
63
62
|
inspection['TaggedAddresses']
|
64
63
|
end
|
65
64
|
|
66
|
-
#
|
65
|
+
# TODO: do method for indiviual tagged addresses
|
67
66
|
def has_tagged_addresses?(tagged_addresses)
|
68
67
|
self.tagged_addresses == tagged_addresses
|
69
68
|
end
|
@@ -127,7 +126,7 @@ module Serverspec::Type
|
|
127
126
|
inspection['ServiceWeights']
|
128
127
|
end
|
129
128
|
|
130
|
-
#
|
129
|
+
# TODO: do method for indiviual service weight are well as passing/warning
|
131
130
|
def has_service_weights?(service_weights)
|
132
131
|
self.service_weights == service_weights
|
133
132
|
end
|
@@ -204,6 +203,5 @@ module Serverspec::Type
|
|
204
203
|
self.modify_index == modify_index
|
205
204
|
end
|
206
205
|
##= Generated Code End =##
|
207
|
-
|
208
206
|
end
|
209
207
|
end
|
@@ -48,6 +48,7 @@ module Serverspec::Type
|
|
48
48
|
"-w \"#{output_format}\""
|
49
49
|
end
|
50
50
|
|
51
|
+
# rubocop:disable Naming/AccessorMethodName
|
51
52
|
def get_inspection
|
52
53
|
command = curl_command
|
53
54
|
unless @get_inspection
|
@@ -59,6 +60,7 @@ module Serverspec::Type
|
|
59
60
|
|
60
61
|
@get_inspection
|
61
62
|
end
|
63
|
+
# rubocop:enable Naming/AccessorMethodName
|
62
64
|
|
63
65
|
def output_format
|
64
66
|
out = '!!SS_URL_YAML!!---\\n'
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'base64'
|
3
4
|
module Serverspec::Type
|
4
5
|
class DockerConfig < DockerBase
|
@@ -15,7 +16,7 @@ module Serverspec::Type
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def has_data64?(data)
|
18
|
-
|
19
|
+
data64 == data
|
19
20
|
end
|
20
21
|
|
21
22
|
def data64
|
@@ -48,8 +49,10 @@ module Serverspec::Type
|
|
48
49
|
|
49
50
|
private
|
50
51
|
|
52
|
+
# rubocop:disable Naming/AccessorMethodName
|
51
53
|
def get_inspection
|
52
54
|
@get_inspection ||= @runner.run_command("docker config inspect #{@name}")
|
53
55
|
end
|
56
|
+
# rubocop:enable Naming/AccessorMethodName
|
54
57
|
end
|
55
58
|
end
|
@@ -118,9 +118,11 @@ module Serverspec::Type
|
|
118
118
|
|
119
119
|
private
|
120
120
|
|
121
|
+
# rubocop:disable Naming/AccessorMethodName
|
121
122
|
def get_inspection
|
122
123
|
@containers ||= @name.include?('=') ? @runner.run_command("docker ps -qa -f #{@name}").stdout : @name
|
123
124
|
@get_inspection ||= @runner.run_command("docker inspect #{@containers}")
|
124
125
|
end
|
126
|
+
# rubocop:enable Naming/AccessorMethodName
|
125
127
|
end
|
126
128
|
end
|
@@ -3,9 +3,7 @@
|
|
3
3
|
require 'serverspec'
|
4
4
|
|
5
5
|
module Serverspec::Type
|
6
|
-
|
7
6
|
class DockerNetwork < DockerBase
|
8
|
-
|
9
7
|
def name
|
10
8
|
inspection['Name']
|
11
9
|
end
|
@@ -35,11 +33,11 @@ module Serverspec::Type
|
|
35
33
|
end
|
36
34
|
|
37
35
|
def overlay?
|
38
|
-
|
36
|
+
has_driver? 'overlay'
|
39
37
|
end
|
40
38
|
|
41
39
|
def bridge?
|
42
|
-
|
40
|
+
has_driver? 'bridge'
|
43
41
|
end
|
44
42
|
|
45
43
|
def driver
|
@@ -66,9 +64,11 @@ module Serverspec::Type
|
|
66
64
|
inspection['Labels']
|
67
65
|
end
|
68
66
|
|
67
|
+
# rubocop:disable Naming/MethodName
|
69
68
|
def IPv6_enabled?
|
70
69
|
inspection['EnableIPv6']
|
71
70
|
end
|
71
|
+
# rubocop:enable Naming/MethodName
|
72
72
|
|
73
73
|
def internal?
|
74
74
|
inspection['Internal']
|
@@ -88,8 +88,10 @@ module Serverspec::Type
|
|
88
88
|
|
89
89
|
private
|
90
90
|
|
91
|
+
# rubocop:disable Naming/AccessorMethodName
|
91
92
|
def get_inspection
|
92
93
|
@get_inspection ||= @runner.run_command("docker network inspect #{@name}")
|
93
94
|
end
|
95
|
+
# rubocop:enable Naming/AccessorMethodName
|
94
96
|
end
|
95
97
|
end
|
@@ -14,7 +14,6 @@ module Serverspec::Type
|
|
14
14
|
availability == 'pause'
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
17
|
def availability
|
19
18
|
inspection['Spec']['Availability']
|
20
19
|
end
|
@@ -46,10 +45,13 @@ module Serverspec::Type
|
|
46
45
|
def exist?
|
47
46
|
get_inspection.success?
|
48
47
|
end
|
48
|
+
|
49
49
|
private
|
50
50
|
|
51
|
+
# rubocop:disable Naming/AccessorMethodName
|
51
52
|
def get_inspection
|
52
53
|
@get_inspection ||= @runner.run_command("docker node inspect #{@name}")
|
53
54
|
end
|
55
|
+
# rubocop:enable Naming/AccessorMethodName
|
54
56
|
end
|
55
57
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'base64'
|
3
4
|
module Serverspec::Type
|
4
5
|
class DockerSecret < DockerBase
|
@@ -15,10 +16,9 @@ module Serverspec::Type
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def has_data64?(data)
|
18
|
-
|
19
|
+
data64 == data
|
19
20
|
end
|
20
21
|
|
21
|
-
|
22
22
|
def data64
|
23
23
|
inspection['Spec']['Data']
|
24
24
|
end
|
@@ -49,8 +49,10 @@ module Serverspec::Type
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
+
# rubocop:disable Naming/AccessorMethodName
|
52
53
|
def get_inspection
|
53
54
|
@get_inspection ||= @runner.run_command("docker secret inspect #{@name}")
|
54
55
|
end
|
56
|
+
# rubocop:enable Naming/AccessorMethodName
|
55
57
|
end
|
56
58
|
end
|
@@ -75,7 +75,7 @@ module Serverspec::Type
|
|
75
75
|
|
76
76
|
def has_secret?(name, target = nil)
|
77
77
|
if target
|
78
|
-
secrets.find { |secret| secret['SecretName'] == name && secret['File']['Name'] == target}
|
78
|
+
secrets.find { |secret| secret['SecretName'] == name && secret['File']['Name'] == target }
|
79
79
|
else
|
80
80
|
secrets.find { |secret| secret['SecretName'] == name }
|
81
81
|
end
|
@@ -168,9 +168,11 @@ module Serverspec::Type
|
|
168
168
|
|
169
169
|
private
|
170
170
|
|
171
|
+
# rubocop:disable Naming/AccessorMethodName
|
171
172
|
def get_inspection
|
172
173
|
@get_inspection ||= @runner.run_command("docker service inspect #{@name}")
|
173
174
|
end
|
175
|
+
# rubocop:enable Naming/AccessorMethodName
|
174
176
|
end
|
175
177
|
end
|
176
178
|
|
@@ -30,17 +30,14 @@ module Serverspec::Type
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
33
|
def ssh_private_key?
|
35
34
|
inspection['typeName'] == 'SSH Username with private key'
|
36
35
|
end
|
37
36
|
|
38
|
-
|
39
37
|
def gitlab_api_token?
|
40
38
|
inspection['typeName'] == 'GitLab API token'
|
41
39
|
end
|
42
40
|
|
43
|
-
|
44
41
|
def aws_credential?
|
45
42
|
inspection['typeName'] == 'AWS Credentials'
|
46
43
|
end
|
@@ -57,16 +54,18 @@ module Serverspec::Type
|
|
57
54
|
inspection['description'] == desc
|
58
55
|
end
|
59
56
|
|
60
|
-
def
|
61
|
-
inspection['
|
57
|
+
def has_display_name?(text)
|
58
|
+
inspection['displayName'] == text
|
62
59
|
end
|
63
60
|
|
64
61
|
private
|
65
62
|
|
63
|
+
# rubocop:disable Naming/AccessorMethodName
|
66
64
|
def get_inspection
|
67
|
-
userpass = @user ? "-u #{@user}:#{@password}" :
|
65
|
+
userpass = @user ? "-u #{@user}:#{@password}" : ''
|
68
66
|
command = "curl -s #{userpass} #{url} #{@insecure ? '-k' : ''} #{@redirects ? '-L' : ''}"
|
69
67
|
@get_inspection ||= @runner.run_command(command)
|
70
68
|
end
|
69
|
+
# rubocop:enable Naming/AccessorMethodName
|
71
70
|
end
|
72
71
|
end
|