pdk 2.7.0 → 3.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/README.md +2 -48
- data/lib/pdk/analytics/client/google_analytics.rb +22 -26
- data/lib/pdk/analytics/util.rb +0 -1
- data/lib/pdk/analytics.rb +1 -1
- data/lib/pdk/bolt.rb +1 -0
- data/lib/pdk/cli/build.rb +53 -56
- data/lib/pdk/cli/bundle.rb +34 -33
- data/lib/pdk/cli/console.rb +136 -134
- data/lib/pdk/cli/convert.rb +39 -41
- data/lib/pdk/cli/env.rb +49 -47
- data/lib/pdk/cli/errors.rb +1 -2
- data/lib/pdk/cli/exec/command.rb +23 -29
- data/lib/pdk/cli/exec/interactive_command.rb +7 -12
- data/lib/pdk/cli/exec.rb +4 -11
- data/lib/pdk/cli/exec_group.rb +3 -2
- data/lib/pdk/cli/get/config.rb +21 -19
- data/lib/pdk/cli/get.rb +15 -13
- data/lib/pdk/cli/new/class.rb +22 -22
- data/lib/pdk/cli/new/defined_type.rb +22 -22
- data/lib/pdk/cli/new/fact.rb +19 -19
- data/lib/pdk/cli/new/function.rb +20 -20
- data/lib/pdk/cli/new/module.rb +40 -38
- data/lib/pdk/cli/new/provider.rb +19 -19
- data/lib/pdk/cli/new/task.rb +23 -23
- data/lib/pdk/cli/new/test.rb +50 -48
- data/lib/pdk/cli/new/transport.rb +18 -18
- data/lib/pdk/cli/new.rb +11 -9
- data/lib/pdk/cli/release/prep.rb +27 -25
- data/lib/pdk/cli/release/publish.rb +39 -37
- data/lib/pdk/cli/release.rb +152 -149
- data/lib/pdk/cli/remove/config.rb +63 -60
- data/lib/pdk/cli/remove.rb +15 -13
- data/lib/pdk/cli/set/config.rb +91 -89
- data/lib/pdk/cli/set.rb +15 -13
- data/lib/pdk/cli/test/unit.rb +71 -69
- data/lib/pdk/cli/test.rb +9 -7
- data/lib/pdk/cli/update.rb +33 -38
- data/lib/pdk/cli/util/command_redirector.rb +10 -1
- data/lib/pdk/cli/util/interview.rb +11 -4
- data/lib/pdk/cli/util/option_normalizer.rb +2 -4
- data/lib/pdk/cli/util/option_validator.rb +7 -9
- data/lib/pdk/cli/util/update_manager_printer.rb +4 -4
- data/lib/pdk/cli/util.rb +32 -48
- data/lib/pdk/cli/validate.rb +98 -96
- data/lib/pdk/cli.rb +124 -120
- data/lib/pdk/config/ini_file.rb +4 -3
- data/lib/pdk/config/ini_file_setting.rb +6 -10
- data/lib/pdk/config/json.rb +1 -0
- data/lib/pdk/config/json_schema_namespace.rb +5 -10
- data/lib/pdk/config/json_schema_setting.rb +3 -5
- data/lib/pdk/config/json_with_schema.rb +2 -4
- data/lib/pdk/config/namespace.rb +19 -13
- data/lib/pdk/config/setting.rb +5 -6
- data/lib/pdk/config/task_schema.json +116 -0
- data/lib/pdk/config/validator.rb +4 -4
- data/lib/pdk/config/yaml.rb +3 -8
- data/lib/pdk/config/yaml_with_schema.rb +4 -12
- data/lib/pdk/config.rb +47 -51
- data/lib/pdk/context/control_repo.rb +3 -2
- data/lib/pdk/context/module.rb +2 -2
- data/lib/pdk/context/none.rb +2 -2
- data/lib/pdk/context.rb +4 -5
- data/lib/pdk/control_repo.rb +3 -4
- data/lib/pdk/generate/defined_type.rb +3 -3
- data/lib/pdk/generate/fact.rb +3 -2
- data/lib/pdk/generate/function.rb +5 -4
- data/lib/pdk/generate/module.rb +91 -106
- data/lib/pdk/generate/provider.rb +5 -4
- data/lib/pdk/generate/puppet_class.rb +3 -3
- data/lib/pdk/generate/puppet_object.rb +9 -12
- data/lib/pdk/generate/task.rb +11 -10
- data/lib/pdk/generate/transport.rb +8 -7
- data/lib/pdk/generate.rb +1 -1
- data/lib/pdk/logger.rb +3 -2
- data/lib/pdk/module/build.rb +34 -49
- data/lib/pdk/module/convert.rb +13 -22
- data/lib/pdk/module/metadata.rb +53 -61
- data/lib/pdk/module/release.rb +19 -25
- data/lib/pdk/module/update.rb +4 -13
- data/lib/pdk/module/update_manager.rb +18 -25
- data/lib/pdk/module.rb +1 -1
- data/lib/pdk/monkey_patches.rb +268 -0
- data/lib/pdk/report/event.rb +12 -37
- data/lib/pdk/report.rb +4 -4
- data/lib/pdk/template/fetcher/git.rb +7 -8
- data/lib/pdk/template/fetcher/local.rb +1 -0
- data/lib/pdk/template/fetcher.rb +4 -2
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +4 -9
- data/lib/pdk/template/renderer/v1/renderer.rb +19 -20
- data/lib/pdk/template/renderer/v1/template_file.rb +4 -8
- data/lib/pdk/template/renderer/v1.rb +1 -1
- data/lib/pdk/template/renderer.rb +1 -0
- data/lib/pdk/template/template_dir.rb +3 -3
- data/lib/pdk/template.rb +2 -6
- data/lib/pdk/tests/unit.rb +36 -25
- data/lib/pdk/util/bundler.rb +10 -14
- data/lib/pdk/util/changelog_generator.rb +15 -12
- data/lib/pdk/util/env.rb +1 -0
- data/lib/pdk/util/filesystem.rb +18 -17
- data/lib/pdk/util/git.rb +16 -21
- data/lib/pdk/util/json_finder.rb +7 -6
- data/lib/pdk/util/puppet_strings.rb +1 -1
- data/lib/pdk/util/puppet_version.rb +16 -67
- data/lib/pdk/util/ruby_version.rb +9 -13
- data/lib/pdk/util/template_uri.rb +17 -29
- data/lib/pdk/util/vendored_file.rb +5 -18
- data/lib/pdk/util/windows/api_types.rb +70 -64
- data/lib/pdk/util/windows/file.rb +31 -27
- data/lib/pdk/util/windows/process.rb +59 -61
- data/lib/pdk/util/windows/string.rb +19 -12
- data/lib/pdk/util.rb +12 -20
- data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +1 -1
- data/lib/pdk/validate/control_repo/environment_conf_validator.rb +25 -25
- data/lib/pdk/validate/external_command_validator.rb +6 -1
- data/lib/pdk/validate/internal_ruby_validator.rb +5 -4
- data/lib/pdk/validate/invokable_validator.rb +30 -20
- data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +12 -14
- data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +13 -15
- data/lib/pdk/validate/metadata/metadata_validator_group.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_epp_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_lint_validator.rb +14 -14
- data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_validator_group.rb +1 -1
- data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +10 -11
- data/lib/pdk/validate/ruby/ruby_validator_group.rb +1 -1
- data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +19 -24
- data/lib/pdk/validate/tasks/tasks_name_validator.rb +11 -13
- data/lib/pdk/validate/tasks/tasks_validator_group.rb +1 -1
- data/lib/pdk/validate/validator.rb +4 -2
- data/lib/pdk/validate/validator_group.rb +6 -3
- data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +27 -36
- data/lib/pdk/validate/yaml/yaml_validator_group.rb +1 -1
- data/lib/pdk/validate.rb +6 -6
- data/lib/pdk/version.rb +2 -2
- data/lib/pdk.rb +12 -12
- metadata +27 -35
- data/lib/pdk/cli/config/get.rb +0 -26
- data/lib/pdk/cli/config.rb +0 -22
- data/lib/pdk/cli/module/build.rb +0 -12
- data/lib/pdk/cli/module/generate.rb +0 -47
- data/lib/pdk/cli/module.rb +0 -14
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-06/schema#",
|
|
3
|
+
"title": "Puppet Task Metadata",
|
|
4
|
+
"description": "The metadata format for Puppet Tasks",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"description": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "A longer description(one paragraph) of how to use the task"
|
|
10
|
+
},
|
|
11
|
+
"puppet_task_version": {
|
|
12
|
+
"type": "integer",
|
|
13
|
+
"description": "The version of this spec used",
|
|
14
|
+
"default": 1
|
|
15
|
+
},
|
|
16
|
+
"supports_noop": {
|
|
17
|
+
"type": "boolean",
|
|
18
|
+
"default": false,
|
|
19
|
+
"description": "This task respects the '_noop' metaparam. If this false or absent the task runner will refuse to run this task if noop is specified."
|
|
20
|
+
},
|
|
21
|
+
"remote": {
|
|
22
|
+
"type": "boolean",
|
|
23
|
+
"default": false,
|
|
24
|
+
"description": "This task is capable of operating on a remote target using connection information in the '_target' metaparam."
|
|
25
|
+
},
|
|
26
|
+
"input_method": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"enum": ["stdin", "environment", "both", "powershell"],
|
|
29
|
+
"description": "What input method should be used to pass params to the task"
|
|
30
|
+
},
|
|
31
|
+
"parameters": {
|
|
32
|
+
"$ref": "#/definitions/paramsObject",
|
|
33
|
+
"description": "An object mapping valid parameter names to corresponding json-schemas"
|
|
34
|
+
},
|
|
35
|
+
"implementations": {
|
|
36
|
+
"type": "array",
|
|
37
|
+
"items": {
|
|
38
|
+
"type": "object",
|
|
39
|
+
"required": ["name"],
|
|
40
|
+
"properties": {
|
|
41
|
+
"name": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Name of task executable file"
|
|
44
|
+
},
|
|
45
|
+
"requirements": {
|
|
46
|
+
"type": "array",
|
|
47
|
+
"additionalItems": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
},
|
|
50
|
+
"description": "Features required on target to execute task"
|
|
51
|
+
},
|
|
52
|
+
"files": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"additionalItems": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
},
|
|
57
|
+
"description": "File resources required by task"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"description": "Rules for selecting implementation resources based on features available on target"
|
|
62
|
+
},
|
|
63
|
+
"files": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"items": {
|
|
66
|
+
"type": "string"
|
|
67
|
+
},
|
|
68
|
+
"description": "Path to file resources saved in valid module directory to be provided to task"
|
|
69
|
+
},
|
|
70
|
+
"private": {
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"description": "Should this task appear by default in UI lists of tasks"
|
|
73
|
+
},
|
|
74
|
+
"extensions": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"description": "Task Runner specific metadata extensions",
|
|
77
|
+
"items": {
|
|
78
|
+
"type": "object"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"definitions": {
|
|
83
|
+
"parameterName": {
|
|
84
|
+
"description": "Valid names for parameter keys",
|
|
85
|
+
"type": "string",
|
|
86
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
87
|
+
},
|
|
88
|
+
"paramsObject": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"description": "An object with restricted keys and enumData support",
|
|
91
|
+
"propertyNames": {"$ref": "#/definitions/parameterName"},
|
|
92
|
+
"additionalProperties": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"description": "Extend Normal JSON schema to require an object and describe 'enumData' to map enum values to descriptions",
|
|
95
|
+
"properties": {
|
|
96
|
+
"description": {
|
|
97
|
+
"description": "A description of the parameter",
|
|
98
|
+
"type": "string"
|
|
99
|
+
},
|
|
100
|
+
"type": {
|
|
101
|
+
"description": "A puppet type string that describes a data type that will match the parameter value",
|
|
102
|
+
"type": "string"
|
|
103
|
+
},
|
|
104
|
+
"sensitive": {
|
|
105
|
+
"description": "Whether the task runner should treat the parameter value as sensitive",
|
|
106
|
+
"type": "boolean",
|
|
107
|
+
"default": false
|
|
108
|
+
},
|
|
109
|
+
"default": {
|
|
110
|
+
"description": "The default value to pass to the task implementation if the parameter isn't provided"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
data/lib/pdk/config/validator.rb
CHANGED
|
@@ -12,8 +12,8 @@ module PDK
|
|
|
12
12
|
# FalseClass.
|
|
13
13
|
def self.boolean
|
|
14
14
|
{
|
|
15
|
-
proc:
|
|
16
|
-
message: 'must be a boolean: true or false'
|
|
15
|
+
proc: ->(value) { [true, false].include?(value) },
|
|
16
|
+
message: 'must be a boolean: true or false'
|
|
17
17
|
}
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -22,8 +22,8 @@ module PDK
|
|
|
22
22
|
# regex for a version 4 UUID.
|
|
23
23
|
def self.uuid
|
|
24
24
|
{
|
|
25
|
-
proc:
|
|
26
|
-
message: 'must be a version 4 UUID'
|
|
25
|
+
proc: ->(value) { value.match(/\A\h{8}(?:-\h{4}){3}-\h{12}\z/) },
|
|
26
|
+
message: 'must be a version 4 UUID'
|
|
27
27
|
}
|
|
28
28
|
end
|
|
29
29
|
end
|
data/lib/pdk/config/yaml.rb
CHANGED
|
@@ -8,6 +8,7 @@ module PDK
|
|
|
8
8
|
class YAML < Namespace
|
|
9
9
|
def parse_file(filename)
|
|
10
10
|
raise unless block_given?
|
|
11
|
+
|
|
11
12
|
data = load_data(filename)
|
|
12
13
|
return if data.nil? || data.empty?
|
|
13
14
|
|
|
@@ -22,15 +23,9 @@ module PDK
|
|
|
22
23
|
|
|
23
24
|
data.each { |k, v| yield k, PDK::Config::Setting.new(k, self, v) }
|
|
24
25
|
rescue Psych::SyntaxError => e
|
|
25
|
-
raise PDK::Config::LoadError, 'Syntax error when loading %{file}: %{error}'
|
|
26
|
-
file: filename,
|
|
27
|
-
error: "#{e.problem} #{e.context}",
|
|
28
|
-
}
|
|
26
|
+
raise PDK::Config::LoadError, format('Syntax error when loading %{file}: %{error}', file: filename, error: "#{e.problem} #{e.context}")
|
|
29
27
|
rescue Psych::DisallowedClass => e
|
|
30
|
-
raise PDK::Config::LoadError, 'Unsupported class in %{file}: %{error}'
|
|
31
|
-
file: filename,
|
|
32
|
-
error: e.message,
|
|
33
|
-
}
|
|
28
|
+
raise PDK::Config::LoadError, format('Unsupported class in %{file}: %{error}', file: filename, error: e.message)
|
|
34
29
|
end
|
|
35
30
|
|
|
36
31
|
# Serializes object data into a YAML string.
|
|
@@ -8,6 +8,7 @@ module PDK
|
|
|
8
8
|
class YAMLWithSchema < JSONSchemaNamespace
|
|
9
9
|
def parse_file(filename)
|
|
10
10
|
raise unless block_given?
|
|
11
|
+
|
|
11
12
|
data = load_data(filename)
|
|
12
13
|
data = '' if data.nil?
|
|
13
14
|
require 'yaml'
|
|
@@ -20,10 +21,7 @@ module PDK
|
|
|
20
21
|
# Ensure the parsed document is actually valid
|
|
21
22
|
validate_document!(@raw_data)
|
|
22
23
|
rescue ::JSON::Schema::ValidationError => e
|
|
23
|
-
raise PDK::Config::LoadError, 'The configuration file %{filename} is not valid: %{message}'
|
|
24
|
-
filename: filename,
|
|
25
|
-
message: e.message,
|
|
26
|
-
}
|
|
24
|
+
raise PDK::Config::LoadError, format('The configuration file %{filename} is not valid: %{message}', filename: filename, message: e.message)
|
|
27
25
|
end
|
|
28
26
|
|
|
29
27
|
require 'pdk/config/json_schema_setting'
|
|
@@ -36,15 +34,9 @@ module PDK
|
|
|
36
34
|
# we're left with the settings that we don't manage.
|
|
37
35
|
self.unmanaged_settings = @raw_data.reject { |k, _| schema_property_names.include?(k) }
|
|
38
36
|
rescue Psych::SyntaxError => e
|
|
39
|
-
raise PDK::Config::LoadError, 'Syntax error when loading %{file}: %{error}'
|
|
40
|
-
file: filename,
|
|
41
|
-
error: "#{e.problem} #{e.context}",
|
|
42
|
-
}
|
|
37
|
+
raise PDK::Config::LoadError, format('Syntax error when loading %{file}: %{error}', file: filename, error: "#{e.problem} #{e.context}")
|
|
43
38
|
rescue Psych::DisallowedClass => e
|
|
44
|
-
raise PDK::Config::LoadError, 'Unsupported class in %{file}: %{error}'
|
|
45
|
-
file: filename,
|
|
46
|
-
error: e.message,
|
|
47
|
-
}
|
|
39
|
+
raise PDK::Config::LoadError, format('Unsupported class in %{file}: %{error}', file: filename, error: e.message)
|
|
48
40
|
end
|
|
49
41
|
|
|
50
42
|
# Serializes object data into a YAML string.
|
data/lib/pdk/config.rb
CHANGED
|
@@ -24,12 +24,12 @@ module PDK
|
|
|
24
24
|
def initialize(options = nil)
|
|
25
25
|
options = {} if options.nil?
|
|
26
26
|
@config_options = {
|
|
27
|
-
'system.path'
|
|
27
|
+
'system.path' => PDK::Config.system_config_path,
|
|
28
28
|
'system.module_defaults.path' => PDK::Config.system_answers_path,
|
|
29
|
-
'user.path'
|
|
30
|
-
'user.module_defaults.path'
|
|
31
|
-
'user.analytics.path'
|
|
32
|
-
'context'
|
|
29
|
+
'user.path' => PDK::Config.user_config_path,
|
|
30
|
+
'user.module_defaults.path' => PDK::AnswerFile.default_answer_file_path,
|
|
31
|
+
'user.analytics.path' => PDK::Config.analytics_config_path,
|
|
32
|
+
'context' => PDK.context
|
|
33
33
|
}.merge(options)
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -91,9 +91,7 @@ module PDK
|
|
|
91
91
|
def project_config
|
|
92
92
|
context = @config_options['context']
|
|
93
93
|
@project ||= PDK::Config::Namespace.new('project') do
|
|
94
|
-
if context.is_a?(PDK::Context::ControlRepo)
|
|
95
|
-
mount :environment, PDK::ControlRepo.environment_conf_as_config(File.join(context.root_path, 'environment.conf'))
|
|
96
|
-
end
|
|
94
|
+
mount :environment, PDK::ControlRepo.environment_conf_as_config(File.join(context.root_path, 'environment.conf')) if context.is_a?(PDK::Context::ControlRepo)
|
|
97
95
|
|
|
98
96
|
mount :validate, PDK::Config::YAML.new('validate', file: File.join(context.root_path, 'pdk.yaml'), persistent_defaults: true) do
|
|
99
97
|
setting 'ignore' do
|
|
@@ -124,9 +122,10 @@ module PDK
|
|
|
124
122
|
return nil if root.nil? || root.empty?
|
|
125
123
|
|
|
126
124
|
if keys.empty?
|
|
127
|
-
|
|
125
|
+
case root
|
|
126
|
+
when Array
|
|
128
127
|
name = root
|
|
129
|
-
|
|
128
|
+
when String
|
|
130
129
|
name = split_key_string(root)
|
|
131
130
|
else
|
|
132
131
|
return nil
|
|
@@ -135,7 +134,7 @@ module PDK
|
|
|
135
134
|
name = [root].concat(keys)
|
|
136
135
|
end
|
|
137
136
|
|
|
138
|
-
get_within_scopes(name[1
|
|
137
|
+
get_within_scopes(name[1..], [name[0]])
|
|
139
138
|
end
|
|
140
139
|
|
|
141
140
|
# Returns a configuration setting by name, using scope precedence rules. If no scopes are passed, then all scopes are queried using the default precedence rules
|
|
@@ -143,8 +142,8 @@ module PDK
|
|
|
143
142
|
# @scopes [Nil, Array[String]] The list of scopes, in order, to query in turn for the setting_name. Invalid or missing scopes are ignored.
|
|
144
143
|
# @return [PDK::Config::Namespace, Object, nil] The value of the configuration setting. Returns nil if it does no exist
|
|
145
144
|
def get_within_scopes(setting_name, scopes = nil)
|
|
146
|
-
raise ArgumentError, 'Expected an Array but got \'%{klass}\' for scopes'
|
|
147
|
-
raise ArgumentError, 'Expected an Array or String but got \'%{klass}\' for setting_name'
|
|
145
|
+
raise ArgumentError, format('Expected an Array but got \'%{klass}\' for scopes', klass: scopes.class) unless scopes.nil? || scopes.is_a?(Array)
|
|
146
|
+
raise ArgumentError, format('Expected an Array or String but got \'%{klass}\' for setting_name', klass: setting_name.class) unless setting_name.is_a?(Array) || setting_name.is_a?(String)
|
|
148
147
|
|
|
149
148
|
setting_arr = setting_name.is_a?(String) ? split_key_string(setting_name) : setting_name
|
|
150
149
|
all_scope_names = all_scopes.keys
|
|
@@ -165,6 +164,7 @@ module PDK
|
|
|
165
164
|
# @yield [PDK::Config::Namespace, Object] The value of the configuration setting. Does not yield if the setting does not exist or is nil
|
|
166
165
|
def with_scoped_value(setting_name, scopes = nil)
|
|
167
166
|
raise ArgumentError, 'must be passed a block' unless block_given?
|
|
167
|
+
|
|
168
168
|
value = get_within_scopes(setting_name, scopes)
|
|
169
169
|
yield value unless value.nil?
|
|
170
170
|
end
|
|
@@ -179,24 +179,23 @@ module PDK
|
|
|
179
179
|
# @return [Object] The new value of the configuration setting
|
|
180
180
|
def set(key, value, options = {})
|
|
181
181
|
options = {
|
|
182
|
-
force: false
|
|
182
|
+
force: false
|
|
183
183
|
}.merge(options)
|
|
184
184
|
|
|
185
185
|
names = key.is_a?(String) ? split_key_string(key) : key
|
|
186
186
|
raise ArgumentError, 'Invalid configuration names' if names.nil? || !names.is_a?(Array) || names.empty?
|
|
187
|
+
|
|
187
188
|
scope_name = names[0]
|
|
188
|
-
raise ArgumentError, "Unknown configuration root '%{name}'"
|
|
189
|
-
|
|
189
|
+
raise ArgumentError, format("Unknown configuration root '%{name}'", name: scope_name) if all_scopes[scope_name].nil?
|
|
190
|
+
|
|
191
|
+
deep_set_object(value, options[:force], send(all_scopes[scope_name]), *names[1..])
|
|
190
192
|
end
|
|
191
193
|
|
|
192
194
|
def self.bolt_analytics_config
|
|
193
195
|
file = PDK::Util::Filesystem.expand_path('~/.puppetlabs/bolt/analytics.yaml')
|
|
194
196
|
PDK::Config::YAML.new(file: file)
|
|
195
197
|
rescue PDK::Config::LoadError => e
|
|
196
|
-
PDK.logger.debug 'Unable to load %{file}: %{message}'
|
|
197
|
-
file: file,
|
|
198
|
-
message: e.message,
|
|
199
|
-
}
|
|
198
|
+
PDK.logger.debug format('Unable to load %{file}: %{message}', file: file, message: e.message)
|
|
200
199
|
PDK::Config::YAML.new
|
|
201
200
|
end
|
|
202
201
|
|
|
@@ -222,7 +221,7 @@ module PDK
|
|
|
222
221
|
|
|
223
222
|
# return nil if not exist
|
|
224
223
|
def self.json_schema(name)
|
|
225
|
-
File.join(json_schemas_path, name
|
|
224
|
+
File.join(json_schemas_path, "#{name}_schema.json")
|
|
226
225
|
end
|
|
227
226
|
|
|
228
227
|
def self.analytics_config_exist?
|
|
@@ -235,24 +234,21 @@ module PDK
|
|
|
235
234
|
return unless PDK::CLI::Util.interactive?
|
|
236
235
|
|
|
237
236
|
pre_message =
|
|
238
|
-
'PDK collects anonymous usage information to help us understand how ' \
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
237
|
+
format('PDK collects anonymous usage information to help us understand how ' \
|
|
238
|
+
'it is being used and make decisions on how to improve it. You can ' \
|
|
239
|
+
'find out more about what data we collect and how it is used in the ' \
|
|
240
|
+
"PDK documentation at %{url}.\n", url: 'https://puppet.com/docs/pdk/latest/pdk_install.html')
|
|
242
241
|
post_message =
|
|
243
|
-
'You can opt in or out of the usage data collection at any time by ' \
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
path: PDK::Config.analytics_config_path,
|
|
247
|
-
key: 'disabled',
|
|
248
|
-
}
|
|
242
|
+
format('You can opt in or out of the usage data collection at any time by ' \
|
|
243
|
+
'editing the analytics configuration file at %{path} and changing ' \
|
|
244
|
+
"the '%{key}' value.", path: PDK::Config.analytics_config_path, key: 'disabled')
|
|
249
245
|
|
|
250
246
|
questions = [
|
|
251
247
|
{
|
|
252
|
-
name:
|
|
248
|
+
name: 'enabled',
|
|
253
249
|
question: 'Do you consent to the collection of anonymous PDK usage information?',
|
|
254
|
-
type:
|
|
255
|
-
}
|
|
250
|
+
type: :yes
|
|
251
|
+
}
|
|
256
252
|
]
|
|
257
253
|
|
|
258
254
|
require 'pdk/cli/util/interview'
|
|
@@ -265,9 +261,9 @@ module PDK
|
|
|
265
261
|
|
|
266
262
|
if answers.nil?
|
|
267
263
|
PDK.logger.info 'No answer given, opting out of analytics collection.'
|
|
268
|
-
PDK.config.set(
|
|
264
|
+
PDK.config.set(['user', 'analytics', 'disabled'], true)
|
|
269
265
|
else
|
|
270
|
-
PDK.config.set(
|
|
266
|
+
PDK.config.set(['user', 'analytics', 'disabled'], !answers['enabled'])
|
|
271
267
|
end
|
|
272
268
|
|
|
273
269
|
PDK.logger.info(text: post_message, wrap: true)
|
|
@@ -275,7 +271,7 @@ module PDK
|
|
|
275
271
|
|
|
276
272
|
private
|
|
277
273
|
|
|
278
|
-
|
|
274
|
+
# :nocov: This is a private method and is tested elsewhere
|
|
279
275
|
def traverse_object(object, *names)
|
|
280
276
|
return nil if object.nil? || !object.respond_to?(:[])
|
|
281
277
|
return nil if names.nil?
|
|
@@ -289,25 +285,27 @@ module PDK
|
|
|
289
285
|
value = object[name]
|
|
290
286
|
if names.empty?
|
|
291
287
|
return value if value.is_a?(PDK::Config::Namespace)
|
|
288
|
+
|
|
292
289
|
# Duplicate arrays and hashes so that they are isolated from changes being made
|
|
293
|
-
|
|
290
|
+
value.is_a?(Hash) || value.is_a?(Array) ? value.dup : value
|
|
294
291
|
else
|
|
295
292
|
traverse_object(value, *names)
|
|
296
293
|
end
|
|
297
294
|
end
|
|
298
|
-
|
|
295
|
+
# :nocov:
|
|
299
296
|
|
|
300
|
-
|
|
297
|
+
# :nocov: This is a private method and is tested elsewhere
|
|
301
298
|
# Takes a string representation of a setting and splits into its constituent setting parts e.g.
|
|
302
299
|
# 'user.a.b.c' becomes ['user', 'a', 'b', 'c']
|
|
303
300
|
# @return [Array[String]] The string split into each setting name as an array
|
|
304
301
|
def split_key_string(key)
|
|
305
|
-
raise ArgumentError, 'Expected a String but got \'%{klass}\''
|
|
302
|
+
raise ArgumentError, format('Expected a String but got \'%{klass}\'', klass: key.class) unless key.is_a?(String)
|
|
303
|
+
|
|
306
304
|
key.split('.')
|
|
307
305
|
end
|
|
308
|
-
|
|
306
|
+
# :nocov:
|
|
309
307
|
|
|
310
|
-
|
|
308
|
+
# :nocov:
|
|
311
309
|
# Returns all known scope names and their associated method name to call, to query the scope
|
|
312
310
|
# Note - Order is important. This dictates the resolution precedence order (topmost is processed first)
|
|
313
311
|
# @return [Hash[String, Symbol]] A hash of the scope name then method name to call to query the scope (as a Symbol)
|
|
@@ -315,12 +313,12 @@ module PDK
|
|
|
315
313
|
# Note - Order is important. This dictates the resolution precedence order (topmost is processed first)
|
|
316
314
|
{
|
|
317
315
|
'project' => :project_config,
|
|
318
|
-
'user'
|
|
319
|
-
'system'
|
|
316
|
+
'user' => :user_config,
|
|
317
|
+
'system' => :system_config
|
|
320
318
|
}.freeze
|
|
321
319
|
end
|
|
322
320
|
|
|
323
|
-
|
|
321
|
+
# :nocov: This is a private method and is tested elsewhere
|
|
324
322
|
# Deeply traverses an object tree via `[]` and sets the last
|
|
325
323
|
# element to the value specified.
|
|
326
324
|
#
|
|
@@ -333,9 +331,7 @@ module PDK
|
|
|
333
331
|
current_value = namespace[name]
|
|
334
332
|
|
|
335
333
|
# If the next thing in the traversal chain is another namespace, set the value using that child namespace.
|
|
336
|
-
if current_value.is_a?(PDK::Config::Namespace)
|
|
337
|
-
return deep_set_object(value, force, current_value, *names)
|
|
338
|
-
end
|
|
334
|
+
return deep_set_object(value, force, current_value, *names) if current_value.is_a?(PDK::Config::Namespace)
|
|
339
335
|
|
|
340
336
|
# We're at the end of the name traversal
|
|
341
337
|
if names.empty?
|
|
@@ -378,11 +374,11 @@ module PDK
|
|
|
378
374
|
return value
|
|
379
375
|
end
|
|
380
376
|
|
|
381
|
-
raise ArgumentError, "Unable to set '%{key}' to '%{value}' as it is not a Hash"
|
|
377
|
+
raise ArgumentError, format("Unable to set '%{key}' to '%{value}' as it is not a Hash", key: "#{namespace.name}.#{name}", value: hash_value) unless current_value.is_a?(Hash)
|
|
382
378
|
|
|
383
379
|
namespace[name] = current_value.merge(hash_value)
|
|
384
380
|
value
|
|
385
381
|
end
|
|
386
|
-
|
|
382
|
+
# :nocov:
|
|
387
383
|
end
|
|
388
384
|
end
|
|
@@ -26,6 +26,7 @@ module PDK
|
|
|
26
26
|
# @return [Array[String]] The modulepath setting for this control repository
|
|
27
27
|
def module_paths
|
|
28
28
|
return @module_paths unless @module_paths.nil?
|
|
29
|
+
|
|
29
30
|
value = environment_conf['modulepath'] || ''
|
|
30
31
|
# We have to use a hardcoded value here because File::PATH_SEPARATOR is ';' on Windows.
|
|
31
32
|
# As the environment.conf is only used on Puppet Server, it's always ':'
|
|
@@ -41,12 +42,12 @@ module PDK
|
|
|
41
42
|
.select { |path| PDK::Util::Filesystem.directory?(PDK::Util::Filesystem.expand_path(File.join(root_path, path))) }
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
# :nocov:
|
|
45
46
|
# @see PDK::Context::AbstractContext.display_name
|
|
46
47
|
def display_name
|
|
47
48
|
'a Control Repository context'
|
|
48
49
|
end
|
|
49
|
-
|
|
50
|
+
# :nocov:
|
|
50
51
|
|
|
51
52
|
private
|
|
52
53
|
|
data/lib/pdk/context/module.rb
CHANGED
|
@@ -17,12 +17,12 @@ module PDK
|
|
|
17
17
|
PDK::Util.module_pdk_compatible?(root_path)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
# :nocov:
|
|
21
21
|
# @see PDK::Context::AbstractContext.display_name
|
|
22
22
|
def display_name
|
|
23
23
|
'a Puppet Module context'
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
# :nocov:
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
end
|
data/lib/pdk/context/none.rb
CHANGED
|
@@ -5,12 +5,12 @@ module PDK
|
|
|
5
5
|
# Represents a context which the PDK does not know. For example
|
|
6
6
|
# an empty directory
|
|
7
7
|
class None < PDK::Context::AbstractContext
|
|
8
|
-
|
|
8
|
+
# :nocov:
|
|
9
9
|
# @see PDK::Context::AbstractContext.display_name
|
|
10
10
|
def display_name
|
|
11
11
|
'an unknown context'
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
# :nocov:
|
|
14
14
|
|
|
15
15
|
# @see PDK::Context::AbstractContext.parent_context
|
|
16
16
|
def parent_context
|
data/lib/pdk/context.rb
CHANGED
|
@@ -20,9 +20,7 @@ module PDK
|
|
|
20
20
|
|
|
21
21
|
# Puppet Module detection
|
|
22
22
|
metadata_file = File.join(current, 'metadata.json')
|
|
23
|
-
if PDK::Util::Filesystem.file?(metadata_file) || PDK::Util.in_module_root?(context_path)
|
|
24
|
-
return PDK::Context::Module.new(current, context_path)
|
|
25
|
-
end
|
|
23
|
+
return PDK::Context::Module.new(current, context_path) if PDK::Util::Filesystem.file?(metadata_file) || PDK::Util.in_module_root?(context_path)
|
|
26
24
|
|
|
27
25
|
previous = current
|
|
28
26
|
current = PDK::Util::Filesystem.expand_path('..', current)
|
|
@@ -82,6 +80,7 @@ module PDK
|
|
|
82
80
|
PDK.logger.debug("Detected #{current.display_name} at #{current.root_path.nil? ? current.context_path : current.root_path}")
|
|
83
81
|
current = current.parent_context
|
|
84
82
|
break if current.nil?
|
|
83
|
+
|
|
85
84
|
depth += 1
|
|
86
85
|
# Circuit breaker in case there are circular references
|
|
87
86
|
break if depth > 20
|
|
@@ -89,11 +88,11 @@ module PDK
|
|
|
89
88
|
nil
|
|
90
89
|
end
|
|
91
90
|
|
|
92
|
-
|
|
91
|
+
# :nocov: There's nothing to test here
|
|
93
92
|
def to_s
|
|
94
93
|
"#<#{self.class}:#{object_id}>#{context_path}"
|
|
95
94
|
end
|
|
96
|
-
|
|
95
|
+
# :nocov:
|
|
97
96
|
end
|
|
98
97
|
end
|
|
99
98
|
end
|
data/lib/pdk/control_repo.rb
CHANGED
|
@@ -2,7 +2,7 @@ require 'pdk'
|
|
|
2
2
|
|
|
3
3
|
module PDK
|
|
4
4
|
module ControlRepo
|
|
5
|
-
CONTROL_REPO_FILES =
|
|
5
|
+
CONTROL_REPO_FILES = ['environment.conf', 'Puppetfile'].freeze
|
|
6
6
|
|
|
7
7
|
DEFAULT_IGNORED = [
|
|
8
8
|
'/pkg/',
|
|
@@ -11,7 +11,7 @@ module PDK
|
|
|
11
11
|
# Strictly speaking this isn't default but if people have tricked older PDK into thinking that a
|
|
12
12
|
# Control Repo is a module, they may have recursive symlinks in spec/fixtures/modules
|
|
13
13
|
'/spec/fixtures/modules/',
|
|
14
|
-
'/vendor/'
|
|
14
|
+
'/vendor/'
|
|
15
15
|
].freeze
|
|
16
16
|
|
|
17
17
|
# Returns path to the root of the Control Repo being worked on.
|
|
@@ -38,10 +38,9 @@ module PDK
|
|
|
38
38
|
File.dirname(environment_conf_path)
|
|
39
39
|
elsif control_repo_root?(Dir.pwd)
|
|
40
40
|
Dir.pwd
|
|
41
|
-
else
|
|
42
|
-
nil
|
|
43
41
|
end
|
|
44
42
|
return path if path.nil? || !strict_check
|
|
43
|
+
|
|
45
44
|
PDK::Bolt.bolt_project_root?(path) ? nil : path
|
|
46
45
|
end
|
|
47
46
|
module_function :find_control_repo_root
|
|
@@ -25,12 +25,12 @@ module PDK
|
|
|
25
25
|
define_name_parts = object_name.split('::')
|
|
26
26
|
# drop the module name if the object name contains multiple parts
|
|
27
27
|
define_name_parts.delete_at(0) if define_name_parts.length > 1
|
|
28
|
-
files = { 'defined_type_spec.erb' => File.join('spec', 'defines', *define_name_parts)
|
|
28
|
+
files = { 'defined_type_spec.erb' => "#{File.join('spec', 'defines', *define_name_parts)}_spec.rb" }
|
|
29
29
|
return files if spec_only?
|
|
30
30
|
|
|
31
|
-
define_name_parts = object_name.split('::')[1
|
|
31
|
+
define_name_parts = object_name.split('::')[1..]
|
|
32
32
|
define_name_parts << 'init' if define_name_parts.empty?
|
|
33
|
-
files['defined_type.erb'] = File.join('manifests', *define_name_parts)
|
|
33
|
+
files['defined_type.erb'] = "#{File.join('manifests', *define_name_parts)}.pp"
|
|
34
34
|
|
|
35
35
|
files
|
|
36
36
|
end
|
data/lib/pdk/generate/fact.rb
CHANGED
|
@@ -9,11 +9,12 @@ module PDK
|
|
|
9
9
|
|
|
10
10
|
def template_files
|
|
11
11
|
files = {
|
|
12
|
-
'fact_spec.erb' => File.join('spec', 'unit', 'facter', object_name)
|
|
12
|
+
'fact_spec.erb' => "#{File.join('spec', 'unit', 'facter', object_name)}_spec.rb"
|
|
13
13
|
}
|
|
14
14
|
return files if spec_only?
|
|
15
|
+
|
|
15
16
|
files.merge(
|
|
16
|
-
'fact.erb' => File.join('lib', 'facter', object_name)
|
|
17
|
+
'fact.erb' => "#{File.join('lib', 'facter', object_name)}.rb"
|
|
17
18
|
)
|
|
18
19
|
end
|
|
19
20
|
|
|
@@ -24,16 +24,17 @@ module PDK
|
|
|
24
24
|
# Drop the module name if the object name contains multiple parts
|
|
25
25
|
func_name_parts.delete_at(0) if func_name_parts.length > 1
|
|
26
26
|
files = {
|
|
27
|
-
File.join('functions', 'function_spec.erb') => File.join('spec', 'functions', *func_name_parts)
|
|
27
|
+
File.join('functions', 'function_spec.erb') => "#{File.join('spec', 'functions', *func_name_parts)}_spec.rb"
|
|
28
28
|
}
|
|
29
29
|
return files if spec_only?
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
func_name_parts = object_name.split('::')[1..]
|
|
31
32
|
template_file = File.join('functions', "#{options[:type]}_function.erb")
|
|
32
33
|
|
|
33
34
|
files[template_file] = if options[:type].eql?('v4')
|
|
34
|
-
File.join('lib', 'puppet', 'functions', module_name, *func_name_parts)
|
|
35
|
+
"#{File.join('lib', 'puppet', 'functions', module_name, *func_name_parts)}.rb"
|
|
35
36
|
else
|
|
36
|
-
File.join('functions', *func_name_parts)
|
|
37
|
+
"#{File.join('functions', *func_name_parts)}.pp"
|
|
37
38
|
end
|
|
38
39
|
files
|
|
39
40
|
end
|