Skip to content

Commit

Permalink
WIP draft of openshift provider
Browse files Browse the repository at this point in the history
Contains provider, parser, refresher,
refresh worker and persistence of container_project and container_route
  • Loading branch information
abonas committed Apr 14, 2015
1 parent 858e13c commit e318a67
Show file tree
Hide file tree
Showing 19 changed files with 256 additions and 36 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.1", :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
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 @@ -10,6 +10,9 @@ def textual_group_properties

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

Expand Down Expand Up @@ -60,6 +63,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
1 change: 1 addition & 0 deletions vmdb/app/models/ems_container.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
class EmsContainer < ExtManagementSystem
SUBCLASSES = %w(
EmsKubernetes
EmsOpenshift
)

def self.supported_subclasses
Expand Down
36 changes: 1 addition & 35 deletions vmdb/app/models/ems_kubernetes.rb
Original file line number Diff line number Diff line change
@@ -1,7 +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
include ContainerProviderMixin

default_value_for :port, 6443

Expand All @@ -22,39 +20,7 @@ def self.raw_connect(hostname, port)
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)
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
end
34 changes: 34 additions & 0 deletions vmdb/app/models/ems_openshift.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
class EmsOpenshift < EmsContainer
include ContainerProviderMixin

# TODO: what about k8s entities?
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)
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

def kubernetes_connect
require 'kubeclient'
kube = Kubeclient::Client.new(api_endpoint)
# TODO: support real authentication using certificates
kube.ssl_options(:verify_ssl => OpenSSL::SSL::VERIFY_NONE)
kube
end
end
43 changes: 43 additions & 0 deletions vmdb/app/models/ems_refresh/parsers/openshift.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
module EmsRefresh::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
)
p new_result
new_result
end

def parse_route(route)
new_result = parse_base_item(route)
new_result.merge!(
# TODO: persist tls
:host => 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
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.kubernetes_connect.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]
child_keys = [:container_nodes, :container_groups, :container_services,
:container_routes, :container_projects]
# Save and link other subsections
child_keys.each do |k|
send("save_#{k}_inventory", ems, hashes[k], target)
Expand All @@ -10,6 +11,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
42 changes: 42 additions & 0 deletions vmdb/app/models/mixins/container_provider_mixin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
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

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
raw_api_endpoint(hostname, port)
end

def connect(_options = {})
self.class.raw_connect(hostname, port)
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
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 @@ -339,6 +341,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
21 changes: 21 additions & 0 deletions vmdb/db/migrate/20150414085027_create_container_routes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
class CreateContainerRoutes < ActiveRecord::Migration
def up
create_table :container_routes do |t|
t.string :ems_ref
t.string :name
t.timestamp :creation_timestamp
t.string :resource_version
t.string :namespace
t.string :host
t.string :service_name
t.string :path
t.belongs_to :ems, :type => :bigint
end
add_index :container_routes, :ems_id
end

def down
remove_index :container_routes, :ems_id
drop_table :container_routes
end
end
18 changes: 18 additions & 0 deletions vmdb/db/migrate/20150414094834_create_container_projects.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class CreateContainerProjects < ActiveRecord::Migration
def up
create_table :container_projects do |t|
t.string :ems_ref
t.string :name
t.timestamp :creation_timestamp
t.string :resource_version
t.string :display_name
t.belongs_to :ems, :type => :bigint
end
add_index :container_projects, :ems_id
end

def down
remove_index :container_projects, :ems_id
drop_table :container_projects
end
end
4 changes: 4 additions & 0 deletions vmdb/lib/workers/ems_refresh_worker_openshift.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
require 'workers/ems_refresh_worker'

class EmsRefreshWorkerOpenshift < EmsRefreshWorker
end
3 changes: 3 additions & 0 deletions vmdb/spec/factories/ext_management_system.rb
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@
factory :ems_kubernetes, :class => "EmsKubernetes", :parent => :ems_container do
end

factory :ems_openshift, :class => "EmsOpenshift", :parent => :ems_container do
end

# Leaf classes for configuration_manager

factory :configuration_manager_foreman, :class => "ConfigurationManagerForeman", :parent => :configuration_manager do
Expand Down
1 change: 1 addition & 0 deletions vmdb/spec/models/ext_management_system_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
foreman_configuration
foreman_provisioning
kubernetes
openshift
openstack
openstack_infra
rhevm
Expand Down

0 comments on commit e318a67

Please sign in to comment.