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
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 66165cc1d29ef234bd0d15923511264f87045b55
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2166c67ba266eaf2c9d478ba4e64839fb7a703a9
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 851db5cbe0dda9500b5bd6d30506d4ab63c565e0802cd5365b81a1b5a53c15d3362410e3ae347fbe82dc1da385c8e881953f72117253925bcc973916e3d0f444
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: c202eedf2998d5baca4d8a76ad2df98c745b280fd2a02726ae604c43477aea38a2c1a658e0b9bbea85276a518fa9e6623fa7b1db78247e5da2dfd3d728428377
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,113 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # foreman\_content
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            This plugin aims to enable repository synconrinzation and managament in Foreman. It is of alpha quality
         
     | 
| 
      
 4 
     | 
    
         
            +
            right now and currently handles only yum/rpm repositories ;)
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # Dependencies
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            * Foreman running development or 1.2.1 (maybe 1.2 but was not tested)
         
     | 
| 
      
 9 
     | 
    
         
            +
            * You must have a fully working pulp server, see http://www.pulpproject.org/docs/
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            # Installation
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Require the gem in Foreman by creating `bundler.d/Gemfile.local.rb` with the
         
     | 
| 
      
 15 
     | 
    
         
            +
            following:
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            ```
         
     | 
| 
      
 18 
     | 
    
         
            +
            gem 'foreman_content'
         
     | 
| 
      
 19 
     | 
    
         
            +
            ```
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            Update & Restart Foreman:
         
     | 
| 
      
 22 
     | 
    
         
            +
            ```
         
     | 
| 
      
 23 
     | 
    
         
            +
            bundle update
         
     | 
| 
      
 24 
     | 
    
         
            +
            rake db:migrate
         
     | 
| 
      
 25 
     | 
    
         
            +
            touch tmp/restart.txt (if using passeger)
         
     | 
| 
      
 26 
     | 
    
         
            +
            ```
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            # Configuration
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            ## Pulp
         
     | 
| 
      
 31 
     | 
    
         
            +
            * enable oauth authentication
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            ## UI config
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            You would need to allow foreman to communicate with pulp, under More ->
         
     | 
| 
      
 36 
     | 
    
         
            +
            Settings -> Content, you would need to enable pulp, and set the pulp url and
         
     | 
| 
      
 37 
     | 
    
         
            +
            oauth creds, for example:
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              * pulp_oauth_key  foreman
         
     | 
| 
      
 40 
     | 
    
         
            +
              * pulp_oauth_secret super_secret
         
     | 
| 
      
 41 
     | 
    
         
            +
              * pulp_url  https://pulp.server.com/pulp/api/v2/
         
     | 
| 
      
 42 
     | 
    
         
            +
              * use_pulp  true
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            # Usage
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            ## Setting up
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            You would see in the UI under More, a new sub menu called content, in it:
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            * Product    - The actual product you are managing, for example CentOS 6
         
     | 
| 
      
 51 
     | 
    
         
            +
            * Repository - list of repositories that belong to the above product, for
         
     | 
| 
      
 52 
     | 
    
         
            +
            example, CentOS 6.4 + CentOS updates.
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            ## Syncing Repositories
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            Under Content -> Repository create a new repo
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            * Name - user friendly name, this would be reflected later on in yum configuration
         
     | 
| 
      
 59 
     | 
    
         
            +
            * Feed URL - where we are cloning from, normally a public mirror
         
     | 
| 
      
 60 
     | 
    
         
            +
            * Content type - Kickstart (e.g. bootable) or a plain yum repo, if the repo
         
     | 
| 
      
 61 
     | 
    
         
            +
            contains a full OS, choose kickstart, later on foreman would use that instead
         
     | 
| 
      
 62 
     | 
    
         
            +
            of an Installation media.
         
     | 
| 
      
 63 
     | 
    
         
            +
            * Architecture - type of files within the repo, usually X86_64 or noarch etc.
         
     | 
| 
      
 64 
     | 
    
         
            +
            * Operating Systems - list of valid OS's that this repo applies to.
         
     | 
| 
      
 65 
     | 
    
         
            +
            * Enabled - true / false
         
     | 
| 
      
 66 
     | 
    
         
            +
            * Unprotected - weather pulp should expose this repo via http and https or just
         
     | 
| 
      
 67 
     | 
    
         
            +
              over https.
         
     | 
| 
      
 68 
     | 
    
         
            +
            * Product - the product from above.
         
     | 
| 
      
 69 
     | 
    
         
            +
            * GPG key - not implemented
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            Once created, the repo would automatically be synced and published.
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            ## Consuming Repos within your Kickstart
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            Once a kickstart repo has been assigned to an OS, it would automatically prefer
         
     | 
| 
      
 76 
     | 
    
         
            +
            that repo as an install media, so if that is all you want to do, its done
         
     | 
| 
      
 77 
     | 
    
         
            +
            automatically.
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            if you wish to add more yum type repos during KS, you may add the following
         
     | 
| 
      
 80 
     | 
    
         
            +
            snippet to your provisioning template.
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
            ```erb
         
     | 
| 
      
 83 
     | 
    
         
            +
            <% @repos.each do |repo| %>
         
     | 
| 
      
 84 
     | 
    
         
            +
            repo --name=<%= repo[:name] %> --baseurl=<%= repo[:baseurl] %>
         
     | 
| 
      
 85 
     | 
    
         
            +
            <% end %>
         
     | 
| 
      
 86 
     | 
    
         
            +
            ```
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            ## Consuming Repos with Puppet
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
            Assuming you are using puppet with ENC functionality, its pretty simple to
         
     | 
| 
      
 91 
     | 
    
         
            +
            let puppet manage the repositories, Foreman would expose all repository
         
     | 
| 
      
 92 
     | 
    
         
            +
            information via the ENC as a global parameter, you can later on simply consume
         
     | 
| 
      
 93 
     | 
    
         
            +
            it with create resources, e.g:
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
            ```puppet
         
     | 
| 
      
 96 
     | 
    
         
            +
            if $::repositories {
         
     | 
| 
      
 97 
     | 
    
         
            +
              create_resources('yumrepo', $::repositories)
         
     | 
| 
      
 98 
     | 
    
         
            +
            }
         
     | 
| 
      
 99 
     | 
    
         
            +
            ```
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
            ## Callback notifications from pulp
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            Pulp can notify foreman when events happen (e.g. repo sync is finished etc), in
         
     | 
| 
      
 104 
     | 
    
         
            +
            order to configure it run on your pulp server:
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
            ```
         
     | 
| 
      
 107 
     | 
    
         
            +
            pulp-admin event listener http create --event-type '*' --url https://foreman.example.com/api/repositories/events
         
     | 
| 
      
 108 
     | 
    
         
            +
            ```
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
            # TODO
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
            * https://trello.com/b/NtzVcPkD/foreman-backlog
         
     | 
| 
      
 113 
     | 
    
         
            +
            filter engine spike
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1,111 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'rake'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'fileutils'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            task :default => :test
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ENGINE_DIR = File.expand_path('..', __FILE__)
         
     | 
| 
      
 10 
     | 
    
         
            +
            FOREMAN_DIR = 'test/foreman_app'
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            namespace :test do
         
     | 
| 
      
 13 
     | 
    
         
            +
              desc "Download latest foreman devel source and install dependencies"
         
     | 
| 
      
 14 
     | 
    
         
            +
              task :foreman_prepare do
         
     | 
| 
      
 15 
     | 
    
         
            +
                foreman_repo = 'https://github.com/theforeman/foreman.git'
         
     | 
| 
      
 16 
     | 
    
         
            +
                foreman_gemfile = File.join(FOREMAN_DIR, "Gemfile")
         
     | 
| 
      
 17 
     | 
    
         
            +
                unless File.exists?(foreman_gemfile)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  puts "Foreman source code is not present at #{FOREMAN_DIR}"
         
     | 
| 
      
 19 
     | 
    
         
            +
                  puts "Downloading latest Foreman development branch into #{FOREMAN_DIR}..."
         
     | 
| 
      
 20 
     | 
    
         
            +
                  FileUtils.mkdir_p(FOREMAN_DIR)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  unless system("git clone #{foreman_repo} #{FOREMAN_DIR}")
         
     | 
| 
      
 23 
     | 
    
         
            +
                    puts "Error while getting latest Foreman code from #{foreman_repo} into #{FOREMAN_DIR}"
         
     | 
| 
      
 24 
     | 
    
         
            +
                    fail
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                gemfile_content = File.read(foreman_gemfile)
         
     | 
| 
      
 29 
     | 
    
         
            +
                unless gemfile_content.include?('FOREMAN_GEMFILE')
         
     | 
| 
      
 30 
     | 
    
         
            +
                  puts 'Preparing Gemfile'
         
     | 
| 
      
 31 
     | 
    
         
            +
                  gemfile_content.gsub!('__FILE__', 'FOREMAN_GEMFILE')
         
     | 
| 
      
 32 
     | 
    
         
            +
                  gemfile_content.insert(0, "FOREMAN_GEMFILE = __FILE__ unless defined? FOREMAN_GEMFILE\n")
         
     | 
| 
      
 33 
     | 
    
         
            +
                  File.open(foreman_gemfile, 'w') { |f| f << gemfile_content }
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                settings_file = "#{FOREMAN_DIR}/config/settings.yaml"
         
     | 
| 
      
 37 
     | 
    
         
            +
                unless File.exists?(settings_file)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  puts 'Preparing settings file'
         
     | 
| 
      
 39 
     | 
    
         
            +
                  FileUtils.copy("#{settings_file}.example", settings_file)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  settings_content = File.read(settings_file)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  settings_content.sub!('organizations_enabled: false', 'organizations_enabled: true')
         
     | 
| 
      
 42 
     | 
    
         
            +
                  settings_content << ":puppetgem: true\n"
         
     | 
| 
      
 43 
     | 
    
         
            +
                  File.open(settings_file, 'w') { |f| f << settings_content }
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                db_file = "#{FOREMAN_DIR}/config/database.yml"
         
     | 
| 
      
 47 
     | 
    
         
            +
                unless File.exists?(db_file)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  puts 'Preparing database file'
         
     | 
| 
      
 49 
     | 
    
         
            +
                  FileUtils.copy("#{db_file}.example", db_file)
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                ["#{ENGINE_DIR}/.bundle/config", "#{FOREMAN_DIR}/.bundle/config"].each do |bundle_file|
         
     | 
| 
      
 53 
     | 
    
         
            +
                  unless File.exists?(bundle_file)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    FileUtils.mkdir_p(File.dirname(bundle_file))
         
     | 
| 
      
 55 
     | 
    
         
            +
                    puts 'Preparing bundler configuration'
         
     | 
| 
      
 56 
     | 
    
         
            +
                    File.open(bundle_file, 'w') { |f| f << <<FILE }
         
     | 
| 
      
 57 
     | 
    
         
            +
            ---
         
     | 
| 
      
 58 
     | 
    
         
            +
            BUNDLE_WITHOUT: console:development:fog:jsonp:libvirt:mysql:mysql2:ovirt:postgresql:vmware
         
     | 
| 
      
 59 
     | 
    
         
            +
            FILE
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                local_gemfile = "#{FOREMAN_DIR}/bundler.d/Gemfile.local.rb"
         
     | 
| 
      
 64 
     | 
    
         
            +
                unless File.exist?(local_gemfile)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  File.open(local_gemfile, 'w') { |f| f << <<GEMFILE }
         
     | 
| 
      
 66 
     | 
    
         
            +
            gem "puppet"
         
     | 
| 
      
 67 
     | 
    
         
            +
            gem "facter"
         
     | 
| 
      
 68 
     | 
    
         
            +
            GEMFILE
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                puts 'Installing dependencies...'
         
     | 
| 
      
 72 
     | 
    
         
            +
                unless system('bundle install')
         
     | 
| 
      
 73 
     | 
    
         
            +
                  fail
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
              task :db_prepare do
         
     | 
| 
      
 78 
     | 
    
         
            +
                unless File.exists?(FOREMAN_DIR)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  puts <<MESSAGE
         
     | 
| 
      
 80 
     | 
    
         
            +
            Foreman source code not prepared. Run
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
              rake test:foreman_prepare
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            to download foreman source and its dependencies
         
     | 
| 
      
 85 
     | 
    
         
            +
            MESSAGE
         
     | 
| 
      
 86 
     | 
    
         
            +
                  fail
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                # once we are Ruby19 only, switch to block variant of cd
         
     | 
| 
      
 90 
     | 
    
         
            +
                pwd = FileUtils.pwd
         
     | 
| 
      
 91 
     | 
    
         
            +
                FileUtils.cd(FOREMAN_DIR)
         
     | 
| 
      
 92 
     | 
    
         
            +
                unless system('rake db:test:prepare RAILS_ENV=test')
         
     | 
| 
      
 93 
     | 
    
         
            +
                  puts "Migrating database first"
         
     | 
| 
      
 94 
     | 
    
         
            +
                  system('rake db:migrate db:schema:dump db:test:prepare RAILS_ENV=test') || fail
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
                FileUtils.cd(pwd)
         
     | 
| 
      
 97 
     | 
    
         
            +
              end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
              task :set_loadpath do
         
     | 
| 
      
 100 
     | 
    
         
            +
                %w[lib test].each do |dir|
         
     | 
| 
      
 101 
     | 
    
         
            +
                  $:.unshift(File.expand_path(dir, ENGINE_DIR))
         
     | 
| 
      
 102 
     | 
    
         
            +
                end
         
     | 
| 
      
 103 
     | 
    
         
            +
              end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
              task :all => [:db_prepare, :set_loadpath] do
         
     | 
| 
      
 106 
     | 
    
         
            +
                Dir.glob('test/**/*_test.rb') { |f| require f.sub('test/','')  unless f.include? '/foreman_app/' }
         
     | 
| 
      
 107 
     | 
    
         
            +
              end
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            task :test => 'test:all'
         
     | 
| 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // This is a manifest file that'll be compiled into application.js, which will include all the files
         
     | 
| 
      
 2 
     | 
    
         
            +
            // listed below.
         
     | 
| 
      
 3 
     | 
    
         
            +
            //
         
     | 
| 
      
 4 
     | 
    
         
            +
            // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
         
     | 
| 
      
 5 
     | 
    
         
            +
            // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
         
     | 
| 
      
 6 
     | 
    
         
            +
            //
         
     | 
| 
      
 7 
     | 
    
         
            +
            // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
         
     | 
| 
      
 8 
     | 
    
         
            +
            // the compiled file.
         
     | 
| 
      
 9 
     | 
    
         
            +
            //
         
     | 
| 
      
 10 
     | 
    
         
            +
            // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
         
     | 
| 
      
 11 
     | 
    
         
            +
            // GO AFTER THE REQUIRES BELOW.
         
     | 
| 
      
 12 
     | 
    
         
            +
            //
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
             * This is a manifest file that'll be compiled into application.css, which will include all the files
         
     | 
| 
      
 3 
     | 
    
         
            +
             * listed below.
         
     | 
| 
      
 4 
     | 
    
         
            +
             *
         
     | 
| 
      
 5 
     | 
    
         
            +
             * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
         
     | 
| 
      
 6 
     | 
    
         
            +
             * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
         
     | 
| 
      
 7 
     | 
    
         
            +
             *
         
     | 
| 
      
 8 
     | 
    
         
            +
             * You're free to add application-wide styles to this file and they'll appear at the top of the
         
     | 
| 
      
 9 
     | 
    
         
            +
             * compiled file, but it's generally better to create a new file per style scope.
         
     | 
| 
      
 10 
     | 
    
         
            +
             *
         
     | 
| 
      
 11 
     | 
    
         
            +
             *= require_self
         
     | 
| 
      
 12 
     | 
    
         
            +
             *= require_tree .
         
     | 
| 
      
 13 
     | 
    
         
            +
             */
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Content
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Api
         
     | 
| 
      
 3 
     | 
    
         
            +
                class RepositoriesController < ::Api::V2::BaseController
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                  before_filter :validate_access_to_events, :only => :events
         
     | 
| 
      
 6 
     | 
    
         
            +
                  skip_before_filter :authorize, :only => :events
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  # callback event from pulp upon tasks/events finished up
         
     | 
| 
      
 9 
     | 
    
         
            +
                  def events
         
     | 
| 
      
 10 
     | 
    
         
            +
                    if (repo_id = params['payload'] && params['payload']['repo_id'])
         
     | 
| 
      
 11 
     | 
    
         
            +
                      repo = Content::Repository.where(:pulp_id => repo_id).first
         
     | 
| 
      
 12 
     | 
    
         
            +
                    end
         
     | 
| 
      
 13 
     | 
    
         
            +
                    render_error 'not_found', :status => :not_found and return false if repo.nil?
         
     | 
| 
      
 14 
     | 
    
         
            +
                    PulpEventHandler.new(repo_id, params)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    head :status => 202
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  private
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  def validate_access_to_events
         
     | 
| 
      
 21 
     | 
    
         
            +
                    #validate our pulp server here
         
     | 
| 
      
 22 
     | 
    
         
            +
                    # we really want to use existing smart proxy infrastructure to do this.
         
     | 
| 
      
 23 
     | 
    
         
            +
                    true
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Content
         
     | 
| 
      
 2 
     | 
    
         
            +
              class GpgKeysController < ::ApplicationController
         
     | 
| 
      
 3 
     | 
    
         
            +
                include Foreman::Controller::AutoCompleteSearch
         
     | 
| 
      
 4 
     | 
    
         
            +
                before_filter :find_by_name, :only => %w{show edit update destroy}
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def index
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @gpg_keys = GpgKey.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def new
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @gpg_key = GpgKey.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def create
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @gpg_key = GpgKey.new(params[:content_gpg_key])
         
     | 
| 
      
 16 
     | 
    
         
            +
                  if @gpg_key.save
         
     | 
| 
      
 17 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 18 
     | 
    
         
            +
                  else
         
     | 
| 
      
 19 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def edit
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def update
         
     | 
| 
      
 27 
     | 
    
         
            +
                  if @gpg_key.update_attributes(params[:content_gpg_key])
         
     | 
| 
      
 28 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 29 
     | 
    
         
            +
                  else
         
     | 
| 
      
 30 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                def destroy
         
     | 
| 
      
 35 
     | 
    
         
            +
                  if @gpg_key.destroy
         
     | 
| 
      
 36 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 37 
     | 
    
         
            +
                  else
         
     | 
| 
      
 38 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Content
         
     | 
| 
      
 2 
     | 
    
         
            +
              class ProductsController < ::ApplicationController
         
     | 
| 
      
 3 
     | 
    
         
            +
                include Foreman::Controller::AutoCompleteSearch
         
     | 
| 
      
 4 
     | 
    
         
            +
                before_filter :find_by_name, :only => %w{show edit update destroy sync}
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def index
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @products = Product.search_for(params[:search], :order => params[:order]).
         
     | 
| 
      
 8 
     | 
    
         
            +
                      paginate(:page => params[:page])
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @counter = Repository.group(:product_id).where(:product_id => @products.map(&:id)).count
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                def new
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @product = Product.new
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def create
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @product = Product.new(params[:content_product])
         
     | 
| 
      
 18 
     | 
    
         
            +
                  if @product.save
         
     | 
| 
      
 19 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 20 
     | 
    
         
            +
                  else
         
     | 
| 
      
 21 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                def edit
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                def update
         
     | 
| 
      
 29 
     | 
    
         
            +
                  if @product.update_attributes(params[:content_product])
         
     | 
| 
      
 30 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 31 
     | 
    
         
            +
                  else
         
     | 
| 
      
 32 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                def sync
         
     | 
| 
      
 37 
     | 
    
         
            +
                  @product.sync
         
     | 
| 
      
 38 
     | 
    
         
            +
                  process_success(:success_msg => _("Successfully started sync for %s") % @product.name)
         
     | 
| 
      
 39 
     | 
    
         
            +
                rescue => e
         
     | 
| 
      
 40 
     | 
    
         
            +
                  process_error(:error_msg => _("Failed to start sync for %s") % @product.name)
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                def destroy
         
     | 
| 
      
 44 
     | 
    
         
            +
                  if @product.destroy
         
     | 
| 
      
 45 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 46 
     | 
    
         
            +
                  else
         
     | 
| 
      
 47 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Content
         
     | 
| 
      
 2 
     | 
    
         
            +
              class RepositoriesController < ::ApplicationController
         
     | 
| 
      
 3 
     | 
    
         
            +
                include Foreman::Controller::AutoCompleteSearch
         
     | 
| 
      
 4 
     | 
    
         
            +
                before_filter :find_by_name, :only => %w{show edit update destroy sync}
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def index
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @repositories = Repository.search_for(params[:search], :order => params[:order]).
         
     | 
| 
      
 8 
     | 
    
         
            +
                    paginate(:page => params[:page]).includes(:product, :operatingsystems)
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def new
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @repository = Repository.new(:unprotected => true)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def create
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @repository = Repository.new(params[:content_repository])
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if @repository.save
         
     | 
| 
      
 18 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 19 
     | 
    
         
            +
                  else
         
     | 
| 
      
 20 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def edit
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def update
         
     | 
| 
      
 28 
     | 
    
         
            +
                  if @repository.update_attributes(params[:content_repository])
         
     | 
| 
      
 29 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 30 
     | 
    
         
            +
                  else
         
     | 
| 
      
 31 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def show
         
     | 
| 
      
 36 
     | 
    
         
            +
                  @details = @repository.retrieve_with_details
         
     | 
| 
      
 37 
     | 
    
         
            +
                  @sync_history = @repository.sync_history
         
     | 
| 
      
 38 
     | 
    
         
            +
                rescue
         
     | 
| 
      
 39 
     | 
    
         
            +
                  redirect_back_or_to(edit_repository_path)
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                def destroy
         
     | 
| 
      
 43 
     | 
    
         
            +
                  if @repository.destroy
         
     | 
| 
      
 44 
     | 
    
         
            +
                    process_success
         
     | 
| 
      
 45 
     | 
    
         
            +
                  else
         
     | 
| 
      
 46 
     | 
    
         
            +
                    process_error
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                def sync
         
     | 
| 
      
 51 
     | 
    
         
            +
                  @repository.sync
         
     | 
| 
      
 52 
     | 
    
         
            +
                  process_success(:success_msg => _("Successfully started sync for %s") % @repository.to_label)
         
     | 
| 
      
 53 
     | 
    
         
            +
                rescue => e
         
     | 
| 
      
 54 
     | 
    
         
            +
                  process_error(:error_msg => _("Failed to start sync for %s") % @repository.to_label)
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     |