Skip to content

Commit

Permalink
Addition of OpenShift provider
Browse files Browse the repository at this point in the history
This change Contains:
provider, parser, refresher,
refresh worker, persistence of container_project and container_route
and autofill of default port values for both containers providers in the UI
  • Loading branch information
abonas committed Apr 26, 2015
1 parent a33163d commit 5fe910c
Show file tree
Hide file tree
Showing 19 changed files with 283 additions and 58 deletions.
1 change: 1 addition & 0 deletions lib/Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ gem "more_core_extensions", "~>1.2.0", :require => false
gem "nokogiri", "~>1.5.0", :require => false
gem "ovirt", "~>0.4.2", :require => false
gem "kubeclient", ">=0.1.11", :require => false
gem "openshift_client", ">=0.0.3", :require => false
gem "rest-client", :require => false, :git => "git://github.com/rest-client/rest-client.git", :ref => "08480eb86aef1e"
gem "parallel", "~>0.5.21", :require => false
gem "Platform", "=0.4.0", :require => false
Expand Down
4 changes: 4 additions & 0 deletions vmdb/app/controllers/ems_common.rb
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,10 @@ def get_form_vars
@edit[:new][:emstype] = params[:server_emstype]
if ["openstack", "openstack_infra"].include?(params[:server_emstype])
@edit[:new][:port] = @ems.port ? @ems.port : 5000
elsif params[:server_emstype] == EmsKubernetes.ems_type
@edit[:new][:port] = @ems.port ? @ems.port : EmsKubernetes.new.port
elsif params[:server_emstype] == EmsOpenshift.ems_type
@edit[:new][:port] = @ems.port ? @ems.port : EmsOpenshift.new.port
else
@edit[:new][:port] = nil
end
Expand Down
15 changes: 15 additions & 0 deletions vmdb/app/helpers/ems_container_helper/textual_summary.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ def textual_group_properties

def textual_group_relationships
items = %w(container_nodes container_services container_groups)
if @ems.kind_of?(EmsOpenshift)
items.concat(%w(container_routes container_projects))
end
items.collect { |m| send("textual_#{m}") }.flatten.compact
end

Expand Down Expand Up @@ -72,6 +75,18 @@ def textual_refresh_status
}
end

def textual_container_routes
count_of_routes = @ems.number_of(:container_routes)
label = "Container Routes"
{:label => label, :image => "container_route", :value => count_of_routes}
end

def textual_container_projects
count_of_projects = @ems.number_of(:container_projects)
label = "Container Projects"
{:label => label, :image => "container_project", :value => count_of_projects}
end

def textual_container_nodes
count_of_nodes = @ems.number_of(:container_nodes)
label = "Container Nodes"
Expand Down
7 changes: 7 additions & 0 deletions vmdb/app/models/container_project.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class ContainerProject < ActiveRecord::Base
include CustomAttributeMixin
include ReportableMixin
belongs_to :ext_management_system, :foreign_key => "ems_id"

has_many :labels, :class_name => CustomAttribute, :as => :resource, :conditions => {:section => "labels"}
end
7 changes: 7 additions & 0 deletions vmdb/app/models/container_route.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class ContainerRoute < ActiveRecord::Base
include CustomAttributeMixin
include ReportableMixin

belongs_to :ext_management_system, :foreign_key => "ems_id"
has_many :labels, :class_name => CustomAttribute, :as => :resource, :conditions => {:section => "labels"}
end
60 changes: 3 additions & 57 deletions vmdb/app/models/ems_kubernetes.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
class EmsKubernetes < EmsContainer
has_many :container_nodes, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_groups, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_services, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_replication_controllers, :foreign_key => :ems_id, :dependent => :destroy
include ContainerProviderMixin

default_value_for :port, 6443

Expand All @@ -14,62 +11,11 @@ def self.description
@description ||= "Kubernetes".freeze
end

def self.raw_connect(hostname, port)
require 'kubeclient'
api_endpoint = raw_api_endpoint(hostname, port)
kube = Kubeclient::Client.new(api_endpoint)
# TODO: support real authentication using certificates
kube.ssl_options(:verify_ssl => OpenSSL::SSL::VERIFY_NONE)
kube
end

def self.raw_api_endpoint(hostname, port)
URI::HTTPS.build(:host => hostname, :port => port.to_i)
end

# UI methods for determining availability of fields
def supports_port?
true
end

def api_endpoint
self.class.raw_api_endpoint(hostname, port)
end

def connect(_options = {})
self.class.raw_connect(hostname, port)
def self.raw_connect(hostname, port, _options = {})
kubernetes_connect(hostname, port)
end

def self.event_monitor_class
MiqEventCatcherKubernetes
end

def authentication_check
# TODO: support real authentication using certificates
[true, ""]
end

def verify_credentials(_auth_type = nil, _options = {})
# TODO: support real authentication using certificates
true
end

def authentication_status_ok?(_type = nil)
# TODO: support real authentication using certificates
true
end

# required by aggregate_hardware
def all_computer_system_ids
MiqPreloader.preload(container_nodes, :computer_system)
container_nodes.collect { |n| n.computer_system.id }
end

def aggregate_logical_cpus(targets = nil)
aggregate_hardware(:computer_systems, :logical_cpus, targets)
end

def aggregate_memory(targets = nil)
aggregate_hardware(:computer_systems, :memory_cpu, targets)
end
end
30 changes: 30 additions & 0 deletions vmdb/app/models/ems_openshift.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class EmsOpenshift < EmsContainer
include ContainerProviderMixin

has_many :container_routes, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_projects, :foreign_key => :ems_id, :dependent => :destroy

default_value_for :port, 8443

def self.ems_type
@ems_type ||= "openshift".freeze
end

def self.description
@description ||= "OpenShift".freeze
end

def self.raw_connect(hostname, port, service = nil)
service ||= "openshift"
send("#{service}_connect", hostname, port)
end

def self.openshift_connect(hostname, port)
require 'openshift_client'
api_endpoint = raw_api_endpoint(hostname, port)
osclient = OpenshiftClient::Client.new(api_endpoint)
# TODO: support real authentication using certificates
osclient.ssl_options(:verify_ssl => OpenSSL::SSL::VERIFY_NONE)
osclient
end
end
44 changes: 44 additions & 0 deletions vmdb/app/models/ems_refresh/parsers/openshift.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
module EmsRefresh
module Parsers
class Openshift < Kubernetes
def ems_inv_to_hashes(inventory)
super(inventory)
get_projects(inventory)
get_routes(inventory)
EmsRefresh.log_inv_debug_trace(@data, "data:")
@data
end

def get_routes(inventory)
process_collection(inventory["route"], :container_routes) { |n| parse_route(n) }
end

def get_projects(inventory)
process_collection(inventory["project"], :container_projects) { |n| parse_project(n) }
end

def parse_project(project)
new_result = parse_base_item(project)
new_result.except!(:namespace)
new_result.merge!(
:labels => parse_labels(project),
:display_name => project.displayName
)
new_result
end

def parse_route(route)
new_result = parse_base_item(route)
new_result.merge!(
# TODO: persist tls
:host_name => route.host,
:labels => parse_labels(route),
# TODO: this part needs to be modified to service_id instead
:service_name => route.serviceName,
:path => route.path
)
new_result
end
end
end
end
14 changes: 14 additions & 0 deletions vmdb/app/models/ems_refresh/refreshers/openshift_refresher.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module EmsRefresh
module Refreshers
class OpenshiftRefresher < BaseRefresher
include EmsRefresherMixin

def parse_inventory(ems, _targets = nil)
all_entities = ems.with_provider_connection(&:all_entities)
all_entities.merge!(ems.with_provider_connection(:service => EmsKubernetes.ems_type, &:all_entities))
EmsRefresh.log_inv_debug_trace(all_entities, "inv_hash:")
EmsRefresh::Parsers::Openshift.ems_inv_to_hashes(all_entities)
end
end
end
end
35 changes: 34 additions & 1 deletion vmdb/app/models/ems_refresh/save_inventory_container.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
module EmsRefresh::SaveInventoryContainer
def save_ems_container_inventory(ems, hashes, target = nil)
target = ems if target.nil?
child_keys = [:container_nodes, :container_groups, :container_services, :container_replication_controllers]
child_keys = [:container_nodes, :container_groups, :container_services,
:container_replication_controllers, :container_routes, :container_projects]

# Save and link other subsections
child_keys.each do |k|
Expand All @@ -11,6 +12,38 @@ def save_ems_container_inventory(ems, hashes, target = nil)
ems.save!
end

def save_container_projects_inventory(ems, hashes, target = nil)
return if hashes.nil?
target = ems if target.nil?

ems.container_projects(true)
deletes = if target.kind_of?(ExtManagementSystem)
ems.container_projects.dup
else
[]
end

save_inventory_multi(:container_projects, ems, hashes, deletes, [:ems_ref],
:labels)
store_ids_for_new_records(ems.container_projects, hashes, :ems_ref)
end

def save_container_routes_inventory(ems, hashes, target = nil)
return if hashes.nil?
target = ems if target.nil?

ems.container_routes(true)
deletes = if target.kind_of?(ExtManagementSystem)
ems.container_routes.dup
else
[]
end

save_inventory_multi(:container_routes, ems, hashes, deletes, [:ems_ref],
:labels)
store_ids_for_new_records(ems.container_routes, hashes, :ems_ref)
end

def save_container_nodes_inventory(ems, hashes, target = nil)
return if hashes.nil?
target = ems if target.nil?
Expand Down
5 changes: 5 additions & 0 deletions vmdb/app/models/miq_ems_refresh_worker_openshift.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class MiqEmsRefreshWorkerOpenshift < MiqEmsRefreshWorker
def self.ems_class
EmsOpenshift
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ module MiqServer::WorkerManagement::Monitor::ClassNames
MiqEmsRefreshWorkerForemanConfiguration
MiqEmsRefreshWorkerForemanProvisioning
MiqEmsRefreshWorkerKubernetes
MiqEmsRefreshWorkerOpenshift
MiqEmsRefreshWorkerMicrosoft
MiqEmsRefreshWorkerRedhat
MiqEmsRefreshWorkerOpenstack
Expand Down Expand Up @@ -60,6 +61,7 @@ module MiqServer::WorkerManagement::Monitor::ClassNames
MiqEmsRefreshWorkerForemanConfiguration
MiqEmsRefreshWorkerForemanProvisioning
MiqEmsRefreshWorkerKubernetes
MiqEmsRefreshWorkerOpenshift
MiqEmsRefreshWorkerMicrosoft
MiqEmsRefreshWorkerRedhat
MiqEmsRefreshWorkerOpenstack
Expand Down
67 changes: 67 additions & 0 deletions vmdb/app/models/mixins/container_provider_mixin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
module ContainerProviderMixin
extend ActiveSupport::Concern

included do
has_many :container_nodes, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_groups, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_services, :foreign_key => :ems_id, :dependent => :destroy
has_many :container_replication_controllers, :foreign_key => :ems_id, :dependent => :destroy
end

module ClassMethods
def raw_api_endpoint(hostname, port)
URI::HTTPS.build(:host => hostname, :port => port.to_i)
end

def kubernetes_connect(hostname, port)
require 'kubeclient'
api_endpoint = raw_api_endpoint(hostname, port)
kubeclient = Kubeclient::Client.new(api_endpoint)
# TODO: support real authentication using certificates
kubeclient.ssl_options(:verify_ssl => OpenSSL::SSL::VERIFY_NONE)
kubeclient
end
end

# UI methods for determining availability of fields
def supports_port?
true
end

def api_endpoint
self.class.raw_api_endpoint(hostname, port)
end

def connect(options = {})
self.class.raw_connect(hostname, port, options[:service])
end

def authentication_check
# TODO: support real authentication using certificates
[true, ""]
end

def verify_credentials(_auth_type = nil, _options = {})
# TODO: support real authentication using certificates
true
end

def authentication_status_ok?(_type = nil)
# TODO: support real authentication using certificates
true
end

# required by aggregate_hardware
def all_computer_system_ids
MiqPreloader.preload(container_nodes, :computer_system)
container_nodes.collect { |n| n.computer_system.id }
end

def aggregate_logical_cpus(targets = nil)
aggregate_hardware(:computer_systems, :logical_cpus, targets)
end

def aggregate_memory(targets = nil)
aggregate_hardware(:computer_systems, :memory_cpu, targets)
end
end
3 changes: 3 additions & 0 deletions vmdb/config/vmdb.tmpl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ ems_refresh:
full_refresh_threshold: 100
kubernetes:
:refresh_interval: 15.minutes
openshift:
:refresh_interval: 15.minutes
raise_vm_snapshot_complete_if_created_within: 15.minutes
refresh_interval: 24.hours
scvmm:
Expand Down Expand Up @@ -352,6 +354,7 @@ workers:
:ems_refresh_worker_foreman_configuration: {}
:ems_refresh_worker_foreman_provisioning: {}
:ems_refresh_worker_kubernetes: {}
:ems_refresh_worker_openshift: {}
:ems_refresh_worker_microsoft: {}
:ems_refresh_worker_redhat: {}
:ems_refresh_worker_openstack: {}
Expand Down
Loading

0 comments on commit 5fe910c

Please sign in to comment.