foreman_content 0.1
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 +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,56 @@
|
|
1
|
+
module Content
|
2
|
+
module RepositoriesHelper
|
3
|
+
|
4
|
+
def sync_status repo
|
5
|
+
status = repo.sync_status
|
6
|
+
status = if status && status.first
|
7
|
+
status.first[:state]
|
8
|
+
else
|
9
|
+
details = repo.retrieve_with_details
|
10
|
+
details[:importers][0][:last_sync] if details && details[:importers] && details[:importers][0]
|
11
|
+
end
|
12
|
+
"#{time_ago_in_words(status)} ago" rescue status
|
13
|
+
rescue
|
14
|
+
'-'
|
15
|
+
end
|
16
|
+
|
17
|
+
def last_publish details
|
18
|
+
return '' unless details[:distributors] && details[:distributors].first && published = details[:distributors].first[:last_publish]
|
19
|
+
"#{time_ago_in_words published} ago" rescue ''
|
20
|
+
end
|
21
|
+
|
22
|
+
def last_sync details
|
23
|
+
return '' unless details[:importers] && details[:importers].first && synced = details[:importers].first[:last_sync]
|
24
|
+
"#{time_ago_in_words synced} ago" rescue ''
|
25
|
+
end
|
26
|
+
|
27
|
+
def sync_history_times history
|
28
|
+
return {} unless history && history.first && summary = history.first['summary']
|
29
|
+
return {} unless summary[:comps]
|
30
|
+
{
|
31
|
+
:comps => summary[:comps][:time_total_sec],
|
32
|
+
:errata => summary[:errata][:errata_time_total_sec],
|
33
|
+
:packages => summary[:packages][:time_total_sec]
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def sync_history_metrics history
|
38
|
+
return {} unless history && last = history.first
|
39
|
+
{
|
40
|
+
:updated => last[:updated_count],
|
41
|
+
:removed => last[:removed_count],
|
42
|
+
:added => last[:added_count]
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def sync_history_status history
|
47
|
+
return {} unless history && last = history.first
|
48
|
+
{
|
49
|
+
'result' => last[:result],
|
50
|
+
'message' => last[:error_message] || last['summary']['error'],
|
51
|
+
'completed' => ("#{time_ago_in_words(last[:completed])} ago" rescue '')
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Content
|
2
|
+
module CustomRepositoryPaths
|
3
|
+
def repo_path_from_content_path(environment, content_path)
|
4
|
+
content_path = content_path.sub(/^\//, "")
|
5
|
+
path_prefix = [environment.organization.label, environment.label].join("/")
|
6
|
+
"#{path_prefix}/#{content_path}"
|
7
|
+
end
|
8
|
+
|
9
|
+
# repo path for custom product repos (RH repo paths are derived from
|
10
|
+
# content url)
|
11
|
+
def custom_repo_path(org_label, environment_label, product_label, repo_label)
|
12
|
+
prefix = [org_label, environment_label].map { |x| x.gsub(/[^-\w]/, "_") }.join("/")
|
13
|
+
prefix + custom_content_path(product_label, repo_label)
|
14
|
+
end
|
15
|
+
|
16
|
+
def custom_content_path(product_label, repo_label)
|
17
|
+
parts = []
|
18
|
+
# We generate repo path only for custom product content. We add this
|
19
|
+
# constant string to avoid collisions with RH content. RH content url
|
20
|
+
# begins usually with something like "/content/dist/rhel/...".
|
21
|
+
# There we prefix custom content/repo url with "/custom/..."
|
22
|
+
parts << "custom"
|
23
|
+
parts += [product_label, repo_label]
|
24
|
+
"/" + parts.map { |x| x.gsub(/[^-\w]/, "_") }.join("/")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public
|
5
|
+
# License as published by the Free Software Foundation; either version
|
6
|
+
# 2 of the License (GPLv2) or (at your option) any later version.
|
7
|
+
# There is NO WARRANTY for this software, express or implied,
|
8
|
+
# including the implied warranties of MERCHANTABILITY,
|
9
|
+
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
10
|
+
# have received a copy of GPLv2 along with this software; if not, see
|
11
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
12
|
+
module Content
|
13
|
+
class EnvironmentProduct < ActiveRecord::Base
|
14
|
+
belongs_to :product
|
15
|
+
belongs_to :environment
|
16
|
+
validates_presence_of :product_id, :environment_id
|
17
|
+
validates_uniqueness_of :product_id, :scope => :environment_id
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public
|
5
|
+
# License as published by the Free Software Foundation; either version
|
6
|
+
# 2 of the License (GPLv2) or (at your option) any later version.
|
7
|
+
# There is NO WARRANTY for this software, express or implied,
|
8
|
+
# including the implied warranties of MERCHANTABILITY,
|
9
|
+
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
10
|
+
# have received a copy of GPLv2 along with this software; if not, see
|
11
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
12
|
+
|
13
|
+
module Content
|
14
|
+
class GpgKey < ActiveRecord::Base
|
15
|
+
include ::Taxonomix
|
16
|
+
MAX_CONTENT_LENGTH = 100000
|
17
|
+
|
18
|
+
has_many :repositories
|
19
|
+
has_many :products
|
20
|
+
|
21
|
+
validates :name, :presence => true
|
22
|
+
validates_with Validators::NameFormat, :attributes => :name
|
23
|
+
validates :content, :presence => true
|
24
|
+
validates_with Validators::ContentValidator, :attributes => :content
|
25
|
+
validates_length_of :content, :maximum => MAX_CONTENT_LENGTH
|
26
|
+
|
27
|
+
validates_uniqueness_of :name, :message => N_("Label has already been taken")
|
28
|
+
|
29
|
+
scoped_search :on => :name
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public
|
5
|
+
# License as published by the Free Software Foundation; either version
|
6
|
+
# 2 of the License (GPLv2) or (at your option) any later version.
|
7
|
+
# There is NO WARRANTY for this software, express or implied,
|
8
|
+
# including the implied warranties of MERCHANTABILITY,
|
9
|
+
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
10
|
+
# have received a copy of GPLv2 along with this software; if not, see
|
11
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
12
|
+
module Content
|
13
|
+
class HostProduct < ActiveRecord::Base
|
14
|
+
belongs_to :product
|
15
|
+
belongs_to :host
|
16
|
+
validates_presence_of :product_id, :host_id
|
17
|
+
validates_uniqueness_of :product_id, :scope => :host_id
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public
|
5
|
+
# License as published by the Free Software Foundation; either version
|
6
|
+
# 2 of the License (GPLv2) or (at your option) any later version.
|
7
|
+
# There is NO WARRANTY for this software, express or implied,
|
8
|
+
# including the implied warranties of MERCHANTABILITY,
|
9
|
+
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
10
|
+
# have received a copy of GPLv2 along with this software; if not, see
|
11
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
12
|
+
module Content
|
13
|
+
class HostgroupProduct < ActiveRecord::Base
|
14
|
+
belongs_to :product
|
15
|
+
belongs_to :hostgroup
|
16
|
+
validates_presence_of :product_id, :hostgroup_id
|
17
|
+
validates_uniqueness_of :product_id, :scope => :hostgroup_id
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public
|
5
|
+
# License as published by the Free Software Foundation; either version
|
6
|
+
# 2 of the License (GPLv2) or (at your option) any later version.
|
7
|
+
# There is NO WARRANTY for this software, express or implied,
|
8
|
+
# including the implied warranties of MERCHANTABILITY,
|
9
|
+
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
10
|
+
# have received a copy of GPLv2 along with this software; if not, see
|
11
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
12
|
+
module Content
|
13
|
+
class OperatingsystemRepository < ActiveRecord::Base
|
14
|
+
belongs_to :operatingsystem
|
15
|
+
belongs_to :repository
|
16
|
+
validates_presence_of :operatingsystem_id, :repository_id
|
17
|
+
validates_uniqueness_of :operatingsystem_id, :scope => :repository_id
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Content::Orchestration::Pulp
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
after_validation :queue_pulp
|
6
|
+
before_destroy :queue_pulp_destroy unless Rails.env == "test"
|
7
|
+
end
|
8
|
+
|
9
|
+
def orchestration_errors?
|
10
|
+
errors.empty?
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def queue_pulp
|
16
|
+
return unless pulp? and errors.empty?
|
17
|
+
new_record? ? queue_pulp_create : queue_pulp_update
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def queue_pulp_create
|
23
|
+
logger.debug "Scheduling new Pulp Repository"
|
24
|
+
queue.create(:name => _("Create Pulp Repository for %s") % self, :priority => 10,
|
25
|
+
:action => [self, :set_pulp_repo])
|
26
|
+
queue.create(:name => _("Sync Pulp Repository %s") % self, :priority => 20,
|
27
|
+
:action => [self, :set_sync_pulp_repo])
|
28
|
+
end
|
29
|
+
|
30
|
+
def queue_pulp_update
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_pulp_repo
|
34
|
+
Runcible::Extensions::Repository.create_with_importer_and_distributors(pulp_id,
|
35
|
+
pulp_importer,
|
36
|
+
[pulp_distributor],
|
37
|
+
{ :display_name => relative_path,
|
38
|
+
:description => description })
|
39
|
+
rescue RestClient::BadRequest => e
|
40
|
+
raise (JSON.parse e.response)['error_message']
|
41
|
+
end
|
42
|
+
|
43
|
+
def del_pulp_repo
|
44
|
+
delete
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_sync_pulp_repo
|
48
|
+
sync
|
49
|
+
end
|
50
|
+
|
51
|
+
def del_sync_pulp_repo
|
52
|
+
status = sync_status
|
53
|
+
return if status.blank? || status == ::PulpSyncStatus::Status::NOT_SYNCED
|
54
|
+
Runcible::Resources::Task.cancel(status.uuid)
|
55
|
+
end
|
56
|
+
|
57
|
+
def pulp_importer
|
58
|
+
options = {
|
59
|
+
:feed_url => feed
|
60
|
+
}
|
61
|
+
|
62
|
+
case content_type
|
63
|
+
when Content::Repository::YUM_TYPE, Content::Repository::KICKSTART_TYPE
|
64
|
+
Runcible::Extensions::YumImporter.new(options)
|
65
|
+
when Content::Repository::FILE_TYPE
|
66
|
+
Runcible::Extensions::IsoImporter.new(options)
|
67
|
+
else
|
68
|
+
raise "Unexpected repo type %s" % content_type
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def pulp_distributor
|
73
|
+
case content_type
|
74
|
+
when Content::Repository::YUM_TYPE, Content::Repository::KICKSTART_TYPE
|
75
|
+
Runcible::Extensions::YumDistributor.new(relative_path, unprotected, true,
|
76
|
+
{ :protected => true, :id => pulp_id,
|
77
|
+
:auto_publish => true })
|
78
|
+
when Content::Repository::FILE_TYPE
|
79
|
+
dist = Runcible::Extensions::IsoDistributor.new(true, true)
|
80
|
+
dist.auto_publish = true
|
81
|
+
dist
|
82
|
+
else
|
83
|
+
raise "Unexpected repo type %s" % content_type
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def queue_pulp_destroy
|
88
|
+
return unless pulp? and errors.empty?
|
89
|
+
logger.debug _("Scheduling removal of Pulp Repository %s") % name
|
90
|
+
queue.create(:name => _("Delete Pulp repository for %s") % name, :priority => 50,
|
91
|
+
:action => [self, :del_pulp_repo])
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Content
|
2
|
+
class Product < ActiveRecord::Base
|
3
|
+
include ::Taxonomix
|
4
|
+
|
5
|
+
has_many :repositories
|
6
|
+
has_many :environment_products, :dependent => :destroy, :uniq=>true
|
7
|
+
has_many :environments, :through => :environment_products
|
8
|
+
|
9
|
+
has_many :product_operatingsystems, :dependent => :destroy, :uniq=>true
|
10
|
+
has_many :operatingsystems, :through => :product_operatingsystems
|
11
|
+
|
12
|
+
has_many :hostgroup_products, :dependent => :destroy, :uniq=>true
|
13
|
+
has_many :hostgroups, :through => :hostgroup_products
|
14
|
+
|
15
|
+
has_many :host_products, :dependent => :destroy, :uniq=>true
|
16
|
+
has_many :hosts, :through => :host_products
|
17
|
+
|
18
|
+
validates_with Validators::DescriptionFormat, :attributes => :description
|
19
|
+
validates :name, :presence => true
|
20
|
+
validates_with Validators::NameFormat, :attributes => :name
|
21
|
+
scoped_search :on => :name
|
22
|
+
scoped_search :in => :repositories, :on => :name, :rename => :repository, :complete_value => :true
|
23
|
+
|
24
|
+
def sync
|
25
|
+
self.repositories.map{ |repo| repo.sync }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public
|
5
|
+
# License as published by the Free Software Foundation; either version
|
6
|
+
# 2 of the License (GPLv2) or (at your option) any later version.
|
7
|
+
# There is NO WARRANTY for this software, express or implied,
|
8
|
+
# including the implied warranties of MERCHANTABILITY,
|
9
|
+
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
10
|
+
# have received a copy of GPLv2 along with this software; if not, see
|
11
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
12
|
+
module Content
|
13
|
+
class ProductOperatingsystem < ActiveRecord::Base
|
14
|
+
belongs_to :product
|
15
|
+
belongs_to :operatingsystem
|
16
|
+
validates_presence_of :product_id, :operatingsystem_id
|
17
|
+
validates_uniqueness_of :product_id, :scope => :operatingsystem_id
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Content
|
2
|
+
module Remote
|
3
|
+
module Pulp
|
4
|
+
module Repository
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
after_initialize :initialize_pulp
|
9
|
+
end
|
10
|
+
|
11
|
+
def pulp?
|
12
|
+
@use_pulp ||= Setting.use_pulp and enabled?
|
13
|
+
end
|
14
|
+
|
15
|
+
def sync
|
16
|
+
Runcible::Resources::Repository.sync(pulp_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def retrieve_with_details
|
20
|
+
return unless pulp? && pulp_id
|
21
|
+
Runcible::Resources::Repository.retrieve(pulp_id, {:details => true})
|
22
|
+
end
|
23
|
+
|
24
|
+
def sync_status
|
25
|
+
return unless pulp? && pulp_id
|
26
|
+
Runcible::Extensions::Repository.sync_status(pulp_id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def sync_history
|
30
|
+
return unless pulp? && pulp_id
|
31
|
+
Runcible::Extensions::Repository.sync_history(pulp_id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete
|
35
|
+
Runcible::Resources::Repository.delete(pulp_id)
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
def initialize_pulp
|
40
|
+
self.pulp_id ||= Foreman.uuid.gsub("-", '')
|
41
|
+
self.relative_path ||= custom_repo_path("acme_org", "library", product.name, name) if name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'content/orchestration/pulp'
|
2
|
+
# TODO: split into a custom and red hat repositories:
|
3
|
+
# as handling of repo creation/updates is different between them
|
4
|
+
module Content
|
5
|
+
class Repository < ActiveRecord::Base
|
6
|
+
include CustomRepositoryPaths
|
7
|
+
include Content::Remote::Pulp::Repository
|
8
|
+
include ::Orchestration
|
9
|
+
include Content::Orchestration::Pulp
|
10
|
+
|
11
|
+
YUM_TYPE = 'yum'
|
12
|
+
KICKSTART_TYPE = 'kickstart'
|
13
|
+
FILE_TYPE = 'iso'
|
14
|
+
TYPES = [YUM_TYPE, KICKSTART_TYPE, FILE_TYPE]
|
15
|
+
|
16
|
+
REPO_PREFIX = '/pulp/repos/'
|
17
|
+
|
18
|
+
belongs_to :product
|
19
|
+
belongs_to :gpg_key
|
20
|
+
belongs_to :architecture
|
21
|
+
has_many :operatingsystem_repositories, :dependent => :destroy, :uniq => true
|
22
|
+
has_many :operatingsystems, :through => :operatingsystem_repositories
|
23
|
+
|
24
|
+
validates :product, :presence => true
|
25
|
+
validates :name, :presence => true
|
26
|
+
validates_uniqueness_of :name, :scope => :product_id
|
27
|
+
validates_inclusion_of :content_type,
|
28
|
+
:in => TYPES,
|
29
|
+
:allow_blank => false,
|
30
|
+
:message => (_("Please select content type from one of the following: %s") % TYPES.join(', '))
|
31
|
+
|
32
|
+
scoped_search :on => [:name, :enabled], :complete_value => :true
|
33
|
+
scoped_search :in => :architecture, :on => :name, :rename => :architecture, :complete_value => :true
|
34
|
+
scoped_search :in => :operatingsystems, :on => :name, :rename => :os, :complete_value => :true
|
35
|
+
scoped_search :in => :product, :on => :name, :rename => :product, :complete_value => :true
|
36
|
+
|
37
|
+
# Repositories filtered by operating system architecture and environment.
|
38
|
+
# architecture_id is nil for noarch repositories.
|
39
|
+
scope :available_for_host, lambda { |host|
|
40
|
+
joins(:operatingsystems => :operatingsystem_repositories , :product => :environments).
|
41
|
+
where(:architecture_id => [nil, host.architecture_id],
|
42
|
+
:content_operatingsystem_repositories => { :operatingsystem_id => host.operatingsystem_id},
|
43
|
+
:content_environment_products => { :environment_id => host.environment_id }).
|
44
|
+
uniq}
|
45
|
+
|
46
|
+
#
|
47
|
+
scope :attached_to_host, lambda { |host|
|
48
|
+
where(:product_id => host.all_product_ids).available_for_host(host)
|
49
|
+
}
|
50
|
+
|
51
|
+
scope :kickstart, where(:content_type => KICKSTART_TYPE)
|
52
|
+
scope :yum, where(:content_type => YUM_TYPE)
|
53
|
+
|
54
|
+
def update_cache
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def full_path
|
59
|
+
pulp_url = URI.parse(Setting.pulp_url)
|
60
|
+
scheme = (unprotected ? 'http' : 'https')
|
61
|
+
port = (pulp_url.port == 443 || pulp_url.port == 80 ? "" : ":#{pulp_url.port}")
|
62
|
+
"#{scheme}://#{pulp_url.host}#{port}#{REPO_PREFIX}#{relative_path}"
|
63
|
+
end
|
64
|
+
|
65
|
+
# The label is used as a repository label in a yum repo file.
|
66
|
+
def to_label
|
67
|
+
"#{product.name}-#{name}".parameterize
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|