dtk_crd_parser 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/crd_parser/base_class/helper_mixins.rb +52 -0
- data/lib/crd_parser/base_class.rb +8 -0
- data/lib/crd_parser/component/attribute.rb +18 -0
- data/lib/crd_parser/component.rb +45 -0
- data/lib/crd_parser/component_def/attribute_type_info.rb +20 -0
- data/lib/crd_parser/component_def.rb +60 -0
- data/lib/crd_parser.rb +15 -0
- metadata +50 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e69f417b48d667384312f79a580f591788d3e677
|
4
|
+
data.tar.gz: e77320a777a0c480e2defc94db3c3660796215bf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7009538c93dc66dcaa01df238cef75eeea2b0d057582c24a6dff709c48cfac148dea0bb11f7f2503c08f7ac4a85b7137a76fc761cbe3f1a99c12b31a9b8ebe11
|
7
|
+
data.tar.gz: c19e34dad7e41474b19460ad95efba219b4ba4c9d952605460209f0afc6bfbb25c0e94bbe85e94452d6f03606b98710ef7f7ec379b180b11f66c830dfa059ff3
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module DTK::CrdParser
|
2
|
+
class BaseClass
|
3
|
+
module Helper
|
4
|
+
module ClassAndInstanceMixin
|
5
|
+
# Helper functions want to have available in all classes
|
6
|
+
|
7
|
+
def fail_if_not_type(object, type)
|
8
|
+
if object.kind_of?(type)
|
9
|
+
object
|
10
|
+
else
|
11
|
+
fail "Expected a #{type}, but given a '#{object.class}'"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def fail_if_not_concrete(parent)
|
16
|
+
klass = (parent.kind_of?(::Module) ? parent : parent.class)
|
17
|
+
the_method = "The method"
|
18
|
+
if caller.first =~ /in `(.+)'/
|
19
|
+
method_name = $1
|
20
|
+
the_method << " '#{method_name}'"
|
21
|
+
end
|
22
|
+
fail "#{the_method} is not defined in the concrete class #{klass}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def isOnSpecificNode(actionComponent)
|
26
|
+
actionComponent.include? "/"
|
27
|
+
end
|
28
|
+
|
29
|
+
def destructureActionComponent(actionComponent)
|
30
|
+
# regex to match component: module::name[attrName].action
|
31
|
+
regex = /(.*)::(.*)\[(.*)\].?(.*)/
|
32
|
+
# if component on node group node, get full name first
|
33
|
+
# i.e ec2::node[ng-1]/(node-utility::ssh-access[ubuntu])
|
34
|
+
nodeName, actionComponent = actionComponent.match(/(.*)\/(.*)/).captures if isOnSpecificNode(actionComponent)
|
35
|
+
compModule, compName, attributeName, action = actionComponent.match(regex).captures
|
36
|
+
action = !action.empty? ? action.to_sym : :create
|
37
|
+
|
38
|
+
if(compModule.nil? || compName.nil? || attributeName.nil?)
|
39
|
+
raise `Could not resolve component module, name or attribute name for component: #{actionComponent}`
|
40
|
+
end
|
41
|
+
{
|
42
|
+
moduleName: compModule,
|
43
|
+
componentName: compName,
|
44
|
+
attributeName: attributeName,
|
45
|
+
action: action
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DTK::CrdParser
|
2
|
+
class Component
|
3
|
+
class Attribute < BaseClass
|
4
|
+
def initialize(name, value)
|
5
|
+
@name = name
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.create_from_kube(attribute)
|
10
|
+
new Attribute(attribute[:name], attribute[:value])
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
attr_reader :name, :value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module DTK::CrdParser
|
2
|
+
class Component < BaseClass
|
3
|
+
require_relative('component/attribute')
|
4
|
+
|
5
|
+
MODE_DEFAULT = :component_instance
|
6
|
+
def initialize(name, component_def, attributes)
|
7
|
+
@name = name
|
8
|
+
@component_def = component_def # this wil point to the corresponding component def
|
9
|
+
@attributes = attributes # array that has an Attribute object for each attribute; these are name-value pairs
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create_from_kube(client, component_instance, component_name)
|
13
|
+
puts component_instance
|
14
|
+
unless client.discovered
|
15
|
+
client.discover
|
16
|
+
end
|
17
|
+
puts client.methods - Object.methods
|
18
|
+
component_instance_obj = client.get_component(component_instance[:name], component_instance[:namespace])
|
19
|
+
puts component_instance_obj
|
20
|
+
component_def = ComponentDef.create_from_kube(client, component_instance_obj, component_name)
|
21
|
+
component_attributes = getComponentAttributes(component_name, component_instance_obj[:spec][:components])
|
22
|
+
attributes = []
|
23
|
+
component_attributes.each do |attr|
|
24
|
+
attributes.push Attribute.create_from_kube(attr)
|
25
|
+
end
|
26
|
+
Component.new(component_name, component_def, attributes)
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def self.getComponentAttributes(fullComponentName, components)
|
32
|
+
fullComponentName.gsub!('_', '-')
|
33
|
+
component = components.each do |component|
|
34
|
+
componentObj = component[fullComponentName]
|
35
|
+
if(componentObj && componentObj.is_a?(Kubeclient::Resource))
|
36
|
+
return componentObj[:attributes]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader :name, :component_def, :attributes
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DTK::CrdParser
|
2
|
+
class ComponentDef
|
3
|
+
class AttributeTypeInfo < BaseClass
|
4
|
+
def initialize(params)
|
5
|
+
@name = params[:name]
|
6
|
+
@type = params[:type]
|
7
|
+
@required = params[:required] || false
|
8
|
+
@dynamic = params[:dynamic] || false
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.resolveAttr(attribute)
|
12
|
+
new AttributeTypeInfo(attribute)
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
attr_reader :name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module DTK::CrdParser
|
2
|
+
class ComponentDef < BaseClass
|
3
|
+
require_relative('component_def/attribute_type_info')
|
4
|
+
|
5
|
+
MODE_DEFAULT = :component_instance
|
6
|
+
|
7
|
+
def initialize(metadata, componentDefAction, componentDefAttributes)
|
8
|
+
@name = metadata[:name]
|
9
|
+
@namespace = metadata[:namespace]
|
10
|
+
@resourceVersion = metadata[:resourceVersion]
|
11
|
+
|
12
|
+
@bash_script = componentDefAction[:bash_script]
|
13
|
+
@entrypoint = componentDefAction[:entrypoint]
|
14
|
+
@type = componentDefAction[:type]
|
15
|
+
|
16
|
+
@attribute_type_info = componentDefAttributes
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.create_from_kube(client, component_instance, component_def_name)
|
20
|
+
puts 'COMPONENT DEF'
|
21
|
+
module_ref = resolveModuleReference(component_instance.module_refs, component_def_name, destructureActionComponent(component_def_name)[:moduleName])
|
22
|
+
componentDef = client.get_componentdef(component_def_name, module_ref[:namespace])
|
23
|
+
|
24
|
+
name = componentDef[:metadata][:name]
|
25
|
+
namespace = componentDef[:metadata][:namespace]
|
26
|
+
resourceVersion = componentDef[:metadata][:namespace]
|
27
|
+
|
28
|
+
componentDefSpec = componentDef[:spec]
|
29
|
+
componentDefAction = componentDefSpec[:actions][component.action.to_sym]
|
30
|
+
componentDefAttributes = []
|
31
|
+
|
32
|
+
componentDefSpec[:attributes].each do |attribute|
|
33
|
+
componentDefAttributes.push AttributeTypeInfo.resolveAttr(attribute)
|
34
|
+
end
|
35
|
+
|
36
|
+
metadata = {
|
37
|
+
name: name,
|
38
|
+
namespace: namespace,
|
39
|
+
resourceVersion: resourceVersion
|
40
|
+
}
|
41
|
+
|
42
|
+
ComponentDef.new(metadata, componentDefAction, componentDefAttributes)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def self.resolveModuleReference(module_refs, component_full_name, module_name)
|
48
|
+
module_ref = module_refs.find { |module_ref| module_ref[:name].gsub!('_', '-') == module_name.gsub!('_', '-') }
|
49
|
+
if(module_ref.nil?)
|
50
|
+
raise "Could not resolve module reference for component #{component_full_name} in component instance. Expected to find: #{module_name}"
|
51
|
+
end
|
52
|
+
module_ref
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
attr_reader :name, :namespace, :attribute_type_info, :bash_script, :entrypoint, :type
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
data/lib/crd_parser.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module DTK
|
2
|
+
module DTK::CrdParser
|
3
|
+
require_relative('crd_parser/base_class')
|
4
|
+
|
5
|
+
require_relative('crd_parser/component')
|
6
|
+
require_relative('crd_parser/component_def')
|
7
|
+
|
8
|
+
def self.parse_crd_to_component(client, component_instance, component_name)
|
9
|
+
#component instance has a name and a namespace
|
10
|
+
#client is kube client
|
11
|
+
#component name is, for example, network-aws::vpc[vpc1]
|
12
|
+
Component.create_from_kube(client, component_instance, component_name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dtk_crd_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- DTK
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-28 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Parse kubernetes DTK crd to ruby in memory object
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/crd_parser.rb
|
20
|
+
- lib/crd_parser/base_class.rb
|
21
|
+
- lib/crd_parser/base_class/helper_mixins.rb
|
22
|
+
- lib/crd_parser/component.rb
|
23
|
+
- lib/crd_parser/component/attribute.rb
|
24
|
+
- lib/crd_parser/component_def.rb
|
25
|
+
- lib/crd_parser/component_def/attribute_type_info.rb
|
26
|
+
homepage: https://rubygems.org/gems/dtk_crd_parser
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata: {}
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 2.5.2.1
|
47
|
+
signing_key:
|
48
|
+
specification_version: 4
|
49
|
+
summary: Parse kubernetes DTK crd to ruby in memory object!
|
50
|
+
test_files: []
|