machinery-tool 1.18.0 → 1.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/.git_revision +1 -1
  3. data/NEWS +17 -0
  4. data/bin/machinery +10 -2
  5. data/html/comparison.html.haml +1 -1
  6. data/html/index.html.haml +2 -2
  7. data/html/partials/{config_files.html.haml → changed_config_files.html.haml} +10 -10
  8. data/html/partials/compare/changed_config_files.html.haml +48 -0
  9. data/html/partials/compare/{config_file_list.html.haml → changed_config_files_list.html.haml} +0 -0
  10. data/html/partials/compare/unmanaged_file_list.html.haml +1 -1
  11. data/html/partials/compare/unmanaged_files.html.haml +2 -2
  12. data/html/partials/patterns.html.haml +5 -0
  13. data/html/upgrade.html.haml +49 -0
  14. data/lib/{analyze_config_file_diffs_task.rb → analyze_changed_config_files_diffs_task.rb} +8 -8
  15. data/lib/autoyast.rb +12 -13
  16. data/lib/build_task.rb +2 -2
  17. data/lib/cli.rb +39 -32
  18. data/lib/compare_task.rb +1 -1
  19. data/lib/config_base.rb +1 -1
  20. data/lib/deploy_task.rb +4 -4
  21. data/lib/docker_system.rb +1 -1
  22. data/lib/element_filter.rb +3 -3
  23. data/lib/export_task.rb +3 -3
  24. data/lib/file_validator.rb +8 -5
  25. data/lib/filter.rb +5 -5
  26. data/lib/filter_option_parser.rb +3 -3
  27. data/lib/hint.rb +9 -4
  28. data/lib/html.rb +3 -3
  29. data/lib/inspect_task.rb +3 -3
  30. data/lib/json_schema_monkey_patch.rb +2 -2
  31. data/lib/json_validation_error_cleaner.rb +1 -1
  32. data/lib/json_validator.rb +2 -2
  33. data/lib/kiwi_config.rb +39 -14
  34. data/lib/list_task.rb +1 -1
  35. data/lib/local_system.rb +4 -4
  36. data/lib/machinery.rb +1 -1
  37. data/lib/machinery_logger.rb +4 -4
  38. data/lib/manifest.rb +5 -5
  39. data/lib/migration.rb +4 -4
  40. data/lib/object.rb +6 -10
  41. data/lib/remove_task.rb +1 -1
  42. data/lib/renderer.rb +5 -5
  43. data/lib/scope_file_access_archive.rb +2 -2
  44. data/lib/scope_file_access_flat.rb +3 -3
  45. data/lib/scope_file_store.rb +3 -3
  46. data/lib/serve_html_task.rb +15 -2
  47. data/lib/server.rb +32 -12
  48. data/lib/system.rb +1 -1
  49. data/lib/system_description.rb +16 -14
  50. data/lib/system_description_store.rb +5 -6
  51. data/lib/ui.rb +1 -1
  52. data/lib/upgrade_format_task.rb +2 -2
  53. data/lib/version.rb +1 -1
  54. data/lib/workload_mapper.rb +11 -11
  55. data/lib/zypper.rb +1 -1
  56. data/machinery-helper/Rakefile +1 -1
  57. data/machinery-helper/version.go +1 -1
  58. data/man/generated/machinery.1.gz +0 -0
  59. data/manual/docs/machinery-analyze.1.md +3 -3
  60. data/manual/docs/machinery-compare.1.md +2 -2
  61. data/manual/docs/machinery-inspect-docker.1.md +1 -1
  62. data/manual/docs/machinery-inspect.1.md +4 -1
  63. data/manual/docs/machinery-show.1.md +2 -2
  64. data/manual/docs/machinery_main_general.1.md +1 -1
  65. data/manual/docs/machinery_main_scopes.1.md +8 -6
  66. data/manual/site/machinery-analyze.1/index.html +3 -3
  67. data/manual/site/machinery-compare.1/index.html +2 -2
  68. data/manual/site/machinery-inspect-docker.1/index.html +1 -1
  69. data/manual/site/machinery-inspect.1/index.html +3 -1
  70. data/manual/site/machinery-show.1/index.html +2 -2
  71. data/manual/site/machinery_main_general.1/index.html +1 -1
  72. data/manual/site/machinery_main_scopes.1/index.html +8 -6
  73. data/manual/site/mkdocs/search_index.json +17 -17
  74. data/manual/site/sitemap.xml +23 -23
  75. data/plugins/{config_files/config_files.yml → changed_config_files/changed_config_files.yml} +3 -3
  76. data/plugins/{config_files/config_files_inspector.rb → changed_config_files/changed_config_files_inspector.rb} +14 -10
  77. data/plugins/{config_files/config_files_model.rb → changed_config_files/changed_config_files_model.rb} +1 -1
  78. data/plugins/{config_files/config_files_renderer.rb → changed_config_files/changed_config_files_renderer.rb} +9 -9
  79. data/plugins/{config_files/schema/system-description-config-files.schema-v1.json → changed_config_files/schema/system-description-changed-config-files.schema-v1.json} +0 -0
  80. data/plugins/{config_files/schema/system-description-config-files.schema-v2.json → changed_config_files/schema/system-description-changed-config-files.schema-v2.json} +0 -0
  81. data/plugins/{config_files/schema/system-description-config-files.schema-v3.json → changed_config_files/schema/system-description-changed-config-files.schema-v3.json} +0 -0
  82. data/plugins/{config_files/schema/system-description-config-files.schema-v4.json → changed_config_files/schema/system-description-changed-config-files.schema-v4.json} +0 -0
  83. data/plugins/{config_files/schema/system-description-config-files.schema-v5.json → changed_config_files/schema/system-description-changed-config-files.schema-v5.json} +0 -0
  84. data/plugins/{config_files/schema/system-description-config-files.schema-v6.json → changed_config_files/schema/system-description-changed-config-files.schema-v6.json} +0 -0
  85. data/plugins/{config_files/schema/system-description-config-files.schema-v7.json → changed_config_files/schema/system-description-changed-config-files.schema-v7.json} +0 -0
  86. data/plugins/changed_config_files/schema/system-description-changed-config-files.schema-v8.json +160 -0
  87. data/plugins/changed_managed_files/changed_managed_files_inspector.rb +6 -2
  88. data/plugins/changed_managed_files/changed_managed_files_renderer.rb +1 -1
  89. data/plugins/changed_managed_files/schema/system-description-changed-managed-files.schema-v8.json +160 -0
  90. data/plugins/environment/schema/system-description-environment.schema-v8.json +17 -0
  91. data/plugins/groups/groups_inspector.rb +1 -1
  92. data/plugins/groups/groups_renderer.rb +1 -1
  93. data/plugins/groups/schema/system-description-groups.schema-v8.json +49 -0
  94. data/plugins/os/os_inspector.rb +6 -6
  95. data/plugins/os/os_renderer.rb +1 -1
  96. data/plugins/os/schema/system-description-os.schema-v8.json +21 -0
  97. data/plugins/packages/packages_inspector.rb +1 -1
  98. data/plugins/packages/schema/system-description-packages.schema-v8.json +115 -0
  99. data/plugins/patterns/patterns.yml +5 -3
  100. data/plugins/patterns/patterns_inspector.rb +4 -3
  101. data/plugins/patterns/patterns_renderer.rb +5 -1
  102. data/plugins/patterns/schema/system-description-patterns.schema-v8.json +58 -0
  103. data/plugins/repositories/repositories_inspector.rb +2 -1
  104. data/plugins/repositories/schema/system-description-repositories.schema-v8.json +165 -0
  105. data/plugins/services/schema/system-description-services.schema-v8.json +93 -0
  106. data/plugins/services/services.yml +1 -1
  107. data/plugins/services/services_inspector.rb +1 -1
  108. data/plugins/unmanaged_files/schema/system-description-unmanaged-files.schema-v8.json +124 -0
  109. data/plugins/unmanaged_files/unmanaged_files_inspector.rb +9 -4
  110. data/plugins/unmanaged_files/unmanaged_files_model.rb +12 -5
  111. data/plugins/unmanaged_files/unmanaged_files_renderer.rb +1 -1
  112. data/plugins/users/schema/system-description-users.schema-v8.json +86 -0
  113. data/plugins/users/users_inspector.rb +7 -7
  114. data/schema/migrations/migrate1to2.rb +4 -4
  115. data/schema/migrations/migrate2to3.rb +1 -1
  116. data/schema/migrations/migrate3to4.rb +9 -9
  117. data/schema/migrations/migrate7to8.rb +47 -0
  118. data/schema/system-description-global.schema-v8.json +43 -0
  119. data/workload_mapper/rails/setup/setup.rb.erb +1 -1
  120. data/workload_mapper/wordpress/setup/setup.rb.erb +1 -1
  121. metadata +31 -17
  122. data/html/partials/compare/config_files.html.haml +0 -48
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+
4
+ "type": "object",
5
+ "required": ["locale"],
6
+ "properties": {
7
+ "locale": {
8
+ "type": "string",
9
+ "minLength": 1
10
+ },
11
+ "system_type": {
12
+ "type": "string",
13
+ "enum": ["local", "remote", "docker"]
14
+ }
15
+ }
16
+ }
17
+
@@ -32,7 +32,7 @@ class GroupsInspector < Inspector
32
32
  end
33
33
 
34
34
  def summary
35
- "Found #{@description.groups.size} groups."
35
+ "Found #{Machinery.pluralize(@description.groups.size, "%d group")}."
36
36
  end
37
37
 
38
38
  private
@@ -23,7 +23,7 @@ class GroupsRenderer < Renderer
23
23
  description.groups.each do |group|
24
24
  gid = group.gid || "N/A"
25
25
  details ="gid: #{gid}"
26
- details += ", users: #{group.users.join(",")}" if !group.users.empty?
26
+ details += ", users: #{group.users.join(",")}" unless group.users.empty?
27
27
 
28
28
  item "#{group.name} (#{details})"
29
29
  end
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+
4
+ "type": "object",
5
+ "required": [
6
+ "_elements"
7
+ ],
8
+ "properties": {
9
+ "_attributes": {
10
+ "type": "object"
11
+ },
12
+ "_elements": {
13
+ "type": "array",
14
+ "items": {
15
+ "type": "object",
16
+ "required": [
17
+ "name",
18
+ "password",
19
+ "gid",
20
+ "users"
21
+ ],
22
+ "properties": {
23
+ "name": {
24
+ "type": "string",
25
+ "minLength": 1
26
+ },
27
+ "password": {
28
+ "type": "string"
29
+ },
30
+ "gid": {
31
+ "type": [
32
+ "integer",
33
+ "null"
34
+ ],
35
+ "minimum": 0
36
+ },
37
+ "users": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "string",
41
+ "minLength": 1
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+
@@ -65,12 +65,12 @@ class OsInspector < Inspector
65
65
  os = get_os_from_os_release
66
66
 
67
67
  # Fall back to SuSE-release file
68
- if !os
68
+ unless os
69
69
  os = get_os_from_suse_release
70
70
  end
71
71
 
72
72
  # Fall back to redhat-release file
73
- if !os
73
+ unless os
74
74
  os = get_os_from_redhat_release
75
75
  end
76
76
 
@@ -80,7 +80,7 @@ class OsInspector < Inspector
80
80
  # check for freedesktop standard: /etc/os-release
81
81
  def get_os_from_os_release
82
82
  os_release = @system.read_file("/etc/os-release")
83
- return if !os_release
83
+ return unless os_release
84
84
 
85
85
  result = Hash.new
86
86
  key_value_pairs = Hash[os_release.split("\n").reject(&:empty?).map { |l| l.split("=") }]
@@ -124,7 +124,7 @@ class OsInspector < Inspector
124
124
  # checks for old suse standard: /etc/SuSE-release
125
125
  def get_os_from_suse_release
126
126
  suse_release = @system.read_file("/etc/SuSE-release")
127
- return if !suse_release
127
+ return unless suse_release
128
128
 
129
129
  result = Hash.new
130
130
  # name is always the first line in /etc/SuSE-release
@@ -132,7 +132,7 @@ class OsInspector < Inspector
132
132
 
133
133
  result["patchlevel"] = nil
134
134
  suse_release.split("\n").slice(1, suse_release.length).each do |line|
135
- if !line.start_with?("#")
135
+ unless line.start_with?("#")
136
136
  key, value = line.split("=")
137
137
  result[key.strip.downcase] = value.strip
138
138
  end
@@ -155,7 +155,7 @@ class OsInspector < Inspector
155
155
  # checks for redhat standard: /etc/redhat-release
156
156
  def get_os_from_redhat_release
157
157
  redhat_release = @system.read_file("/etc/redhat-release")
158
- return if !redhat_release
158
+ return unless redhat_release
159
159
 
160
160
  result = Hash.new
161
161
  result["name"], result["version"] = redhat_release.split("\n").first.split(" release ")
@@ -26,6 +26,6 @@ class OsRenderer < Renderer
26
26
  end
27
27
 
28
28
  def display_name
29
- "Operating system"
29
+ "Operating System"
30
30
  end
31
31
  end
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+
4
+ "type": "object",
5
+ "required": ["name", "version", "architecture"],
6
+ "properties": {
7
+ "name": {
8
+ "type": ["string", "null"],
9
+ "minLength": 1
10
+ },
11
+ "version": {
12
+ "type": ["string", "null"],
13
+ "minLength": 1
14
+ },
15
+ "architecture": {
16
+ "type": ["string", "null"],
17
+ "minLength": 1
18
+ }
19
+ }
20
+ }
21
+
@@ -36,7 +36,7 @@ class PackagesInspector < Inspector
36
36
  end
37
37
 
38
38
  def summary
39
- "Found #{@description.packages.length} packages."
39
+ "Found #{Machinery.pluralize(@description.packages.length, "%d package")}."
40
40
  end
41
41
 
42
42
  private
@@ -0,0 +1,115 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "type": "object",
4
+ "required": [
5
+ "_elements"
6
+ ],
7
+ "oneOf": [
8
+ {
9
+ "properties": {
10
+ "_attributes": {
11
+ "type": "object",
12
+ "required": [
13
+ "package_system"
14
+ ],
15
+ "properties": {
16
+ "package_system": {
17
+ "enum": ["rpm"]
18
+ }
19
+ }
20
+ },
21
+ "_elements": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "object",
25
+ "required": [
26
+ "name",
27
+ "version",
28
+ "release",
29
+ "arch",
30
+ "vendor",
31
+ "checksum"
32
+ ],
33
+ "properties": {
34
+ "name": {
35
+ "type": "string",
36
+ "minLength": 1
37
+ },
38
+ "version": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ },
42
+ "release": {
43
+ "type": "string"
44
+ },
45
+ "arch": {
46
+ "type": "string",
47
+ "minLength": 1
48
+ },
49
+ "vendor": {
50
+ "type": "string"
51
+ },
52
+ "checksum": {
53
+ "type": "string",
54
+ "pattern": "^[a-f0-9]+$"
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ },
61
+ {
62
+ "properties": {
63
+ "_attributes": {
64
+ "type": "object",
65
+ "required": [
66
+ "package_system"
67
+ ],
68
+ "properties": {
69
+ "package_system": {
70
+ "enum": ["dpkg"]
71
+ }
72
+ }
73
+ },
74
+ "_elements": {
75
+ "type": "array",
76
+ "items": {
77
+ "type": "object",
78
+ "required": [
79
+ "name",
80
+ "version",
81
+ "release",
82
+ "arch",
83
+ "vendor",
84
+ "checksum"
85
+ ],
86
+ "properties": {
87
+ "name": {
88
+ "type": "string",
89
+ "minLength": 1
90
+ },
91
+ "version": {
92
+ "type": "string",
93
+ "minLength": 1
94
+ },
95
+ "release": {
96
+ "type": "string"
97
+ },
98
+ "arch": {
99
+ "type": "string",
100
+ "minLength": 1
101
+ },
102
+ "vendor": {
103
+ "type": "string"
104
+ },
105
+ "checksum": {
106
+ "type": "string",
107
+ "pattern": "^[a-f0-9]*$"
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ ]
115
+ }
@@ -2,8 +2,10 @@
2
2
  :name: Patterns
3
3
  :initials: pt
4
4
  :description: |
5
- Contains all patterns installed on the inspected system. A pattern is a
6
- collection of software packages.
5
+ Contains all patterns or tasks installed on the inspected system. A pattern is a
6
+ collection of software packages, similar to the idea of tasks on Debian/Ubuntu-
7
+ like systems.
7
8
  The meaning of software patterns depends on the package manager of the
8
9
  distribution. Therefore, the pattern scope on SUSE based systems uses the
9
- `zypper` command to obtain the information about installed pattern names.
10
+ `zypper` command to obtain the information about installed pattern names, whereas
11
+ on Debian based systems the `tasksel` tool is necessary to list installed tasks.
@@ -28,24 +28,25 @@ class PatternsInspector < Inspector
28
28
  inspect_with_zypper
29
29
  elsif @system.has_command?("dpkg")
30
30
  if @system.has_command?("tasksel")
31
+ Machinery::Ui.puts "Note: Tasks on Debian-like systems are treated as patterns."
31
32
  @patterns_supported = true
32
33
  inspect_with_tasksel
33
34
  else
34
35
  @patterns_supported = false
35
- @status = "For a patterns inspection please install the package tasksel " \
36
+ @status = "For a patterns (tasks) inspection please install the package tasksel " \
36
37
  "on the inspected system."
37
38
  @description.patterns = PatternsScope.new
38
39
  end
39
40
  else
40
41
  @patterns_supported = false
41
- @status = "Patterns are not supported on this system."
42
+ @status = "Patterns or tasks are not supported on this system."
42
43
  @description.patterns = PatternsScope.new
43
44
  end
44
45
  end
45
46
 
46
47
  def summary
47
48
  if @patterns_supported
48
- "Found #{@description.patterns.count} patterns."
49
+ "Found #{Machinery.pluralize(@description.patterns.count, "%d pattern")}."
49
50
  else
50
51
  @status
51
52
  end
@@ -20,7 +20,11 @@ class PatternsRenderer < Renderer
20
20
  return unless description.patterns
21
21
 
22
22
  if description.patterns.empty?
23
- puts "There are no patterns."
23
+ puts "There are no patterns or tasks."
24
+ end
25
+
26
+ if description.packages && description.packages.package_system == "dpkg"
27
+ puts "Note: Tasks on Debian-like systems are treated as patterns."
24
28
  end
25
29
 
26
30
  list do
@@ -0,0 +1,58 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+
4
+ "type": "object",
5
+ "required": [
6
+ "_elements"
7
+ ],
8
+ "properties": {
9
+ "_attributes": {
10
+ "type": "object"
11
+ },
12
+ "_elements": {
13
+ "oneof": [
14
+ {
15
+ "type": "array",
16
+ "items": {
17
+ "type": "object",
18
+ "required": [
19
+ "name",
20
+ "version",
21
+ "release"
22
+ ],
23
+ "properties": {
24
+ "name": {
25
+ "type": "string",
26
+ "minLength": 1
27
+ },
28
+ "version": {
29
+ "type": "string",
30
+ "minLength": 1
31
+ },
32
+ "release": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ }
36
+ }
37
+ }
38
+ },
39
+ {
40
+ "type": "array",
41
+ "items": {
42
+ "type": "object",
43
+ "required": [
44
+ "name"
45
+ ],
46
+ "properties": {
47
+ "name": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ }
51
+ }
52
+ }
53
+ }
54
+ ]
55
+ }
56
+ }
57
+ }
58
+
@@ -37,7 +37,8 @@ class RepositoriesInspector < Inspector
37
37
  end
38
38
 
39
39
  def summary
40
- "Found #{@description.repositories.size} repositories."
40
+ "Found " \
41
+ "#{Machinery.pluralize(@description.repositories.size, "%d repository", "%d repositories")}."
41
42
  end
42
43
 
43
44
  private
@@ -0,0 +1,165 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "type": "object",
4
+ "required": [
5
+ "_elements"
6
+ ],
7
+ "oneOf": [
8
+ {
9
+ "properties": {
10
+ "_attributes": {
11
+ "type": "object",
12
+ "required": [
13
+ "repository_system"
14
+ ],
15
+ "properties": {
16
+ "repository_system": {
17
+ "enum": ["zypp"]
18
+ }
19
+ }
20
+ },
21
+ "_elements": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "object",
25
+ "required": ["alias", "name", "url", "type", "enabled", "gpgcheck", "autorefresh", "priority"],
26
+ "properties": {
27
+ "alias": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "name": {
32
+ "type": "string",
33
+ "minLength": 1
34
+ },
35
+ "type": {
36
+ "enum": ["yast2", "rpm-md", "plaindir", null]
37
+ },
38
+ "url": {
39
+ "type": "string",
40
+ "format": "uri",
41
+ "minLength": 1
42
+ },
43
+ "enabled": {
44
+ "type": "boolean"
45
+ },
46
+ "autorefresh": {
47
+ "type": "boolean"
48
+ },
49
+ "gpgcheck": {
50
+ "type": "boolean"
51
+ },
52
+ "priority": {
53
+ "type": "integer",
54
+ "minimum": 1
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ },
61
+ {
62
+ "properties": {
63
+ "_attributes": {
64
+ "type": "object",
65
+ "required": [
66
+ "repository_system"
67
+ ],
68
+ "properties": {
69
+ "repository_system": {
70
+ "enum": ["yum"]
71
+ }
72
+ }
73
+ },
74
+ "_elements": {
75
+ "type": "array",
76
+ "items": {
77
+ "type": "object",
78
+ "required": ["alias", "name", "url", "type", "enabled", "gpgcheck", "gpgkey", "mirrorlist"],
79
+ "properties": {
80
+ "alias": {
81
+ "type": "string",
82
+ "minLength": 1
83
+ },
84
+ "mirrorlist": {
85
+ "type": "string"
86
+ },
87
+ "name": {
88
+ "type": "string",
89
+ "minLength": 1
90
+ },
91
+ "type": {
92
+ "enum": ["rpm-md", null]
93
+ },
94
+ "url": {
95
+ "type": "array",
96
+ "items": {
97
+ "type": "string",
98
+ "format": "url",
99
+ "minLength": 1
100
+ }
101
+ },
102
+ "enabled": {
103
+ "type": "boolean"
104
+ },
105
+ "gpgcheck": {
106
+ "type": "boolean"
107
+ },
108
+ "gpgkey": {
109
+ "type": "array",
110
+ "items": {
111
+ "type": "string",
112
+ "format": "url",
113
+ "minLength": 1
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ },
121
+ {
122
+ "properties": {
123
+ "_attributes": {
124
+ "type": "object",
125
+ "required": [
126
+ "repository_system"
127
+ ],
128
+ "properties": {
129
+ "repository_system": {
130
+ "enum": ["apt"]
131
+ }
132
+ }
133
+ },
134
+ "_elements": {
135
+ "type": "array",
136
+ "items": {
137
+ "type": "object",
138
+ "required": ["url", "type", "distribution", "components"],
139
+ "properties": {
140
+ "distribution": {
141
+ "type": "string",
142
+ "minLength": 1
143
+ },
144
+ "type": {
145
+ "enum": ["deb", "deb-src"]
146
+ },
147
+ "url": {
148
+ "type": "string",
149
+ "format": "uri",
150
+ "minLength": 1
151
+ },
152
+ "components": {
153
+ "type": "array",
154
+ "items": {
155
+ "type": "string",
156
+ "minLength": 1
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ ]
165
+ }