machinery-tool 1.12.0 → 1.13.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|