crowbar_framework/app/controllers/network_controller.rb
#
# Copyright 2011-2013, Dell
# Copyright 2013-2014, SUSE LINUX Products GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
class NetworkController < BarclampController
# Make a copy of the barclamp controller help
self.help_contents = Array.new(superclass.help_contents)
add_help(:allocate_ip, [:id, :network, :range, :name], [:post])
def allocate_ip
code, message = @service_object.allocate_ip(
params[:id],
params[:network],
params[:range],
params[:name],
params[:suggestion]
)
respond_to do |format|
case code
when 200
format.json { render json: message }
else
format.json do
render json: { error: message }, status: code
end
end
end
end
add_help(:allocate_virtual_ip, [:id, :network, :range, :name], [:post])
def allocate_virtual_ip
code, message = @service_object.allocate_virtual_ip(
params[:id],
params[:network],
params[:range],
params[:name],
params[:suggestion]
)
respond_to do |format|
case code
when 200
format.json { render json: message }
else
format.json do
render json: { error: message }, status: code
end
end
end
end
add_help(:deallocate_virtual_ip, [:id, :network, :name], [:post])
def deallocate_virtual_ip
code, message = @service_object.deallocate_virtual_ip(
params[:id],
params[:network],
params[:name]
)
respond_to do |format|
case code
when 200
format.json { head :ok }
else
format.json do
render json: { error: message }, status: code
end
end
end
end
add_help(:deallocate_ip, [:id, :network, :name], [:post])
def deallocate_ip
code, message = @service_object.deallocate_ip(
params[:id],
params[:network],
params[:name]
)
respond_to do |format|
case code
when 200
format.json { head :ok }
else
format.json do
render json: { error: message }, status: code
end
end
end
end
add_help(:enable_interface, [:id, :network, :name], [:post])
def enable_interface
code, message = @service_object.enable_interface(
params[:id],
params[:network],
params[:name]
)
respond_to do |format|
case code
when 200
format.json { render json: message }
else
format.json do
render json: { error: message }, status: code
end
end
end
end
add_help(:disable_interface, [:id, :network, :name], [:post])
def disable_interface
respond_to do |format|
format.json do
render json: { error: "Disabling is unsupported" }, status: 500
end
end
# code, message = @service_object.disable_interface(
# params[:id],
# params[:network],
# params[:name]
# )
# respond_to do |format|
# case code
# when 200
# format.json { head :ok }
# else
# format.json do
# render json: { error: message }, status: code
# end
# end
# end
end
def switch
@port_start = 1
@sum = 0
@vports = {}
@groups = {}
@switches = {}
@nodes = {}
nodes = if params[:node]
Node.find_nodes_by_name params[:node]
else
Node.all
end
nodes.each do |node|
@sum = @sum + node.name.hash
@nodes[node.handle] = {
alias: node.alias,
description: node.description(false, true),
status: node.status
}
@groups[node.group] = {
automatic: !node.display_set?("group"),
nodes: {},
status: {
"ready" => 0,
"failed" => 0,
"pending" => 0,
"unready" => 0,
"building" => 0,
"crowbar_upgrade" => 0,
"unknown" => 0
}
} unless @groups.key? node.group
@groups[node.group][:nodes][node.group_order] = node.handle
@groups[node.group][:status][node.status] = (@groups[node.group][:status][node.status] || 0).to_i + 1
node_nics(node).each do |switch|
if switch[:switch]
@switches[switch[:switch]] = {
nodes: {},
max_port: (23 + @port_start),
status: {
"ready" => 0,
"failed" => 0,
"pending" => 0,
"unready" => 0,
"building" => 0,
"crowbar_upgrade" => 0,
"unknown" => 0
}
} unless @switches.key? switch[:switch]
port = if switch["switch_port"] == -1 or switch["switch_port"] == "-1"
@vports[switch[:switch]] = 1 + (@vports[switch[:switch]] || 0)
else
switch[:port]
end
@port_start = 0 if port == 0
@switches[switch[:switch]][:max_port] = port if port > @switches[switch[:switch]][:max_port]
@switches[switch[:switch]][:nodes][port] = {
handle: node.handle,
intf: switch[:intf],
mac: switch[:mac]
}
@switches[switch[:switch]][:status][node.status] = (@switches[switch[:switch]][:status][node.status] || 0).to_i + 1
end
end
end
end
def vlan
net_bc = RoleObject.find_role_by_name "network-config-default"
if net_bc.barclamp == "network"
@vlans = net_bc.default_attributes["network"]["networks"]
end
@nodes = {}
Node.all.each do |node|
@nodes[node.handle] = { alias: node.alias, description: node.description(false, true), vlans: {} }
@nodes[node.handle][:vlans] = node_vlans(node)
end
end
def nodes
net_bc = RoleObject.find_role_by_name "network-config-default"
@modes = []
@active_mode = @mode = net_bc.default_attributes["network"]["mode"]
# first, we need a mode list
net_bc.default_attributes["network"]["conduit_map"].each do |conduit|
mode = conduit["pattern"].split("/")[0]
@modes << mode unless @modes.include? mode
@mode = params[:mode] if @modes.include? params[:mode]
end
# now we need to complete conduit list for the mode (we have to inspect all conduits!)
@conduits = []
net_bc.default_attributes["network"]["conduit_map"].each do |conduit|
mode = conduit["pattern"].split("/")[0]
conduit["conduit_list"].each { |c, details| @conduits << c unless @conduits.include? c } if mode == @mode
end
@nodes = {}
Node.all.each do |node|
@nodes[node.handle] = {
alias: node.alias,
description: node.description,
model: node.hardware,
bus: node.bus_order,
conduits: node.conduit_to_if_map
}
end
@conduits = @conduits.sort
end
private
def node_vlans(node)
nv = {}
node.networks.each do |vlan, vdetails|
nv[vlan] = { address: vdetails["address"], active: vdetails["use_vlan"] }
end
nv
end
def node_nics(node)
switches = []
begin
# list the interfaces
if_list = node.crowbar_ohai["detected"]["network"].keys
# this is a virtual switch if ALL the interfaces are virtual
physical = if_list.map{ |intf| node.crowbar_ohai["switch_config"][intf]["switch_name"] != "-1" }.include? false
if_list.each do | intf |
connected = !physical #if virtual, then all ports are connected
raw = node.crowbar_ohai["switch_config"][intf]
s_name = raw["switch_name"] || -1
s_unit = raw["switch_unit"] || -1
if s_name == -1 or s_name == "-1"
s_name = I18n.t("network.controller.virtual") + ":" + intf.split(".")[0]
s_unit = nil
else
connected = true
end
if connected
s_name= "#{s_name}:#{s_unit}" unless s_unit.nil?
switches << { switch: s_name, intf: intf, port: raw["switch_port"].to_i, mac: raw["mac"] }
end
end
rescue Exception=>e
Rails.logger.debug("could not build interface/switch list for #{node.name} due to #{e.message}")
end
switches
end
protected
def initialize_service
@service_object = NetworkService.new
end
end