foreman_templates 6.0.3 → 7.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/app/controllers/concerns/foreman/controller/parameters/template_params.rb +20 -4
- data/app/controllers/template_syncs_controller.rb +13 -0
- data/app/controllers/ui_template_syncs_controller.rb +48 -0
- data/app/helpers/foreman_templates_helper.rb +10 -0
- data/app/models/setting/template_sync.rb +50 -3
- data/app/services/foreman_templates/action.rb +16 -4
- data/app/services/foreman_templates/export_result.rb +1 -0
- data/app/services/foreman_templates/parse_result.rb +10 -2
- data/app/services/foreman_templates/path_access_exception.rb +4 -0
- data/app/services/foreman_templates/template_exporter.rb +13 -8
- data/app/services/foreman_templates/template_importer.rb +3 -1
- data/app/views/template_sync_settings/show.json.rabl +11 -0
- data/app/views/template_syncs/index.html.erb +20 -0
- data/app/views/ui_template_syncs/export.json.rabl +9 -0
- data/app/views/ui_template_syncs/import.json.rabl +9 -0
- data/app/views/ui_template_syncs/sync_settings.json.rabl +11 -0
- data/app/views/ui_template_syncs/template_attrs.json.rabl +19 -0
- data/app/views/ui_template_syncs/template_export_result.rabl +7 -0
- data/app/views/ui_template_syncs/template_export_results.json.rabl +3 -0
- data/app/views/ui_template_syncs/template_import_result.json.rabl +7 -0
- data/app/views/ui_template_syncs/template_import_results.json.rabl +3 -0
- data/config/routes.rb +13 -1
- data/lib/foreman_templates/engine.rb +23 -3
- data/lib/foreman_templates/version.rb +1 -1
- data/lib/tasks/foreman_templates_tasks.rake +0 -2
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63fe0a1d25d54d0f50a328051d90f5df2ace0aa4
|
4
|
+
data.tar.gz: 430fbe5dfccd63f678dbb50d72cac11c124c8326
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c57bc9dc48fd3f5b786f05d381ba9b81c3d61a47668b001e6ddcc0565f70b3b31161b27efa2cf41fef57982c6cafb47d2fb411f41bc1b598a06f8f0c76647e32
|
7
|
+
data.tar.gz: 2cff0a4e2a51fff6fc662ae11c30a4b77de1ab34dc11a3f1c93131244a6d7784a8181c23ad3aec4990da7bc5d035c4e622495106cfac12e21544077d7077c18b
|
@@ -25,14 +25,30 @@ module Foreman
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def ui_template_import_params
|
29
|
+
base_import_params :ui_template_sync
|
30
|
+
end
|
31
|
+
|
32
|
+
def ui_template_export_params
|
33
|
+
base_export_params :ui_template_sync
|
34
|
+
end
|
35
|
+
|
28
36
|
def template_import_params
|
29
|
-
add_taxonomy_params(
|
30
|
-
.filter_params(params, parameter_filter_context, :none).with_indifferent_access)
|
37
|
+
add_taxonomy_params(base_import_params(:none))
|
31
38
|
end
|
32
39
|
|
33
40
|
def template_export_params
|
34
|
-
add_taxonomy_params(
|
35
|
-
|
41
|
+
add_taxonomy_params(base_export_params(:none))
|
42
|
+
end
|
43
|
+
|
44
|
+
def base_import_params(toplevel_key)
|
45
|
+
self.class.template_params_filter(self.class.extra_import_params)
|
46
|
+
.filter_params(params, parameter_filter_context, toplevel_key).with_indifferent_access
|
47
|
+
end
|
48
|
+
|
49
|
+
def base_export_params(toplevel_key)
|
50
|
+
self.class.template_params_filter(self.class.extra_export_params)
|
51
|
+
.filter_params(params, parameter_filter_context, toplevel_key).with_indifferent_access
|
36
52
|
end
|
37
53
|
|
38
54
|
def organization_params
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
class UiTemplateSyncsController < ApplicationController
|
4
|
+
include ::Foreman::Controller::Parameters::TemplateParams
|
5
|
+
|
6
|
+
rescue_from ::ForemanTemplates::PathAccessException do |error|
|
7
|
+
render_errors [error.message]
|
8
|
+
end
|
9
|
+
|
10
|
+
def sync_settings
|
11
|
+
import_settings = Setting.where :name => Setting::TemplateSync.import_setting_names(['verbose'])
|
12
|
+
export_settings = Setting.where :name => Setting::TemplateSync.export_setting_names(['verbose'])
|
13
|
+
@results = OpenStruct.new(:import => import_settings, :export => export_settings)
|
14
|
+
end
|
15
|
+
|
16
|
+
def import
|
17
|
+
@parse_result = OpenStruct.new ForemanTemplates::TemplateImporter.new(ui_template_import_params).import!
|
18
|
+
end
|
19
|
+
|
20
|
+
def export
|
21
|
+
@result = ForemanTemplates::TemplateExporter.new(ui_template_export_params).export!
|
22
|
+
|
23
|
+
if @result.error
|
24
|
+
render_errors [@result.error]
|
25
|
+
end
|
26
|
+
|
27
|
+
if @result.warning
|
28
|
+
render_errors [@result.warning], 'warning'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def action_permission
|
33
|
+
case params[:action]
|
34
|
+
when 'sync_settings'
|
35
|
+
:view_template_syncs
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def parameter_filter_context
|
42
|
+
Foreman::ParameterFilter::Context.new(:api, controller_name, params[:action])
|
43
|
+
end
|
44
|
+
|
45
|
+
def render_errors(messages, severity = 'danger')
|
46
|
+
render :json => { :error => { :errors => { :base => messages }, :severity => severity } }, :status => :unprocessable_entity
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module ForemanTemplatesHelper
|
2
|
+
def edit_paths
|
3
|
+
Template.subclasses.reduce({}) do |memo, subclass|
|
4
|
+
memo.tap do |acc|
|
5
|
+
path_part = "#{subclass.name.underscore.pluralize}_path"
|
6
|
+
acc[subclass.name] = "#{Rails.application.routes.url_helpers.public_send(path_part)}/:id/edit"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -1,5 +1,35 @@
|
|
1
1
|
class Setting
|
2
2
|
class TemplateSync < ::Setting
|
3
|
+
self.include_root_in_json = false
|
4
|
+
|
5
|
+
def self.common_stripped_names
|
6
|
+
%w(verbose repo branch dir filter negate)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.import_stripped_names
|
10
|
+
%w(prefix associate force)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.export_stripped_names
|
14
|
+
%w(metadata_export_mode)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.import_setting_names(except = [])
|
18
|
+
map_prefix omit_settings(common_stripped_names + import_stripped_names, except)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.export_setting_names(except = [])
|
22
|
+
map_prefix omit_settings(common_stripped_names + export_stripped_names, except)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.map_prefix(stripped_names)
|
26
|
+
stripped_names.map { |item| "template_sync_#{item}" }
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.omit_settings(setting_names, except_array)
|
30
|
+
setting_names.reject { |name| except_array.include? name }
|
31
|
+
end
|
32
|
+
|
3
33
|
def self.associate_types
|
4
34
|
{
|
5
35
|
'always' => _('Always'),
|
@@ -16,6 +46,17 @@ class Setting
|
|
16
46
|
}
|
17
47
|
end
|
18
48
|
|
49
|
+
def short_name
|
50
|
+
name.split('template_sync_').last
|
51
|
+
end
|
52
|
+
|
53
|
+
def selection
|
54
|
+
selection_method = name.split('template_sync_').last.concat('_types')
|
55
|
+
return transformed_selection(selection_method) if self.class.respond_to?(selection_method)
|
56
|
+
|
57
|
+
[]
|
58
|
+
end
|
59
|
+
|
19
60
|
def self.load_defaults
|
20
61
|
return unless super
|
21
62
|
|
@@ -28,11 +69,11 @@ class Setting
|
|
28
69
|
self.set('template_sync_associate', N_('Associate templates to OS, organization and location'), 'new', N_('Associate'), nil, { :collection => Proc.new { self.associate_types } }),
|
29
70
|
self.set('template_sync_prefix', N_('The string all imported templates should begin with'), "", N_('Prefix')),
|
30
71
|
self.set('template_sync_dirname', N_('The directory within the Git repo containing the templates'), '/', N_('Dirname')),
|
31
|
-
self.set('template_sync_filter', N_('Import or export names matching this regex (case-insensitive; snippets are not filtered)'),
|
72
|
+
self.set('template_sync_filter', N_('Import or export names matching this regex (case-insensitive; snippets are not filtered)'), '', N_('Filter')),
|
32
73
|
self.set('template_sync_repo', N_('Target path to import and export. Different protocols can be used, e.g. /tmp/dir, git://example.com, https://example.com, ssh://example.com'), 'https://github.com/theforeman/community-templates.git', N_('Repo')),
|
33
74
|
self.set('template_sync_negate', N_('Negate the prefix (for purging) / filter (for importing/exporting)'), false, N_('Negate')),
|
34
|
-
self.set('template_sync_branch', N_('Default branch in Git repo'),
|
35
|
-
self.set('template_sync_metadata_export_mode', N_('Default metadata export mode, refresh re-renders metadata, keep will keep existing metadata, remove exports template
|
75
|
+
self.set('template_sync_branch', N_('Default branch in Git repo'), '', N_('Branch')),
|
76
|
+
self.set('template_sync_metadata_export_mode', N_('Default metadata export mode, refresh re-renders metadata, keep will keep existing metadata, remove exports template without metadata'), 'refresh', N_('Metadata export mode'), nil, { :collection => Proc.new { self.metadata_export_mode_types } }),
|
36
77
|
self.set('template_sync_force', N_('Should importing overwrite locked templates?'), false, N_('Force import')),
|
37
78
|
self.set('template_sync_lock', N_('Should importing lock templates?'), false, N_('Lock templates')),
|
38
79
|
].compact.each { |s| self.create! s.update(:category => "Setting::TemplateSync") }
|
@@ -54,5 +95,11 @@ class Setting
|
|
54
95
|
record.errors[:base] << (_("template_sync_metadata_export_mode must be one of %s") % values.join(', '))
|
55
96
|
end
|
56
97
|
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def transformed_selection(selection_method)
|
102
|
+
self.class.public_send(selection_method).map { |key, translated| { :value => key, :label => translated } }
|
103
|
+
end
|
57
104
|
end
|
58
105
|
end
|
@@ -2,6 +2,18 @@ module ForemanTemplates
|
|
2
2
|
class Action
|
3
3
|
delegate :logger, :to => :Rails
|
4
4
|
|
5
|
+
def self.git_repo_start_with
|
6
|
+
%w{http:// https:// git:// ssh:// git+ssh:// ssh+git://}
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.file_repo_start_with
|
10
|
+
['/']
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.repo_start_with
|
14
|
+
git_repo_start_with + file_repo_start_with
|
15
|
+
end
|
16
|
+
|
5
17
|
def self.setting_overrides
|
6
18
|
%i(verbose prefix dirname filter repo negate branch)
|
7
19
|
end
|
@@ -25,7 +37,7 @@ module ForemanTemplates
|
|
25
37
|
end
|
26
38
|
|
27
39
|
def git_repo?
|
28
|
-
@repo.start_with?(
|
40
|
+
@repo.start_with?(*self.class.git_repo_start_with)
|
29
41
|
end
|
30
42
|
|
31
43
|
def get_absolute_repo_path
|
@@ -33,9 +45,9 @@ module ForemanTemplates
|
|
33
45
|
end
|
34
46
|
|
35
47
|
def verify_path!(path)
|
36
|
-
msg = _("Using file-based synchronization, but couldn't access %s
|
37
|
-
msg += _("Please check the access permissions/SELinux and make sure it is writable for the web application user account, typically 'foreman'.")
|
38
|
-
raise msg unless Dir.exist?(path)
|
48
|
+
msg = _("Using file-based synchronization, but couldn't access %s. ") % path
|
49
|
+
msg += _("Please check the access permissions/SELinux and make sure it is readable/writable for the web application user account, typically 'foreman'.")
|
50
|
+
raise PathAccessException, msg unless Dir.exist?(path)
|
39
51
|
end
|
40
52
|
|
41
53
|
private
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ForemanTemplates
|
2
2
|
class ParseResult
|
3
3
|
attr_accessor :name, :template
|
4
|
-
attr_reader :imported, :diff, :exception, :additional_errors
|
4
|
+
attr_reader :imported, :diff, :exception, :additional_errors, :template_file, :additional_info
|
5
5
|
|
6
6
|
def initialize(template_file)
|
7
7
|
@template_file = template_file.split('/').last
|
@@ -34,7 +34,7 @@ module ForemanTemplates
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def matching_filter
|
37
|
-
|
37
|
+
generic_info "Skipping, 'name' filtered out based on 'filter' and 'negate' settings"
|
38
38
|
end
|
39
39
|
|
40
40
|
def no_metadata_name
|
@@ -63,6 +63,13 @@ module ForemanTemplates
|
|
63
63
|
self
|
64
64
|
end
|
65
65
|
|
66
|
+
def generic_info(additional_msg)
|
67
|
+
@imported = false
|
68
|
+
@additional_info = additional_msg
|
69
|
+
Logging.logger('app').debug "Not importing #{@template_file}: #{additional_msg}"
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
66
73
|
def name_error(exception, template_type)
|
67
74
|
@imported = false
|
68
75
|
@exception = exception
|
@@ -72,6 +79,7 @@ module ForemanTemplates
|
|
72
79
|
|
73
80
|
def determine_result_diff
|
74
81
|
return if @template.nil? || !@template.template_changed?
|
82
|
+
|
75
83
|
template_was = @template.template_was
|
76
84
|
template_is = @template.template
|
77
85
|
@diff = calculate_diff(template_was, template_is)
|
@@ -27,6 +27,7 @@ module ForemanTemplates
|
|
27
27
|
def export_to_git
|
28
28
|
@dir = Dir.mktmpdir
|
29
29
|
return @export_result if branch_missing?
|
30
|
+
|
30
31
|
git_repo = Git.clone(@repo, @dir)
|
31
32
|
logger.debug "cloned '#{@repo}' to '#{@dir}'"
|
32
33
|
|
@@ -67,15 +68,19 @@ module ForemanTemplates
|
|
67
68
|
|
68
69
|
def dump_files!
|
69
70
|
templates = templates_to_dump
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
71
|
+
begin
|
72
|
+
templates.map do |template|
|
73
|
+
current_dir = get_dump_dir(template)
|
74
|
+
FileUtils.mkdir_p current_dir
|
75
|
+
filename = File.join(current_dir, get_template_filename(template))
|
76
|
+
File.open(filename, 'w+') do |file|
|
77
|
+
logger.debug "Writing to file #{filename}"
|
78
|
+
bytes = file.write template.public_send(export_method)
|
79
|
+
logger.debug "finished writing #{bytes}"
|
80
|
+
end
|
78
81
|
end
|
82
|
+
rescue StandardError => e
|
83
|
+
raise PathAccessException, e.message
|
79
84
|
end
|
80
85
|
@export_result.add_exported_templates templates
|
81
86
|
end
|
@@ -7,7 +7,7 @@ module ForemanTemplates
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def initialize(args = {})
|
10
|
-
super
|
10
|
+
super args
|
11
11
|
@verbose = parse_bool(@verbose)
|
12
12
|
@force = parse_bool(@force)
|
13
13
|
@lock = parse_bool(@lock)
|
@@ -62,6 +62,7 @@ module ForemanTemplates
|
|
62
62
|
|
63
63
|
begin
|
64
64
|
next unless (template_type = template_model(metadata, parse_result))
|
65
|
+
|
65
66
|
template = template_type.import_without_save(name, text, import_options)
|
66
67
|
parse_result.template = template
|
67
68
|
parse_result.determine_result_diff
|
@@ -128,6 +129,7 @@ module ForemanTemplates
|
|
128
129
|
def name_matching_filter?(name)
|
129
130
|
matching = name.match(/#{@filter}/i)
|
130
131
|
return !matching if @negate
|
132
|
+
|
131
133
|
matching
|
132
134
|
end
|
133
135
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%= webpacked_plugins_js_for :foreman_templates %>
|
2
|
+
<%= webpacked_plugins_css_for :foreman_templates %>
|
3
|
+
|
4
|
+
<div id="foreman-templates"/>
|
5
|
+
|
6
|
+
<%= mount_react_component('ForemanTemplates',
|
7
|
+
'#foreman-templates',
|
8
|
+
{ :apiUrls => {
|
9
|
+
:exportUrl => export_ui_template_syncs_path,
|
10
|
+
:syncSettingsUrl => sync_settings_ui_template_syncs_path,
|
11
|
+
:importUrl => import_ui_template_syncs_path
|
12
|
+
},
|
13
|
+
:validationData => { :repo => ForemanTemplates::Action.repo_start_with },
|
14
|
+
:editPaths => edit_paths,
|
15
|
+
:fileRepoStartWith => ForemanTemplates::Action.file_repo_start_with,
|
16
|
+
:userPermissions => {
|
17
|
+
:import => authorized_for(:controller => :ui_template_syncs, :action => :import),
|
18
|
+
:export => authorized_for(:controller => :ui_template_syncs, :action => :export)
|
19
|
+
}
|
20
|
+
}.to_json )%>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
object @template
|
2
|
+
|
3
|
+
attributes :id, :snippet, :locked
|
4
|
+
|
5
|
+
node(:kind) do |template|
|
6
|
+
template.template_kind.name if template.respond_to?(:template_kind) && template.template_kind
|
7
|
+
end
|
8
|
+
|
9
|
+
node(:class_name) do |template|
|
10
|
+
template.class.name
|
11
|
+
end
|
12
|
+
|
13
|
+
node(:humanized_class_name) do |template|
|
14
|
+
template.class.name.underscore.split('_').map { |part| part.capitalize }.join(' ')
|
15
|
+
end
|
16
|
+
|
17
|
+
node(:can_edit) do |template|
|
18
|
+
authorized_for(:auth_object => template, :authorizer => authorizer, :permission => "edit_#{template.class.name.underscore.pluralize}")
|
19
|
+
end
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
|
+
resources :template_syncs, :only => [:index]
|
3
|
+
|
4
|
+
resources :ui_template_syncs, :only => [] do
|
5
|
+
collection do
|
6
|
+
get 'sync_settings'
|
7
|
+
post 'import'
|
8
|
+
post 'export'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
match '/template_syncs/*page' => 'template_syncs#index', :via => [:get]
|
13
|
+
|
2
14
|
namespace :api, :defaults => { :format => 'json' } do
|
3
|
-
scope "(:apiv)", :module => :v2, :defaults => { :apiv => 'v2' }, :apiv => /
|
15
|
+
scope "(:apiv)", :module => :v2, :defaults => { :apiv => 'v2' }, :apiv => /v2/, :constraints => ApiConstraints.new(:version => 2, :default => true) do
|
4
16
|
resources :templates, :controller => :template, :only => [] do
|
5
17
|
collection do
|
6
18
|
post 'import'
|
@@ -2,6 +2,7 @@ require 'fileutils'
|
|
2
2
|
require 'yaml'
|
3
3
|
require 'diffy'
|
4
4
|
require 'git'
|
5
|
+
require 'rabl'
|
5
6
|
|
6
7
|
module ForemanTemplates
|
7
8
|
# Inherit from the Rails module of the parent app (Foreman), not the plugin.
|
@@ -13,21 +14,40 @@ module ForemanTemplates
|
|
13
14
|
require_dependency File.expand_path('../../app/models/setting/template_sync.rb', __dir__) if (Setting.table_exists? rescue(false))
|
14
15
|
end
|
15
16
|
|
17
|
+
initializer "foreman_templates.add_rabl_view_path" do
|
18
|
+
Rabl.configure do |config|
|
19
|
+
config.view_paths << ForemanTemplates::Engine.root.join('app', 'views')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
16
23
|
initializer 'foreman_templates.register_plugin', :before => :finisher_hook do
|
17
24
|
Foreman::Plugin.register :foreman_templates do
|
18
|
-
requires_foreman '>= 1.
|
25
|
+
requires_foreman '>= 1.24'
|
19
26
|
|
20
27
|
apipie_documented_controllers ["#{ForemanTemplates::Engine.root}/app/controllers/api/v2/*.rb"]
|
21
28
|
|
22
29
|
security_block :templates do
|
23
30
|
permission :import_templates, {
|
24
|
-
:"api/v2/template" => [:import]
|
31
|
+
:"api/v2/template" => [:import],
|
32
|
+
:ui_template_syncs => [:import]
|
25
33
|
}, :resource_type => 'Template'
|
26
34
|
permission :export_templates, {
|
27
|
-
:"api/v2/template" => [:export]
|
35
|
+
:"api/v2/template" => [:export],
|
36
|
+
:ui_template_syncs => [:export]
|
37
|
+
}, :resource_type => 'Template'
|
38
|
+
permission :view_template_syncs, {
|
39
|
+
:ui_template_syncs => [:sync_settings],
|
40
|
+
:template_syncs => [:index]
|
28
41
|
}, :resource_type => 'Template'
|
29
42
|
end
|
30
43
|
add_all_permissions_to_default_roles
|
44
|
+
|
45
|
+
menu :top_menu, :template_sync,
|
46
|
+
:url_hash => { :controller => :template_syncs, :action => :index },
|
47
|
+
:caption => N_('Sync Templates'),
|
48
|
+
:parent => :hosts_menu,
|
49
|
+
:before => :ptables,
|
50
|
+
:turbolinks => false
|
31
51
|
end
|
32
52
|
end
|
33
53
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'pp'
|
2
2
|
# Tasks
|
3
|
-
# rubocop:disable Metrics/BlockLength
|
4
3
|
namespace :templates do
|
5
4
|
desc 'Import templates according to settings'
|
6
5
|
task :import => :environment do
|
@@ -72,7 +71,6 @@ namespace :templates do
|
|
72
71
|
puts 'Clean up finished, you can now remove the plugin from your system'
|
73
72
|
end
|
74
73
|
end
|
75
|
-
# rubocop:enable Metrics/BlockLength
|
76
74
|
|
77
75
|
# Tests
|
78
76
|
namespace :test do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Sutcliffe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: diffy
|
@@ -65,13 +65,27 @@ files:
|
|
65
65
|
- Rakefile
|
66
66
|
- app/controllers/api/v2/template_controller.rb
|
67
67
|
- app/controllers/concerns/foreman/controller/parameters/template_params.rb
|
68
|
+
- app/controllers/template_syncs_controller.rb
|
69
|
+
- app/controllers/ui_template_syncs_controller.rb
|
70
|
+
- app/helpers/foreman_templates_helper.rb
|
68
71
|
- app/models/setting/template_sync.rb
|
69
72
|
- app/services/foreman_templates/action.rb
|
70
73
|
- app/services/foreman_templates/cleaner.rb
|
71
74
|
- app/services/foreman_templates/export_result.rb
|
72
75
|
- app/services/foreman_templates/parse_result.rb
|
76
|
+
- app/services/foreman_templates/path_access_exception.rb
|
73
77
|
- app/services/foreman_templates/template_exporter.rb
|
74
78
|
- app/services/foreman_templates/template_importer.rb
|
79
|
+
- app/views/template_sync_settings/show.json.rabl
|
80
|
+
- app/views/template_syncs/index.html.erb
|
81
|
+
- app/views/ui_template_syncs/export.json.rabl
|
82
|
+
- app/views/ui_template_syncs/import.json.rabl
|
83
|
+
- app/views/ui_template_syncs/sync_settings.json.rabl
|
84
|
+
- app/views/ui_template_syncs/template_attrs.json.rabl
|
85
|
+
- app/views/ui_template_syncs/template_export_result.rabl
|
86
|
+
- app/views/ui_template_syncs/template_export_results.json.rabl
|
87
|
+
- app/views/ui_template_syncs/template_import_result.json.rabl
|
88
|
+
- app/views/ui_template_syncs/template_import_results.json.rabl
|
75
89
|
- config/routes.rb
|
76
90
|
- lib/foreman_templates.rb
|
77
91
|
- lib/foreman_templates/engine.rb
|
@@ -79,7 +93,7 @@ files:
|
|
79
93
|
- lib/tasks/foreman_templates_tasks.rake
|
80
94
|
homepage: https://github.com/theforeman/foreman_templates
|
81
95
|
licenses:
|
82
|
-
- GPL-3
|
96
|
+
- GPL-3.0
|
83
97
|
metadata: {}
|
84
98
|
post_install_message:
|
85
99
|
rdoc_options: []
|
@@ -97,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
111
|
version: '0'
|
98
112
|
requirements: []
|
99
113
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.6.
|
114
|
+
rubygems_version: 2.6.14
|
101
115
|
signing_key:
|
102
116
|
specification_version: 4
|
103
117
|
summary: Template-syncing engine for Foreman
|