foreman_content 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +113 -0
- data/Rakefile +111 -0
- data/app/assets/javascripts/content/content.js +12 -0
- data/app/assets/stylesheets/content/application.css +13 -0
- data/app/controllers/content/api/repositories_controller.rb +27 -0
- data/app/controllers/content/gpg_keys_controller.rb +42 -0
- data/app/controllers/content/products_controller.rb +51 -0
- data/app/controllers/content/repositories_controller.rb +57 -0
- data/app/helpers/content/application_helper.rb +5 -0
- data/app/helpers/content/repositories_helper.rb +56 -0
- data/app/models/content/custom_repository_paths.rb +27 -0
- data/app/models/content/environment_product.rb +19 -0
- data/app/models/content/gpg_key.rb +32 -0
- data/app/models/content/host_product.rb +20 -0
- data/app/models/content/hostgroup_product.rb +19 -0
- data/app/models/content/operatingsystem_repository.rb +19 -0
- data/app/models/content/orchestration/pulp.rb +93 -0
- data/app/models/content/product.rb +28 -0
- data/app/models/content/product_operatingsystem.rb +19 -0
- data/app/models/content/remote/pulp/repository.rb +46 -0
- data/app/models/content/repository.rb +70 -0
- data/app/models/content/validators/content_validator.rb +25 -0
- data/app/models/content/validators/description_format.rb +24 -0
- data/app/models/content/validators/name_format.rb +40 -0
- data/app/models/content/validators/no_trailing_space.rb +27 -0
- data/app/models/setting/content.rb +42 -0
- data/app/overrides/add_host_conent_tab.rb +9 -0
- data/app/overrides/add_hostgroup_conent_tab.rb +9 -0
- data/app/overrides/add_os_conent_tab.rb +9 -0
- data/app/services/content/pulp_event_handler.rb +25 -0
- data/app/views/content/gpg_keys/_form.html.erb +8 -0
- data/app/views/content/gpg_keys/edit.html.erb +3 -0
- data/app/views/content/gpg_keys/index.html.erb +20 -0
- data/app/views/content/gpg_keys/new.html.erb +3 -0
- data/app/views/content/products/_form.html.erb +26 -0
- data/app/views/content/products/_form_tab.html.erb +3 -0
- data/app/views/content/products/_host_tab_pane.html.erb +5 -0
- data/app/views/content/products/_hostgroup_tab_pane.html.erb +5 -0
- data/app/views/content/products/_operatingsystem_tab_pane.html.erb +5 -0
- data/app/views/content/products/edit.html.erb +3 -0
- data/app/views/content/products/index.html.erb +27 -0
- data/app/views/content/products/new.html.erb +3 -0
- data/app/views/content/products/welcome.html.erb +8 -0
- data/app/views/content/repositories/_form.html.erb +30 -0
- data/app/views/content/repositories/edit.html.erb +3 -0
- data/app/views/content/repositories/index.html.erb +32 -0
- data/app/views/content/repositories/new.html.erb +3 -0
- data/app/views/content/repositories/show.html.erb +98 -0
- data/app/views/content/repositories/welcome.html.erb +8 -0
- data/config/routes.rb +36 -0
- data/db/migrate/20130702140034_create_content_repositories.rb +19 -0
- data/db/migrate/20130702162629_create_content_products.rb +10 -0
- data/db/migrate/20130709001120_create_content_gpg_keys.rb +10 -0
- data/db/migrate/20130717032320_create_content_environments_products.rb +9 -0
- data/db/migrate/20130722084911_create_content_operatingsystem_repositories.rb +9 -0
- data/db/migrate/20130723084911_create_content_hostgroup_products.rb +9 -0
- data/db/migrate/20130723124911_create_content_host_products.rb +9 -0
- data/db/migrate/20130729032320_create_content_product_operatingsystems.rb +9 -0
- data/lib/content/engine.rb +59 -0
- data/lib/content/version.rb +3 -0
- data/lib/content_environment.rb +13 -0
- data/lib/content_home_helper_patch.rb +23 -0
- data/lib/content_host.rb +55 -0
- data/lib/content_hostgroup.rb +22 -0
- data/lib/content_operatingsystem.rb +17 -0
- data/lib/content_redhat.rb +36 -0
- data/lib/content_taxonomy.rb +18 -0
- data/lib/foreman_content.rb +4 -0
- data/lib/pulp_configuration.rb +23 -0
- data/lib/tasks/content_tasks.rake +4 -0
- data/test/content_test.rb +7 -0
- data/test/fixtures/content/products.yml +11 -0
- data/test/fixtures/content/repositories.yml +11 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +23 -0
- data/test/unit/content/description_format_validator_test.rb +20 -0
- data/test/unit/content/name_format_validator_test.rb +28 -0
- data/test/unit/content/product_validation_test.rb +18 -0
- data/test/unit/content/repositories_test.rb +7 -0
- metadata +194 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
<% javascript 'charts' %>
|
2
|
+
<% title @repository.to_label %>
|
3
|
+
|
4
|
+
<%= title_actions(button_group(
|
5
|
+
link_to_if_authorized(_("Edit"), hash_for_edit_repository_path(@repository)),
|
6
|
+
link_to_if_authorized(_("Synchronize"), hash_for_sync_repository_path(@repository), :method => :put)
|
7
|
+
)) %>
|
8
|
+
<div class="row">
|
9
|
+
<div class="span12">
|
10
|
+
<table class="table table-bordered table-striped">
|
11
|
+
<tr>
|
12
|
+
<th><%= _('Repository details') %></th>
|
13
|
+
<th></th>
|
14
|
+
</tr>
|
15
|
+
<tr>
|
16
|
+
<td> <%= _("Name") %> </td>
|
17
|
+
<td> <%= @repository.to_label %> </td>
|
18
|
+
</tr>
|
19
|
+
<tr>
|
20
|
+
<td> <%= _("Description") %> </td>
|
21
|
+
<td> <%= @repository.description %> </td>
|
22
|
+
</tr>
|
23
|
+
<tr>
|
24
|
+
<td> <%= _("Feed") %> </td>
|
25
|
+
<td> <%= @repository.feed %> </td>
|
26
|
+
</tr>
|
27
|
+
<tr>
|
28
|
+
<td> <%= _("Content type") %> </td>
|
29
|
+
<td> <%= @repository.content_type %> </td>
|
30
|
+
</tr>
|
31
|
+
<tr>
|
32
|
+
<td> <%= _("Architecture") %> </td>
|
33
|
+
<td> <%= @repository.architecture %> </td>
|
34
|
+
</tr>
|
35
|
+
<tr>
|
36
|
+
<td> <%= _("Enabled") %> </td>
|
37
|
+
<td> <%= @repository.enabled %> </td>
|
38
|
+
</tr>
|
39
|
+
<tr>
|
40
|
+
<td> <%= _("Unprotected") %> </td>
|
41
|
+
<td> <%= @repository.unprotected %> </td>
|
42
|
+
</tr>
|
43
|
+
<tr>
|
44
|
+
<td> <%= _("Full path") %> </td>
|
45
|
+
<td> <%= @repository.full_path %> </td>
|
46
|
+
</tr>
|
47
|
+
</table>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
<div class="row-fluid">
|
51
|
+
<div class="stats-well span4">
|
52
|
+
<h4 class="ca" ><%= _('Last Update Metrics') -%></h4>
|
53
|
+
<div style="margin-top:50px;padding-bottom: 40px;">
|
54
|
+
<%= flot_pie_chart("metrics" ,_("Last Update Metrics"), sync_history_times(@sync_history), :class => "statistics-pie small")%>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
<div class="stats-well span4">
|
58
|
+
<h4 class="ca" ><%= _('Update Summary') -%></h4>
|
59
|
+
<%= flot_bar_chart("status" ,"", _("Number of packages"), sync_history_metrics(@sync_history), :class => "statistics-bar")%>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div class="span4">
|
63
|
+
<table class="table table-bordered table-striped">
|
64
|
+
<tr>
|
65
|
+
<th><%= _('Repository Counters') %></th>
|
66
|
+
<th></th>
|
67
|
+
</tr>
|
68
|
+
<% @details[:content_unit_counts].each do |name, value| -%>
|
69
|
+
<tr>
|
70
|
+
<td> <%= name.humanize %> </td>
|
71
|
+
<td> <%= value %> </td>
|
72
|
+
</tr>
|
73
|
+
<% end -%>
|
74
|
+
<tr>
|
75
|
+
<td> <%= _("Last published") %> </td>
|
76
|
+
<td> <%= last_publish @details %> </td>
|
77
|
+
</tr>
|
78
|
+
<tr>
|
79
|
+
<td> <%= _("Last synchronized") %> </td>
|
80
|
+
<td> <%= last_sync @details %> </td>
|
81
|
+
</tr>
|
82
|
+
</table>
|
83
|
+
</div>
|
84
|
+
<div class="span4">
|
85
|
+
<table class="table table-bordered table-striped">
|
86
|
+
<tr>
|
87
|
+
<th><%= _('Last Sync') %></th>
|
88
|
+
<th></th>
|
89
|
+
</tr>
|
90
|
+
<% sync_history_status(@sync_history).each do |name, value| -%>
|
91
|
+
<tr>
|
92
|
+
<td> <%= name.humanize %> </td>
|
93
|
+
<td> <%= value %> </td>
|
94
|
+
</tr>
|
95
|
+
<% end -%>
|
96
|
+
</table>
|
97
|
+
</div>
|
98
|
+
</div>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
scope :module => :content do
|
3
|
+
resources :gpg_keys do
|
4
|
+
collection do
|
5
|
+
get 'auto_complete_search'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
resources :products do
|
10
|
+
collection do
|
11
|
+
get 'auto_complete_search'
|
12
|
+
end
|
13
|
+
member do
|
14
|
+
put :sync
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
resources :repositories do
|
19
|
+
collection do
|
20
|
+
get 'auto_complete_search'
|
21
|
+
end
|
22
|
+
member do
|
23
|
+
put :sync
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
namespace :api do
|
28
|
+
resources :repositories do
|
29
|
+
collection do
|
30
|
+
post 'events'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateContentRepositories < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_repositories do |t|
|
4
|
+
t.string :name, :null => false
|
5
|
+
t.string :description
|
6
|
+
t.string :content_type, :default => "yum", :null => false
|
7
|
+
t.boolean :enabled, :default => true
|
8
|
+
t.string :relative_path
|
9
|
+
t.string :feed
|
10
|
+
t.boolean :unprotected, :default => false
|
11
|
+
t.references :product, :null => false
|
12
|
+
t.string :pulp_id
|
13
|
+
t.references :gpg_key
|
14
|
+
t.references :architecture
|
15
|
+
t.timestamps
|
16
|
+
end
|
17
|
+
add_index :content_repositories, :pulp_id, :unique => true
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateContentGpgKeys < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_gpg_keys do |t|
|
4
|
+
t.string :name, :null => false
|
5
|
+
t.text :content, :null => false
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
add_index(:content_gpg_keys, [:name], :unique=>true)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateContentEnvironmentsProducts < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_environment_products do |t|
|
4
|
+
t.references :environment, :null =>false
|
5
|
+
t.references :product, :null =>false
|
6
|
+
end
|
7
|
+
add_index(:content_environment_products, [:environment_id, :product_id],:name=>'environment_products_index', :unique=>true)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateContentOperatingsystemRepositories < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_operatingsystem_repositories do |t|
|
4
|
+
t.references :repository, :null =>false
|
5
|
+
t.references :operatingsystem, :null =>false
|
6
|
+
end
|
7
|
+
add_index(:content_operatingsystem_repositories, [:repository_id, :operatingsystem_id],:name=>'operatingsystem_repositories_index', :unique=>true)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateContentHostgroupProducts < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_hostgroup_products do |t|
|
4
|
+
t.references :hostgroup, :null =>false
|
5
|
+
t.references :product, :null =>false
|
6
|
+
end
|
7
|
+
add_index(:content_hostgroup_products, [:product_id, :hostgroup_id],:name=>'hostgroup_products_index', :unique=>true)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateContentHostProducts < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_host_products do |t|
|
4
|
+
t.references :host, :null =>false
|
5
|
+
t.references :product, :null =>false
|
6
|
+
end
|
7
|
+
add_index(:content_host_products, [:product_id, :host_id],:name=>'host_products_index', :unique=>true)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateContentProductOperatingsystems < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :content_product_operatingsystems do |t|
|
4
|
+
t.references :operatingsystem, :null =>false
|
5
|
+
t.references :product, :null =>false
|
6
|
+
end
|
7
|
+
add_index(:content_product_operatingsystems, [:operatingsystem_id, :product_id],:name=>'product_operatingsystems_index', :unique=>true)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'content_home_helper_patch'
|
2
|
+
require 'content_taxonomy'
|
3
|
+
require 'content_environment'
|
4
|
+
require 'content_operatingsystem'
|
5
|
+
require 'content_redhat'
|
6
|
+
require 'content_hostgroup'
|
7
|
+
require 'content_host'
|
8
|
+
require 'pulp_configuration'
|
9
|
+
|
10
|
+
|
11
|
+
module Content
|
12
|
+
ENGINE_NAME = "content"
|
13
|
+
class Engine < ::Rails::Engine
|
14
|
+
engine_name Content::ENGINE_NAME
|
15
|
+
|
16
|
+
# Load this before the Foreman config initializers, so that the Setting.descendants
|
17
|
+
# list includes the plugin STI setting class
|
18
|
+
initializer 'foreman_content.load_default_settings', :before => :load_config_initializers do |app|
|
19
|
+
require_dependency File.expand_path("../../../app/models/setting/content.rb", __FILE__) if (Setting.table_exists? rescue(false))
|
20
|
+
end
|
21
|
+
|
22
|
+
initializer "foreman_content.load_app_instance_data" do |app|
|
23
|
+
app.config.paths['db/migrate'] += Content::Engine.paths['db/migrate'].existent
|
24
|
+
app.config.autoload_paths += Dir["#{config.root}/app/services)"]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Include extensions to models in this config.to_prepare block
|
28
|
+
config.to_prepare do
|
29
|
+
::PulpConfiguration.initialize_runcible
|
30
|
+
# Patch the menu
|
31
|
+
::HomeHelper.send :include, ContentHomeHelperPatch
|
32
|
+
# Extend the taxonomy model
|
33
|
+
::Taxonomy.send :include, ContentTaxonomy
|
34
|
+
# Extend the environment model
|
35
|
+
::Environment.send :include, ContentEnvironment
|
36
|
+
# Extend OS model
|
37
|
+
::Operatingsystem.send :include, ContentOperatingsystem
|
38
|
+
# Extend RedHat OS family model
|
39
|
+
::Redhat.send :include, ContentRedhat
|
40
|
+
# Extend the hostgroup model
|
41
|
+
::Hostgroup.send :include, ContentHostgroup
|
42
|
+
# Extend the host model
|
43
|
+
::Host::Managed.send :include, ContentHost
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def table_name_prefix
|
48
|
+
Content::ENGINE_NAME + '_'
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.table_name_prefix
|
52
|
+
Content::ENGINE_NAME + '_'
|
53
|
+
end
|
54
|
+
|
55
|
+
def use_relative_model_naming
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ContentEnvironment
|
2
|
+
def self.included(base)
|
3
|
+
base.send(:include, InstanceMethods)
|
4
|
+
|
5
|
+
base.class_eval do
|
6
|
+
has_many :environment_products, :dependent => :destroy, :uniq=>true, :class_name => 'Content::EnvironmentProduct'
|
7
|
+
has_many :products, :through => :environment_products, :class_name => 'Content::Product'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ContentHomeHelperPatch
|
2
|
+
def self.included(base)
|
3
|
+
base.send(:include, InstanceMethods)
|
4
|
+
|
5
|
+
base.class_eval do
|
6
|
+
alias_method_chain :setting_options, :content_link
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module InstanceMethods
|
11
|
+
# Adds a content link to the More menu
|
12
|
+
def setting_options_with_content_link
|
13
|
+
choices = setting_options_without_content_link
|
14
|
+
content_group =
|
15
|
+
[
|
16
|
+
[_('Products'), :"content/products"],
|
17
|
+
[_('Repositories'), :"content/repositories"],
|
18
|
+
[_('Gpg keys'), :"content/gpg_keys"]
|
19
|
+
]
|
20
|
+
choices.insert(3, [:divider], [:group, _("Content"), content_group])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/content_host.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module ContentHost
|
2
|
+
def self.included(base)
|
3
|
+
base.send(:include, InstanceMethods)
|
4
|
+
|
5
|
+
base.class_eval do
|
6
|
+
has_many :host_products, :dependent => :destroy, :uniq=>true,:foreign_key => :host_id, :class_name => 'Content::HostProduct'
|
7
|
+
has_many :products, :through => :host_products, :class_name => 'Content::Product'
|
8
|
+
|
9
|
+
scoped_search :in=>:products, :on=>:name, :complete_value => true, :rename => :product
|
10
|
+
|
11
|
+
alias_method_chain :params, :repositories
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
|
17
|
+
# adds repository hash to ENC global parameters
|
18
|
+
def params_with_repositories
|
19
|
+
# convert all repos to a format that puppet create_resource with yumrepo can consume
|
20
|
+
repos = Hash[attached_repositories.map{ |repo| [repo.to_label, format_repo(repo)] }]
|
21
|
+
# adds a global parameter called repositories contain all repos
|
22
|
+
params_without_repositories.merge('repositories' => repos)
|
23
|
+
end
|
24
|
+
|
25
|
+
# product_ids from the os default and hostgroup.
|
26
|
+
def inherited_product_ids
|
27
|
+
products = []
|
28
|
+
products += operatingsystem.product_ids if operatingsystem
|
29
|
+
products += Content::HostgroupProduct.where(:hostgroup_id => hostgroup.path_ids).pluck(:product_id) if hostgroup_id
|
30
|
+
products.uniq
|
31
|
+
end
|
32
|
+
|
33
|
+
def all_product_ids
|
34
|
+
(inherited_product_ids + product_ids).uniq
|
35
|
+
end
|
36
|
+
|
37
|
+
def attached_repositories
|
38
|
+
Content::Repository.attached_to_host(self)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# convert a repository to a format that puppet create_resource with yumrepo can consume
|
44
|
+
def format_repo repo
|
45
|
+
{
|
46
|
+
'baseurl' => repo.full_path,
|
47
|
+
# yum repos have descr field but no name, if descr is empty use the repo name
|
48
|
+
'descr' => repo.description.blank? ? repo.name : repo.description,
|
49
|
+
'enabled' => repo.enabled ? '1': '0',
|
50
|
+
'gpgcheck' => !!repo.gpg_key ? '1': '0'
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ContentHostgroup
|
2
|
+
def self.included(base)
|
3
|
+
base.send(:include, InstanceMethods)
|
4
|
+
|
5
|
+
base.class_eval do
|
6
|
+
has_many :hostgroup_products, :dependent => :destroy, :uniq=>true, :class_name => 'Content::HostgroupProduct'
|
7
|
+
has_many :products, :through => :hostgroup_products, :class_name => 'Content::Product'
|
8
|
+
|
9
|
+
scoped_search :in=>:products, :on=>:name, :complete_value => true, :rename => :product
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module InstanceMethods
|
14
|
+
def inherited_product_ids
|
15
|
+
Content::HostgroupProduct.where(:hostgroup_id => hostgroup.ancestor_ids).pluck(:product_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def all_product_ids
|
19
|
+
(inherited_product_ids + product_ids).uniq
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ContentOperatingsystem
|
2
|
+
def self.included(base)
|
3
|
+
base.send(:include, InstanceMethods)
|
4
|
+
|
5
|
+
base.class_eval do
|
6
|
+
has_many :operatingsystem_repositories, :dependent => :destroy, :uniq => true, :class_name => 'Content::OperatingsystemRepository'
|
7
|
+
has_many :repositories, :through => :operatingsystem_repositories, :class_name => 'Content::Repository'
|
8
|
+
|
9
|
+
has_many :product_operatingsystems, :dependent => :destroy, :uniq => true, :class_name => 'Content::ProductOperatingsystem'
|
10
|
+
has_many :products, :through => :product_operatingsystems, :class_name => 'Content::Product'
|
11
|
+
has_many :default_repositories, :through => :products, :source => :repositories, :class_name => 'Content::Repository'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
end
|
17
|
+
end
|