machinery-tool 1.12.0 → 1.13.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/NEWS +20 -0
- data/export_helpers/containerize_readme.md +28 -11
- data/html/comparison.html.haml +3 -3
- data/lib/build_task.rb +8 -6
- data/lib/cli.rb +69 -17
- data/lib/compare_task.rb +1 -1
- data/lib/config_base.rb +1 -1
- data/lib/config_task.rb +4 -1
- data/lib/containerize_task.rb +15 -1
- data/lib/containerized_app.rb +27 -0
- data/lib/hint.rb +18 -6
- data/lib/html.rb +17 -0
- data/lib/inspect_task.rb +6 -0
- data/lib/inspector.rb +2 -1
- data/lib/kiwi_config.rb +14 -1
- data/lib/logged_cheetah.rb +1 -20
- data/lib/machinery.rb +1 -0
- data/lib/remote_system.rb +2 -1
- data/lib/scope.rb +22 -2
- data/lib/serve_html_task.rb +1 -1
- data/lib/show_task.rb +1 -1
- data/lib/system.rb +6 -0
- data/lib/system_description.rb +4 -3
- data/lib/version.rb +1 -1
- data/lib/workload_mapper.rb +1 -0
- data/man/generated/machinery.1.gz +0 -0
- data/man/generated/machinery.1.html +16 -4
- data/plugins/changed_managed_files/schema/system-description-changed-managed-files.schema-v5.json +126 -0
- data/plugins/config_files/schema/system-description-config-files.schema-v5.json +126 -0
- data/plugins/environment/environment.md +1 -0
- data/plugins/environment/environment_inspector.rb +50 -0
- data/plugins/environment/environment_model.rb +22 -0
- data/plugins/environment/schema/system-description-environment.schema-v5.json +13 -0
- data/plugins/groups/schema/system-description-groups.schema-v5.json +30 -0
- data/plugins/os/os_model.rb +4 -0
- data/plugins/os/schema/system-description-os.schema-v5.json +21 -0
- data/plugins/packages/schema/system-description-packages.schema-v5.json +34 -0
- data/plugins/patterns/schema/system-description-patterns.schema-v5.json +24 -0
- data/plugins/repositories/schema/system-description-repositories.schema-v5.json +45 -0
- data/plugins/services/schema/system-description-services.schema-v5.json +30 -0
- data/plugins/unmanaged_files/schema/system-description-unmanaged-files.schema-v5.json +144 -0
- data/plugins/unmanaged_files/unmanaged_files_inspector.rb +45 -23
- data/plugins/users/schema/system-description-users.schema-v5.json +61 -0
- data/schema/migrations/migrate4to5.rb +28 -0
- data/schema/system-description-global.schema-v5.json +43 -0
- data/workload_mapper/docker-registry/clue.rb +14 -0
- data/workload_mapper/docker-registry/compose-template.yml +5 -0
- data/workload_mapper/docker-registry/container/Dockerfile +12 -0
- data/workload_mapper/mariadb/clue.rb +5 -0
- data/workload_mapper/mariadb/compose-template.yml +9 -0
- data/workload_mapper/mariadb/container/Dockerfile +13 -0
- data/workload_mapper/mariadb/container/scripts/config_mariadb.sh +49 -0
- data/workload_mapper/mariadb/container/scripts/start.sh +11 -0
- data/workload_mapper/rails/clue.rb +16 -0
- data/workload_mapper/rails/compose-template.yml +5 -0
- data/workload_mapper/rails/config/config/database.yml +7 -0
- data/workload_mapper/rails/container/Dockerfile +48 -0
- data/workload_mapper/rails/container/apache2/httpd.conf.local +5 -0
- data/workload_mapper/rails/container/apache2/listen.conf +1 -0
- data/workload_mapper/rails/container/apache2/rails_app_vhost.conf +13 -0
- data/workload_mapper/rails/container/apache2/sysconfig_apache2 +280 -0
- data/workload_mapper/rails/setup/setup.rb.erb +72 -0
- metadata +248 -214
data/lib/hint.rb
CHANGED
@@ -29,34 +29,46 @@ class Hint
|
|
29
29
|
"\nHint: #{send(method, options)}\n"
|
30
30
|
end
|
31
31
|
|
32
|
+
def program_name
|
33
|
+
if which_machinery == $PROGRAM_NAME
|
34
|
+
"machinery"
|
35
|
+
else
|
36
|
+
$PROGRAM_NAME
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
32
40
|
private
|
33
41
|
|
42
|
+
def which_machinery
|
43
|
+
`which machinery 2>/dev/null`.chomp
|
44
|
+
end
|
45
|
+
|
34
46
|
def get_started(_options)
|
35
|
-
"You can get started by inspecting a system. Run:\n#{
|
47
|
+
"You can get started by inspecting a system. Run:\n#{program_name} inspect HOSTNAME"
|
36
48
|
end
|
37
49
|
|
38
50
|
def upgrade_format_force(options)
|
39
51
|
"To force an upgrade of system descriptions run:\n" \
|
40
|
-
"#{
|
52
|
+
"#{program_name} upgrade-format --force #{options[:name]}"
|
41
53
|
end
|
42
54
|
|
43
55
|
def show_data(options)
|
44
|
-
"To show the data of the system you just inspected run:\n#{
|
56
|
+
"To show the data of the system you just inspected run:\n#{program_name} show #{options[:name]}"
|
45
57
|
end
|
46
58
|
|
47
59
|
def show_analyze_data(options)
|
48
60
|
"To show the config file diffs you just created run:\n" \
|
49
|
-
"#{
|
61
|
+
"#{program_name} show --scope config-files --show-diffs #{options[:name]}"
|
50
62
|
end
|
51
63
|
|
52
64
|
def do_complete_inspection(options)
|
53
65
|
"To do a full inspection containing all scopes and to extract files run:\n" \
|
54
|
-
"#{
|
66
|
+
"#{program_name} inspect #{options[:host]} --name #{options[:name]} --extract-files"
|
55
67
|
end
|
56
68
|
|
57
69
|
def upgrade_system_description(_options)
|
58
70
|
"To upgrade all system descriptions run:\n" \
|
59
|
-
"#{
|
71
|
+
"#{program_name} upgrade-format --all"
|
60
72
|
end
|
61
73
|
|
62
74
|
def share_html_contents(options)
|
data/lib/html.rb
CHANGED
@@ -43,6 +43,23 @@ EOF
|
|
43
43
|
servefailed_error = <<-EOF.chomp
|
44
44
|
Port #{Server.settings.port} is already in use.
|
45
45
|
Stop the already running server on port #{Server.settings.port} or specify a new port by using --port option.
|
46
|
+
EOF
|
47
|
+
raise Machinery::Errors::ServeFailed, servefailed_error
|
48
|
+
rescue SocketError => e
|
49
|
+
servefailed_error = <<-EOF.chomp
|
50
|
+
Cannot start server on #{opts[:ip]}:#{Server.settings.port}.
|
51
|
+
ERROR: #{e.message}
|
52
|
+
EOF
|
53
|
+
raise Machinery::Errors::ServeFailed, servefailed_error
|
54
|
+
rescue Errno::EADDRNOTAVAIL
|
55
|
+
servefailed_error = <<-EOF.chomp
|
56
|
+
The IP-Address #{opts[:ip]} is not available. Please choose a different IP-Address.
|
57
|
+
EOF
|
58
|
+
raise Machinery::Errors::ServeFailed, servefailed_error
|
59
|
+
rescue Errno::EACCES => e
|
60
|
+
servefailed_error = <<-EOF.chomp
|
61
|
+
You are not allowed to start the server on port #{Server.settings.port}. You need root privileges for ports between 2 and 1023!
|
62
|
+
ERROR: #{e.message}
|
46
63
|
EOF
|
47
64
|
raise Machinery::Errors::ServeFailed, servefailed_error
|
48
65
|
end
|
data/lib/inspect_task.rb
CHANGED
@@ -70,6 +70,7 @@ class InspectTask
|
|
70
70
|
else
|
71
71
|
host = system.host
|
72
72
|
end
|
73
|
+
set_system_locale(system, description)
|
73
74
|
|
74
75
|
failed_inspections = {}
|
75
76
|
|
@@ -102,4 +103,9 @@ class InspectTask
|
|
102
103
|
|
103
104
|
return description, failed_inspections
|
104
105
|
end
|
106
|
+
|
107
|
+
def set_system_locale(system, description)
|
108
|
+
Inspector.for("environment").new(system, description).inspect
|
109
|
+
system.locale = description.environment.locale
|
110
|
+
end
|
105
111
|
end
|
data/lib/inspector.rb
CHANGED
@@ -67,9 +67,10 @@ class Inspector
|
|
67
67
|
def sort_scopes(scope_list)
|
68
68
|
scope_priority = {}
|
69
69
|
|
70
|
+
visible_scopes = Machinery::Scope.visible_scopes.map(&:scope_name)
|
70
71
|
scope_list.each do |scope|
|
71
72
|
inspector = self.for(scope)
|
72
|
-
next if !inspector
|
73
|
+
next if !inspector || !visible_scopes.include?(scope)
|
73
74
|
|
74
75
|
scope_priority[inspector.priority] = scope
|
75
76
|
end
|
data/lib/kiwi_config.rb
CHANGED
@@ -30,7 +30,7 @@ class KiwiConfig < Exporter
|
|
30
30
|
"os"
|
31
31
|
)
|
32
32
|
check_existance_of_extracted_files
|
33
|
-
|
33
|
+
check_repositories
|
34
34
|
generate_config
|
35
35
|
end
|
36
36
|
|
@@ -159,6 +159,19 @@ EOF
|
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
162
|
+
def check_repositories
|
163
|
+
if @system_description.repositories.empty?
|
164
|
+
raise(
|
165
|
+
Machinery::Errors::MissingRequirement.new(
|
166
|
+
"The scope 'repositories' of the system description doesn't contain a" \
|
167
|
+
" repository, which is necesarry for kiwi." \
|
168
|
+
" Please make sure that there is at least one accessible repository" \
|
169
|
+
" with all the required packages."
|
170
|
+
)
|
171
|
+
)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
162
175
|
def generate_config
|
163
176
|
@sh = <<EOF
|
164
177
|
test -f /.kconfig && . /.kconfig
|
data/lib/logged_cheetah.rb
CHANGED
@@ -18,28 +18,9 @@
|
|
18
18
|
class LoggedCheetah
|
19
19
|
class << self
|
20
20
|
def run(*args)
|
21
|
-
run_overloaded(*args, {})
|
22
|
-
end
|
23
|
-
|
24
|
-
def run_with_c(*args)
|
25
|
-
run_overloaded(*args, with_c_locale: true)
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def run_overloaded(*args, options)
|
31
21
|
command = args.select { |e| e.is_a?(String) }.join(" ")
|
32
22
|
Machinery.logger.info("Running '#{command}'")
|
33
|
-
|
34
|
-
if options[:with_c_locale]
|
35
|
-
with_c_locale do
|
36
|
-
Cheetah.run(*args)
|
37
|
-
end
|
38
|
-
else
|
39
|
-
with_utf8_locale do
|
40
|
-
Cheetah.run(*args)
|
41
|
-
end
|
42
|
-
end
|
23
|
+
Cheetah.run(*args)
|
43
24
|
end
|
44
25
|
end
|
45
26
|
end
|
data/lib/machinery.rb
CHANGED
@@ -106,6 +106,7 @@ require_relative "machinery_helper"
|
|
106
106
|
require_relative "workload_mapper"
|
107
107
|
require_relative "containerize_task"
|
108
108
|
require_relative "workload_mapper_dsl"
|
109
|
+
require_relative "containerized_app"
|
109
110
|
|
110
111
|
Dir[File.join(Machinery::ROOT, "plugins", "**", "*.rb")].each { |f| require(f) }
|
111
112
|
|
data/lib/remote_system.rb
CHANGED
@@ -74,7 +74,8 @@ class RemoteSystem < System
|
|
74
74
|
|
75
75
|
sudo = ["sudo", "-n"] if options[:privileged] && remote_user != "root"
|
76
76
|
cmds = [
|
77
|
-
"ssh", "#{remote_user}@#{host}",
|
77
|
+
"ssh", "#{remote_user}@#{host}", "-o", "LogLevel=ERROR", sudo, "LC_ALL=#{locale}",
|
78
|
+
*piped_args, options
|
78
79
|
].compact.flatten
|
79
80
|
cheetah_class.run(*cmds)
|
80
81
|
rescue Cheetah::ExecutionFailed => e
|
data/lib/scope.rb
CHANGED
@@ -18,6 +18,8 @@
|
|
18
18
|
module Machinery
|
19
19
|
module Scope
|
20
20
|
def self.included(mod)
|
21
|
+
mod.extend(ClassMethods)
|
22
|
+
|
21
23
|
@scopes ||= []
|
22
24
|
@scopes.push(mod)
|
23
25
|
end
|
@@ -26,6 +28,10 @@ module Machinery
|
|
26
28
|
@scopes
|
27
29
|
end
|
28
30
|
|
31
|
+
def self.visible_scopes
|
32
|
+
all_scopes.reject(&:hidden?)
|
33
|
+
end
|
34
|
+
|
29
35
|
def self.for(scope_name, json, scope_file_store)
|
30
36
|
all_scopes.each do |scope|
|
31
37
|
if scope.new.scope_name == scope_name
|
@@ -40,6 +46,21 @@ module Machinery
|
|
40
46
|
nil
|
41
47
|
end
|
42
48
|
|
49
|
+
module ClassMethods
|
50
|
+
def hidden?
|
51
|
+
@hidden || false
|
52
|
+
end
|
53
|
+
|
54
|
+
def hidden_scope
|
55
|
+
@hidden = true
|
56
|
+
end
|
57
|
+
|
58
|
+
def scope_name
|
59
|
+
scope = name.match(/^(.*)Scope$/)[1]
|
60
|
+
scope.gsub(/([^A-Z])([A-Z])/, "\\1_\\2").downcase
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
43
64
|
attr_accessor :meta
|
44
65
|
attr_accessor :scope_file_store
|
45
66
|
|
@@ -51,8 +72,7 @@ module Machinery
|
|
51
72
|
end
|
52
73
|
|
53
74
|
def scope_name
|
54
|
-
|
55
|
-
scope.gsub(/([^A-Z])([A-Z])/, "\\1_\\2").downcase
|
75
|
+
self.class.scope_name
|
56
76
|
end
|
57
77
|
|
58
78
|
def is_extractable?
|
data/lib/serve_html_task.rb
CHANGED
data/lib/show_task.rb
CHANGED
@@ -36,7 +36,7 @@ class ShowTask
|
|
36
36
|
|
37
37
|
Machinery::Ui.use_pager = false
|
38
38
|
Machinery::Ui.puts <<EOF
|
39
|
-
|
39
|
+
Trying to start a web server for serving the description on #{url}.
|
40
40
|
|
41
41
|
The server can be closed with Ctrl+C.
|
42
42
|
EOF
|
data/lib/system.rb
CHANGED
@@ -30,6 +30,8 @@ class System
|
|
30
30
|
abstract_method :inject_file
|
31
31
|
abstract_method :remove_file
|
32
32
|
|
33
|
+
attr_writer :locale
|
34
|
+
|
33
35
|
def self.for(host, remote_user = "root")
|
34
36
|
if host && host != "localhost"
|
35
37
|
RemoteSystem.new(host, remote_user)
|
@@ -96,4 +98,8 @@ class System
|
|
96
98
|
def arch
|
97
99
|
run_command("uname", "-m", stdout: :capture).chomp
|
98
100
|
end
|
101
|
+
|
102
|
+
def locale
|
103
|
+
@locale || "C"
|
104
|
+
end
|
99
105
|
end
|
data/lib/system_description.rb
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
# The sub directories storing the data for specific scopes are handled by the
|
27
27
|
# ScopeFileStore class.
|
28
28
|
class SystemDescription < Machinery::Object
|
29
|
-
CURRENT_FORMAT_VERSION =
|
29
|
+
CURRENT_FORMAT_VERSION = 5
|
30
30
|
EXTRACTABLE_SCOPES = [
|
31
31
|
"changed_managed_files",
|
32
32
|
"config_files",
|
@@ -218,11 +218,12 @@ class SystemDescription < Machinery::Object
|
|
218
218
|
end
|
219
219
|
|
220
220
|
def assert_scopes(*scopes)
|
221
|
-
missing = scopes.select { |scope| !self[scope]
|
221
|
+
missing = scopes.select { |scope| !self[scope] }
|
222
222
|
|
223
223
|
unless missing.empty?
|
224
224
|
raise Machinery::Errors::SystemDescriptionError.new(
|
225
|
-
"The system description misses the following
|
225
|
+
"The system description misses the following" \
|
226
|
+
" #{Machinery.pluralize(missing.size, "scope")} : #{missing.join(", ")}."
|
226
227
|
)
|
227
228
|
end
|
228
229
|
end
|
data/lib/version.rb
CHANGED
data/lib/workload_mapper.rb
CHANGED
@@ -26,6 +26,7 @@ class WorkloadMapper
|
|
26
26
|
compose_services = compose_services(workloads)
|
27
27
|
linked_services = link_compose_services(compose_services)
|
28
28
|
File.write(File.join(path, "docker-compose.yml"), linked_services.to_yaml)
|
29
|
+
linked_services
|
29
30
|
end
|
30
31
|
|
31
32
|
def link_compose_services(services)
|
Binary file
|
@@ -1014,8 +1014,14 @@ IP address and the port can be configured using the according options.</p>
|
|
1014
1014
|
<h3 id="OPTIONS">OPTIONS</h3>
|
1015
1015
|
|
1016
1016
|
<dl>
|
1017
|
-
<dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the system description: Default: 7585</p
|
1018
|
-
|
1017
|
+
<dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the system description: Default: 7585</p>
|
1018
|
+
|
1019
|
+
<p>Ports can be selected in a range between 2-65535. Ports between 2 and 1023 can only be
|
1020
|
+
chosen when <code>machinery</code> will be executed as <code>root</code> user.</p></dd>
|
1021
|
+
<dt><code>-i IP</code>, <code>--ip=IP</code> (optional)</dt><dd><p>Specify the IP address on which the web server will be made available. Default: 127.0.0.1</p>
|
1022
|
+
|
1023
|
+
<p>It's only possible to use an IP address (or hostnames resolving to an IP address) which
|
1024
|
+
is assigned to a network interface on the local machine.</p></dd>
|
1019
1025
|
</dl>
|
1020
1026
|
|
1021
1027
|
|
@@ -1067,8 +1073,14 @@ See the <a href="#Scopes" data-bare-link="true">Scope section</a> for more infor
|
|
1067
1073
|
for more information).</p></dd>
|
1068
1074
|
<dt><code>--html</code> (optional)</dt><dd><p>Run a web server and open the system description in HTML format in your web browser using the
|
1069
1075
|
<code>xdg-open</code> command.</p></dd>
|
1070
|
-
<dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the system description: Default: 7585</p
|
1071
|
-
|
1076
|
+
<dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the system description: Default: 7585</p>
|
1077
|
+
|
1078
|
+
<p>Ports can be selected in a range between 2-65535. Ports between 2 and 1023 can only be
|
1079
|
+
chosen when <code>machinery</code> will be executed as <code>root</code> user.</p></dd>
|
1080
|
+
<dt><code>-i IP</code>, <code>--ip=IP</code> (optional)</dt><dd><p>Specify the IP address on which the web server will be made available. Default: 127.0.0.1</p>
|
1081
|
+
|
1082
|
+
<p>It's only possible to use an IP address (or hostnames resolving to an IP address) which
|
1083
|
+
is assigned to a network interface on the local machine.</p></dd>
|
1072
1084
|
<dt><code>--verbose</code> (optional)</dt><dd><p>Display the filters which were applied before showing the system description.</p></dd>
|
1073
1085
|
</dl>
|
1074
1086
|
|
data/plugins/changed_managed_files/schema/system-description-changed-managed-files.schema-v5.json
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
3
|
+
|
4
|
+
"type": "object",
|
5
|
+
"required": ["extracted", "files"],
|
6
|
+
"properties": {
|
7
|
+
"extracted": {
|
8
|
+
"type": "boolean"
|
9
|
+
},
|
10
|
+
"files": {
|
11
|
+
"type": "array",
|
12
|
+
"items" : {
|
13
|
+
"type": "object",
|
14
|
+
"required": ["name", "package_name", "package_version"],
|
15
|
+
"properties": {
|
16
|
+
"name": {
|
17
|
+
"type": "string"
|
18
|
+
},
|
19
|
+
"package_name": {
|
20
|
+
"type": "string",
|
21
|
+
"minLength": 1
|
22
|
+
},
|
23
|
+
"package_version": {
|
24
|
+
"type": "string",
|
25
|
+
"minLength": 1
|
26
|
+
}
|
27
|
+
},
|
28
|
+
"oneOf": [
|
29
|
+
{ "$ref": "#/definitions/file_changed" },
|
30
|
+
{ "$ref": "#/definitions/file_error" }
|
31
|
+
]
|
32
|
+
}
|
33
|
+
}
|
34
|
+
},
|
35
|
+
"definitions": {
|
36
|
+
"file_changed": {
|
37
|
+
"required": ["status"],
|
38
|
+
"properties": {
|
39
|
+
"status": {
|
40
|
+
"enum": ["changed"]
|
41
|
+
}
|
42
|
+
},
|
43
|
+
"oneOf": [
|
44
|
+
{ "$ref": "#/definitions/file_changed_modified" },
|
45
|
+
{ "$ref": "#/definitions/link_changed_modified" },
|
46
|
+
{ "$ref": "#/definitions/file_changed_deleted" }
|
47
|
+
]
|
48
|
+
},
|
49
|
+
"file_changed_modified": {
|
50
|
+
"required": ["changes", "mode", "user", "group", "type"],
|
51
|
+
"properties": {
|
52
|
+
"changes": {
|
53
|
+
"type": "array",
|
54
|
+
"items": {
|
55
|
+
"enum": ["size", "mode", "md5", "device_number", "link_path", "user", "group", "time", "capabilities", "replaced", "other_rpm_changes"]
|
56
|
+
},
|
57
|
+
"minItems": 1
|
58
|
+
},
|
59
|
+
"mode": {
|
60
|
+
"type": "string",
|
61
|
+
"pattern": "^[0-7]{3,4}$"
|
62
|
+
},
|
63
|
+
"user": {
|
64
|
+
"type": "string",
|
65
|
+
"minLength": 1
|
66
|
+
},
|
67
|
+
"group": {
|
68
|
+
"type": "string",
|
69
|
+
"minLength": 1
|
70
|
+
},
|
71
|
+
"type": {
|
72
|
+
"enum": ["file", "dir"]
|
73
|
+
}
|
74
|
+
}
|
75
|
+
},
|
76
|
+
"link_changed_modified": {
|
77
|
+
"required": ["target", "changes", "mode", "user", "group", "type"],
|
78
|
+
"properties": {
|
79
|
+
"changes": {
|
80
|
+
"type": "array",
|
81
|
+
"items": {
|
82
|
+
"enum": ["size", "mode", "md5", "device_number", "link_path", "user", "group", "time", "capabilities", "replaced", "other_rpm_changes"]
|
83
|
+
},
|
84
|
+
"minItems": 1
|
85
|
+
},
|
86
|
+
"mode": {
|
87
|
+
"type": "string",
|
88
|
+
"pattern": "^[0-7]{3,4}$"
|
89
|
+
},
|
90
|
+
"user": {
|
91
|
+
"type": "string",
|
92
|
+
"minLength": 1
|
93
|
+
},
|
94
|
+
"group": {
|
95
|
+
"type": "string",
|
96
|
+
"minLength": 1
|
97
|
+
},
|
98
|
+
"type": {
|
99
|
+
"enum": ["link"]
|
100
|
+
},
|
101
|
+
"target": {
|
102
|
+
"type": "string"
|
103
|
+
}
|
104
|
+
}
|
105
|
+
},
|
106
|
+
"file_changed_deleted": {
|
107
|
+
"required": ["changes"],
|
108
|
+
"properties": {
|
109
|
+
"changes": {
|
110
|
+
"enum": [["deleted"]]
|
111
|
+
}
|
112
|
+
}
|
113
|
+
},
|
114
|
+
"file_error": {
|
115
|
+
"required": ["status", "error_message"],
|
116
|
+
"properties": {
|
117
|
+
"status": {
|
118
|
+
"enum": ["error"]
|
119
|
+
},
|
120
|
+
"error_message": {
|
121
|
+
"type": "string"
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|