foreman_datacenter 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c048b173adf99addaa42814f19a362f92cada8c8
4
- data.tar.gz: b9cc2be0a908d2997e6fbb23b4c92908ea36a896
3
+ metadata.gz: e154fe5ab9be2e7d64a586a3395e9382c02c5722
4
+ data.tar.gz: 73b922e8071601cae1149d1e70044d402b02535e
5
5
  SHA512:
6
- metadata.gz: 43555e997c64e07ebc6db2430d03ea9c782f9b897c629131dd399f7686185c35e5381766d1085153cce0da8bc2defe0cbfb9717f75a857a5013b95174cb5278d
7
- data.tar.gz: 37228ab4368015a34892c803e5ee47113a093e3559f334b844efd84ce8e79f26a5fe0dd9cb68d82adc045e7e10c8fd54e3b65b18bac46dc05c76410e8fe3445d
6
+ metadata.gz: f3db7ebe2a0846f7d2a1e7550876c4ce35e0d4e9335abc2a0c452645d3e07494329b77a14eec855ef3d4eda1a165d47909ea1cc48cc4d858f6c74e6c24868f91
7
+ data.tar.gz: 3181025341807ee9b7a49d46731ede52571cef861606a0b562de39b0db13d7ad402ef320b9ea4dedd75e9ac326decbec3ebbab8b2a8eb0c7eb73036268d4fa71
@@ -0,0 +1,37 @@
1
+ module ForemanDatacenter
2
+ module HostsControllerExtensions
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action :set_target_device_for_import, only: :import_to_device
7
+ end
8
+
9
+ def import_to_device
10
+ begin
11
+ search = resource_base.search_for(params[:search], :order => params[:order])
12
+ rescue => e
13
+ error e.to_s
14
+ search = resource_base.search_for ''
15
+ end
16
+ @hosts = search.includes(:device, :operatingsystem, :environment, :model, :compute_resource).
17
+ paginate(:page => params[:page])
18
+ end
19
+
20
+ private
21
+
22
+ def action_permission
23
+ case params[:action]
24
+ when 'import_to_device'
25
+ 'view'
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ def set_target_device_for_import
32
+ if params[:target_device_id]
33
+ @target_device = Device.find(params[:target_device_id])
34
+ end
35
+ end
36
+ end
37
+ end
@@ -59,7 +59,7 @@ module ForemanDatacenter
59
59
 
60
60
  def device_interface_params
61
61
  params[:device_interface].
62
- permit(:device_id, :name, :form_factor, :mac_address, :mgmt_only, :description)
62
+ permit(:device_id, :name, :form_factor, :mac_address, :mgmt_only, :description, :ip_address)
63
63
  end
64
64
  end
65
65
  end
@@ -3,7 +3,8 @@ module ForemanDatacenter
3
3
  before_action :set_device_type, only: [:show, :edit, :update, :destroy]
4
4
 
5
5
  def index
6
- @device_types = DeviceType.includes(:manufacturer).all
6
+ @device_types = DeviceType.includes(:manufacturer).
7
+ paginate(:page => params[:page])
7
8
  end
8
9
 
9
10
  def show
@@ -1,9 +1,10 @@
1
1
  module ForemanDatacenter
2
2
  class DevicesController < ApplicationController
3
- before_action :set_device, only: [:edit, :update, :destroy, :inventory]
3
+ before_action :set_device, only: [:update, :destroy, :inventory]
4
4
 
5
5
  def index
6
- @devices = Device.includes(:device_role, :device_type, rack: [:site]).all
6
+ @devices = Device.includes(:device_role, :device_type, rack: [:site]).
7
+ paginate(:page => params[:page])
7
8
  end
8
9
 
9
10
  def show
@@ -21,9 +22,12 @@ module ForemanDatacenter
21
22
 
22
23
  def new
23
24
  @device = Device.new
25
+ populate_from_host
24
26
  end
25
27
 
26
28
  def edit
29
+ @device = Device.find(params[:id])
30
+ populate_from_host
27
31
  end
28
32
 
29
33
  def create
@@ -76,7 +80,15 @@ module ForemanDatacenter
76
80
  def device_params
77
81
  params[:device].permit(:device_type_id, :device_role_id, :platform_id,
78
82
  :name, :serial, :rack_id, :position, :face,
79
- :status, :primary_ip4, :primary_ip6, :comments)
83
+ :status, :primary_ip4, :primary_ip6, :comments,
84
+ :host_id)
85
+ end
86
+
87
+ def populate_from_host
88
+ if params[:host_id]
89
+ host = Host.find(params[:host_id])
90
+ @device.populate_from_host(host)
91
+ end
80
92
  end
81
93
  end
82
94
  end
@@ -0,0 +1,24 @@
1
+ module ForemanDatacenter
2
+ module HostExtensions
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_one :device, class_name: 'ForemanDatacenter::Device',
7
+ foreign_key: 'host_id', dependent: :nullify
8
+ after_destroy :update_device_on_destroy
9
+ end
10
+
11
+ def update_device_on_destroy
12
+ new_device_name = "Unassigned device (former: #{name})"
13
+ device.update(name: new_device_name)
14
+ device.interfaces.clear
15
+ end
16
+
17
+ def fact_value_by_name(name)
18
+ fact_name = FactName.find_by(name: name)
19
+ if fact_name
20
+ fact_values.find_by(fact_name: fact_name)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -11,12 +11,14 @@ module ForemanDatacenter
11
11
  has_many :power_ports, :class_name => 'ForemanDatacenter::PowerPort'
12
12
  has_many :console_server_ports, :class_name => 'ForemanDatacenter::ConsoleServerPort'
13
13
  has_many :console_ports, :class_name => 'ForemanDatacenter::ConsolePort'
14
- has_many :interfaces, :class_name => 'ForemanDatacenter::DeviceInterface'
14
+ has_many :interfaces, :class_name => 'ForemanDatacenter::DeviceInterface',
15
+ dependent: :destroy
15
16
  has_many :management_interfaces, -> { where(mgmt_only: true) },
16
17
  :class_name => 'ForemanDatacenter::DeviceInterface'
17
18
  has_many :non_management_interfaces, -> { where(mgmt_only: false) },
18
19
  :class_name => 'ForemanDatacenter::DeviceInterface'
19
20
  has_many :modules, :class_name => 'ForemanDatacenter::DeviceModule'
21
+ belongs_to_host
20
22
 
21
23
  enum face: [:front, :rear]
22
24
  enum status: [:active, :offline]
@@ -29,6 +31,7 @@ module ForemanDatacenter
29
31
  validates :position, numericality: { only_integer: true }, allow_nil: true
30
32
 
31
33
  after_create :create_interfaces
34
+ after_create :import_interfaces_from_host
32
35
  after_create :create_console_ports
33
36
  after_create :create_power_ports
34
37
  after_create :create_console_server_ports
@@ -89,7 +92,14 @@ module ForemanDatacenter
89
92
  where(power_ports: { power_outlet_id: nil })
90
93
  end
91
94
 
92
- protected
95
+ def populate_from_host(host)
96
+ self.host = host
97
+ self.name = host.name
98
+ device_type = DeviceType.for_host(host)
99
+ self.device_type = device_type if device_type
100
+ end
101
+
102
+ private
93
103
 
94
104
  def create_interfaces
95
105
  device_type.interface_templates.each do |template|
@@ -97,6 +107,19 @@ module ForemanDatacenter
97
107
  end
98
108
  end
99
109
 
110
+ def import_interfaces_from_host
111
+ if host
112
+ host.interfaces.each do |interface|
113
+ interfaces.create(
114
+ name: interface.identifier,
115
+ form_factor: ForemanDatacenter::DeviceInterface::DEFAULT_FORM_FACTOR,
116
+ mac_address: interface.mac,
117
+ ip_address: interface.ip
118
+ )
119
+ end
120
+ end
121
+ end
122
+
100
123
  def create_console_ports
101
124
  device_type.console_port_templates.each do |template|
102
125
  console_ports.create(template.attrs_to_copy)
@@ -11,6 +11,7 @@ module ForemanDatacenter
11
11
  validates :name, presence: true, length: {maximum: 30}
12
12
  validates :form_factor, inclusion: {in: FORM_FACTORS}
13
13
  validates :mac_address, length: {maximum: 128}
14
+ validates :ip_address, length: {maximum: 128}
14
15
  validates :description, length: {maximum: 100}
15
16
 
16
17
  def connection
@@ -24,6 +24,24 @@ module ForemanDatacenter
24
24
  end
25
25
  end
26
26
 
27
+ def self.for_host(host)
28
+ fact = host.fact_value_by_name('productname')
29
+ if fact
30
+ device_type = find_by(model: fact.value)
31
+ if device_type
32
+ device_type
33
+ else
34
+ manufacturer = Manufacturer.for_host(host)
35
+ if manufacturer
36
+ create(
37
+ manufacturer: manufacturer,
38
+ model: fact.value
39
+ )
40
+ end
41
+ end
42
+ end
43
+ end
44
+
27
45
  def parent?
28
46
  subdevice_role == 'Parent'
29
47
  end
@@ -3,5 +3,17 @@ module ForemanDatacenter
3
3
  has_many :device_types, :class_name => 'ForemanDatacenter::DeviceType'
4
4
 
5
5
  validates :name, presence: true, uniqueness: true, length: { maximum: 50 }
6
+
7
+ def self.for_host(host)
8
+ fact = host.fact_value_by_name('manufacturer')
9
+ if fact
10
+ manufacturer = find_by(name: fact.value)
11
+ if manufacturer
12
+ manufacturer
13
+ else
14
+ create(name: fact.value)
15
+ end
16
+ end
17
+ end
6
18
  end
7
19
  end
@@ -14,6 +14,7 @@
14
14
  <%= selectable_f f, :form_factor,
15
15
  ForemanDatacenter::DeviceInterface::FORM_FACTORS %>
16
16
  <%= text_f f, :mac_address %>
17
+ <%= text_f f, :ip_address %>
17
18
  <%= checkbox_f f, :mgmt_only, label: 'OOB Management',
18
19
  help_inline: 'This interface is used only for out-of-band management' %>
19
20
  <%= text_f f, :description %>
@@ -34,3 +34,5 @@
34
34
  <% end %>
35
35
  </tbody>
36
36
  </table>
37
+
38
+ <%= will_paginate_with_info @device_types, :more => " - "+_("<b class='select_count'>0</b> selected") %>
@@ -76,5 +76,7 @@
76
76
  </div>
77
77
  </div>
78
78
 
79
+ <%= f.hidden_field :host_id %>
80
+
79
81
  <%= submit_or_cancel f %>
80
82
  <% end %>
@@ -4,6 +4,8 @@
4
4
  <span class="glyphicon glyphicon-transfer"></span>
5
5
  <%= interface.name %>
6
6
  </td>
7
+ <td><%= h interface.mac_address %></td>
8
+ <td><%= h interface.ip_address %></td>
7
9
  <td>
8
10
  <%= link_to interface.connected_interface.device.name,
9
11
  device_path(interface.connected_interface.device) %>
@@ -46,6 +48,9 @@
46
48
  <span class="glyphicon glyphicon-transfer"></span>
47
49
  <%= interface.name %>
48
50
  </td>
51
+ <td><%= h interface.mac_address %></td>
52
+ <td><%= h interface.ip_address %></td>
53
+ <td></td>
49
54
  <td class="text-muted">Not connected</td>
50
55
  <td></td>
51
56
  <td class="text-right">
@@ -1,7 +1,8 @@
1
1
  <% javascript 'foreman_datacenter/devices' %>
2
2
 
3
- <% title _('Devices') %>
4
- <% title_actions display_link_if_authorized(_('New device'), hash_for_new_device_path, class: 'btn btn-success'), help_path %>
3
+ <% title _('Devices') %>
4
+ <% title_actions display_link_if_authorized(_('New device'), hash_for_new_device_path, class: 'btn btn-success'),
5
+ display_link_if_authorized(_('Import from host'), hash_for_import_to_device_path, class: 'btn btn-success') %>
5
6
 
6
7
  <table class="table table-bordered table-striped table-two-pane">
7
8
  <thead>
@@ -40,7 +41,7 @@
40
41
  ),
41
42
  display_delete_if_authorized(
42
43
  hash_for_device_path(:id => device).merge(:auth_object => device, :authorizer => authorizer),
43
- :data => { :confirm => 'Are you sure?'},
44
+ :data => { :confirm => 'Are you sure?' },
44
45
  :action => :destroy
45
46
  )
46
47
  ) %>
@@ -49,3 +50,5 @@
49
50
  <% end %>
50
51
  </tbody>
51
52
  </table>
53
+
54
+ <%= will_paginate_with_info @devices, :more => " - "+_("<b class='select_count'>0</b> selected") %>
@@ -13,6 +13,13 @@
13
13
  :action => :destroy,
14
14
  :class => 'btn btn-danger'
15
15
  ),
16
+ display_link_if_authorized(
17
+ _('Import from host'),
18
+ @device.host ?
19
+ hash_for_edit_device_path(@device, host_id: @device.host.id) :
20
+ hash_for_import_to_device_path(target_device_id: @device.id),
21
+ :class => 'btn btn-success'
22
+ ),
16
23
  help_path %>
17
24
 
18
25
  <ul class="nav nav-tabs">
@@ -0,0 +1,60 @@
1
+ <div class="row form-group">
2
+ <div class="title_filter col-md-6">
3
+ <%= render "common/searchbar",
4
+ auto_complete_controller_name: 'import_to_device' %>
5
+ </div>
6
+ </div>
7
+
8
+ <% if @target_device %>
9
+ <div class="row form-group">
10
+ <div class="col-md-12">
11
+ <label class="col-md-2 control-label required">Target Device</label>
12
+ <div class="col-md-4"><%= @target_device.name %></div>
13
+ </div>
14
+ </div>
15
+ <% end %>
16
+
17
+ <table class="table table-bordered table-striped table-fixed">
18
+ <thead>
19
+ <tr>
20
+ <th>Name</th>
21
+ <th>Operating System</th>
22
+ <th>Environment</th>
23
+ <th>Model</th>
24
+ <th>Actions</th>
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ <% @hosts.each do |host| %>
29
+ <tr>
30
+ <td><%= link_to host %></td>
31
+ <td><%= h host.operatingsystem %></td>
32
+ <td><%= h host.environment %></td>
33
+ <td><%= model_name host %></td>
34
+ <td class="text-right">
35
+ <% if @target_device %>
36
+ <% if host.device %>
37
+ <span class="text-muted">Already has assigned device</span>
38
+ <% else %>
39
+ <%= link_to 'Import to device',
40
+ edit_device_path(@target_device, host_id: host.id),
41
+ class: 'btn btn-sm btn-success' %>
42
+ <% end %>
43
+ <% else %>
44
+ <% if host.device %>
45
+ <%= link_to 'Update assigned device',
46
+ edit_device_path(host.device, host_id: host.id),
47
+ class: 'btn btn-sm btn-info' %>
48
+ <% else %>
49
+ <%= link_to 'Import to device',
50
+ new_device_path(host_id: host.id),
51
+ class: 'btn btn-sm btn-success' %>
52
+ <% end %>
53
+ <% end %>
54
+ </td>
55
+ </tr>
56
+ <% end %>
57
+ </tbody>
58
+ </table>
59
+
60
+ <%= will_paginate_with_info @hosts, :more => " - "+_("<b class='select_count'>0</b> selected") %>
data/config/routes.rb CHANGED
@@ -1,4 +1,8 @@
1
1
  Foreman::Application.routes.draw do
2
+ # TODO: find a better way to do this
3
+ get 'datacenter/import_to_device', to: 'hosts#import_to_device',
4
+ as: 'import_to_device'
5
+
2
6
  scope 'datacenter', module: :foreman_datacenter do
3
7
  resources :sites
4
8
  resources :racks do
@@ -0,0 +1,5 @@
1
+ class AddHostRefToDevices < ActiveRecord::Migration
2
+ def change
3
+ add_reference :devices, :host, index: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddIpAddressToDeviceInterfaces < ActiveRecord::Migration
2
+ def change
3
+ add_column :device_interfaces, :ip_address, :string, limit: 128, default: ''
4
+ end
5
+ end
@@ -55,6 +55,16 @@ module ForemanDatacenter
55
55
  SETTINGS[:foreman_datacenter] = { assets: { precompile: assets_to_precompile } }
56
56
  end
57
57
 
58
+ # Include concerns in this config.to_prepare block
59
+ config.to_prepare do
60
+ begin
61
+ Host::Managed.send(:include, ForemanDatacenter::HostExtensions)
62
+ HostsController.send(:include, ForemanDatacenter::HostsControllerExtensions)
63
+ rescue => e
64
+ Rails.logger.warn "ForemanDatacenter: skipping engine hook (#{e})"
65
+ end
66
+ end
67
+
58
68
  rake_tasks do
59
69
  Rake::Task['db:seed'].enhance do
60
70
  ForemanDatacenter::Engine.load_seed
@@ -1,3 +1,3 @@
1
1
  module ForemanDatacenter
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_datacenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Ivanov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-17 00:00:00.000000000 Z
11
+ date: 2016-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
@@ -80,6 +80,7 @@ files:
80
80
  - app/assets/javascripts/foreman_datacenter/racks.js
81
81
  - app/assets/javascripts/foreman_datacenter/shared.js
82
82
  - app/assets/stylesheets/foreman_datacenter/device_interface_connections.css
83
+ - app/controllers/concerns/foreman_datacenter/hosts_controller_extensions.rb
83
84
  - app/controllers/foreman_datacenter/console_port_templates_controller.rb
84
85
  - app/controllers/foreman_datacenter/console_ports_controller.rb
85
86
  - app/controllers/foreman_datacenter/console_server_port_templates_controller.rb
@@ -116,6 +117,7 @@ files:
116
117
  - app/helpers/foreman_datacenter/power_ports_helper.rb
117
118
  - app/helpers/foreman_datacenter/racks_helper.rb
118
119
  - app/helpers/foreman_datacenter/shared_helper.rb
120
+ - app/models/concerns/foreman_datacenter/host_extensions.rb
119
121
  - app/models/foreman_datacenter/console_port.rb
120
122
  - app/models/foreman_datacenter/console_port_template.rb
121
123
  - app/models/foreman_datacenter/console_server_port.rb
@@ -244,6 +246,7 @@ files:
244
246
  - app/views/foreman_datacenter/sites/index.html.erb
245
247
  - app/views/foreman_datacenter/sites/new.html.erb
246
248
  - app/views/foreman_datacenter/sites/show.html.erb
249
+ - app/views/hosts/import_to_device.html.erb
247
250
  - config/routes.rb
248
251
  - db/migrate/20160727161914_create_sites.rb
249
252
  - db/migrate/20160728123353_create_rack_groups.rb
@@ -267,6 +270,8 @@ files:
267
270
  - db/migrate/20160809112815_create_console_server_ports.rb
268
271
  - db/migrate/20160809113846_create_console_ports.rb
269
272
  - db/migrate/20160816224805_create_device_modules.rb
273
+ - db/migrate/20160824212010_add_host_ref_to_devices.rb
274
+ - db/migrate/20160828200938_add_ip_address_to_device_interfaces.rb
270
275
  - lib/foreman_datacenter/engine.rb
271
276
  - lib/foreman_datacenter/version.rb
272
277
  - lib/foreman_datacenter.rb