genprovider 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +8 -0
- data/CHANGELOG~ +4 -0
- data/Gemfile +4 -0
- data/LICENSE +58 -0
- data/README.rdoc +50 -0
- data/Rakefile +6 -0
- data/bin/genprovider +256 -0
- data/bin/regprovider +105 -0
- data/features/003-create.feature +10 -0
- data/features/004-modify.feature +9 -0
- data/features/005-delete.feature +7 -0
- data/features/datatypes.feature +13 -0
- data/features/ensure-format.feature +28 -0
- data/features/have-instances.feature +19 -0
- data/features/mof/trivial.mof +20 -0
- data/features/registration.feature +12 -0
- data/features/run-genprovider.feature +10 -0
- data/features/show-context.feature +9 -0
- data/features/step_definitions/genprovider.rb +52 -0
- data/features/step_definitions/mof.rb +3 -0
- data/features/step_definitions/registration.rb +21 -0
- data/features/step_definitions/wbemcli.rb +58 -0
- data/features/support/env.rb +20 -0
- data/genprovider.gemspec +36 -0
- data/lib/genprovider/class.rb +200 -0
- data/lib/genprovider/classinfo.rb +88 -0
- data/lib/genprovider/output.rb +104 -0
- data/lib/genprovider/provider.rb +721 -0
- data/lib/genprovider/rdoc.rb +149 -0
- data/lib/genprovider/registration.rb +22 -0
- data/lib/genprovider/testcase.rb +139 -0
- data/lib/genprovider/version.rb +3 -0
- data/lib/genprovider.rb +35 -0
- data/samples/mof/LMI_Embedded.mof +6 -0
- data/samples/mof/RCP_ArrayDataTypes.mof +27 -0
- data/samples/mof/RCP_ClassMethod.mof +7 -0
- data/samples/mof/RCP_ComplexMethod.mof +14 -0
- data/samples/mof/RCP_IndicationGenerator.mof +13 -0
- data/samples/mof/RCP_PassCData.mof +10 -0
- data/samples/mof/RCP_ShowContext.mof +11 -0
- data/samples/mof/RCP_SimpleClass.mof +7 -0
- data/samples/mof/RCP_SimpleDataTypes.mof +27 -0
- data/samples/mof/RCP_SimpleMethod.mof +9 -0
- data/samples/mof/qualifiers.mof +20 -0
- data/samples/provider/lmi_embedded.rb +148 -0
- data/samples/provider/rcp_array_data_types.rb +219 -0
- data/samples/provider/rcp_class_method.rb +54 -0
- data/samples/provider/rcp_complex_method.rb +170 -0
- data/samples/provider/rcp_pass_c_data.rb +130 -0
- data/samples/provider/rcp_show_context.rb +134 -0
- data/samples/provider/rcp_simple_class.rb +124 -0
- data/samples/provider/rcp_simple_data_types.rb +152 -0
- data/samples/provider/rcp_simple_method.rb +143 -0
- data/samples/registration/LMI_Embedded.registration +7 -0
- data/samples/registration/RCP_ArrayDataTypes.registration +7 -0
- data/samples/registration/RCP_ClassMethod.registration +8 -0
- data/samples/registration/RCP_ComplexMethod.registration +8 -0
- data/samples/registration/RCP_PassCData.registration +7 -0
- data/samples/registration/RCP_ShowContext.registration +7 -0
- data/samples/registration/RCP_SimpleDataTypes.registration +7 -0
- data/samples/registration/RCP_SimpleMethod.registration +8 -0
- data/samples/sfcb.reg/RCP_ComputerSystem.reg +5 -0
- data/samples/sfcb.reg/RCP_OSProcess.reg +5 -0
- data/samples/sfcb.reg/RCP_OperatingSystem.reg +5 -0
- data/samples/sfcb.reg/RCP_PhysicalMemory.reg +5 -0
- data/samples/sfcb.reg/RCP_Processor.reg +5 -0
- data/samples/sfcb.reg/RCP_RunningOS.reg +5 -0
- data/samples/sfcb.reg/RCP_SimpleClass.reg +5 -0
- data/samples/sfcb.reg/RCP_UnixProcess.reg +5 -0
- data/sfcbd +4 -0
- data/stress.sh +4 -0
- data/tasks/clean.rake +4 -0
- data/tasks/doc.rake +16 -0
- data/tasks/features.rake +8 -0
- data/tasks/prepstage.rake +16 -0
- data/tasks/registration.rake +10 -0
- data/tasks/sfcb.rake +3 -0
- data/tasks/test.rake +10 -0
- data/test/env.rb +23 -0
- data/test/helper.rb +23 -0
- data/test/mkreg.rb +32 -0
- data/test/mof/RCP_ClassMethod.rb +15 -0
- data/test/mof/RCP_ComplexMethod.rb +16 -0
- data/test/mof/RCP_SimpleMethod.rb +15 -0
- data/test/registration.rb +37 -0
- data/test/sfcb.rb +94 -0
- data/test/test_lmi_embedded.rb +64 -0
- data/test/test_rcp_array_data_types.rb +140 -0
- data/test/test_rcp_class_method.rb +31 -0
- data/test/test_rcp_complex_method.rb +68 -0
- data/test/test_rcp_simple_data_types.rb +66 -0
- data/test/test_rcp_simple_method.rb +47 -0
- data/valgrind +8 -0
- metadata +288 -0
@@ -0,0 +1,149 @@
|
|
1
|
+
#
|
2
|
+
# Genprovider::Class
|
3
|
+
#
|
4
|
+
|
5
|
+
#
|
6
|
+
# make element description
|
7
|
+
#
|
8
|
+
|
9
|
+
module Genprovider
|
10
|
+
class RDoc
|
11
|
+
def description element
|
12
|
+
p = element.qualifiers["description", :string]
|
13
|
+
return unless p
|
14
|
+
p.value.split("\n").each do |l|
|
15
|
+
@out.puts l
|
16
|
+
@out.puts
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# make feature doc
|
22
|
+
#
|
23
|
+
|
24
|
+
def doc_feature feature
|
25
|
+
k = feature.key? ? " [Key]" : nil
|
26
|
+
@out.puts "== #{feature.name} : #{feature.type.to_s}#{k}"
|
27
|
+
description feature
|
28
|
+
@out.puts
|
29
|
+
vm = feature.qualifiers["valuemap"]
|
30
|
+
vs = feature.qualifiers["values"]
|
31
|
+
if vm && vs
|
32
|
+
@out.puts "* Mapped values"
|
33
|
+
vm = vm.value
|
34
|
+
vs = vs.value
|
35
|
+
loop do
|
36
|
+
m = vm.shift
|
37
|
+
s = vs.shift
|
38
|
+
@out.puts " * #{m} -> #{s}"
|
39
|
+
break if vm.empty? || vs.empty?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
feature.qualifiers.each do |q|
|
43
|
+
n = q.name.downcase
|
44
|
+
next if n == "description"
|
45
|
+
next if n == "values" || n == "valuemap"
|
46
|
+
@out.puts "* #{q}"
|
47
|
+
end
|
48
|
+
@out.puts
|
49
|
+
|
50
|
+
return unless feature.method?
|
51
|
+
args = nil
|
52
|
+
feature.parameters.each do |p|
|
53
|
+
args ||= []
|
54
|
+
if p.qualifiers.include?(:out,:bool)
|
55
|
+
args << "#{p.name.decamelize}_out"
|
56
|
+
else
|
57
|
+
args << p.name.decamelize
|
58
|
+
end
|
59
|
+
end
|
60
|
+
n = feature.name.decamelize
|
61
|
+
@out.puts "* #{n}(#{args})"
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# generate code for property
|
66
|
+
#
|
67
|
+
|
68
|
+
def doc_property property
|
69
|
+
doc_feature property
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# generate code for reference
|
74
|
+
#
|
75
|
+
|
76
|
+
def doc_reference reference
|
77
|
+
doc_feature reference
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# generate code for method
|
82
|
+
#
|
83
|
+
|
84
|
+
def doc_method method
|
85
|
+
doc_feature method
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# generate provider code for features matching match
|
90
|
+
#
|
91
|
+
|
92
|
+
def doc_features header, features, match
|
93
|
+
features.each do |f|
|
94
|
+
next unless f.instance_of? match
|
95
|
+
if header
|
96
|
+
# @out.puts header
|
97
|
+
header = nil
|
98
|
+
end
|
99
|
+
case f
|
100
|
+
when CIM::Property then doc_property f
|
101
|
+
when CIM::Reference then doc_reference f
|
102
|
+
when CIM::Method then doc_method f
|
103
|
+
else
|
104
|
+
raise "Unknown feature class #{f.class}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def doc_class c = nil
|
110
|
+
c = @klass unless c
|
111
|
+
@out.puts "= #{c.name}"
|
112
|
+
description c
|
113
|
+
|
114
|
+
if c.superclass
|
115
|
+
@out.puts
|
116
|
+
@out.puts "=== Superclass: #{c.superclass}"
|
117
|
+
end
|
118
|
+
|
119
|
+
doc_features "==Properties", c.features, CIM::Property
|
120
|
+
doc_features "==References", c.features, CIM::Reference
|
121
|
+
doc_features "==Methods", c.features, CIM::Method
|
122
|
+
end
|
123
|
+
|
124
|
+
def each_parent
|
125
|
+
parent = @klass.parent
|
126
|
+
while parent
|
127
|
+
yield parent
|
128
|
+
parent = parent.parent
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# generate provider code for class 'c'
|
134
|
+
#
|
135
|
+
|
136
|
+
def initialize c, out
|
137
|
+
@klass = c
|
138
|
+
@out = out
|
139
|
+
@out.puts "= Documentation for #{c.name}"
|
140
|
+
each_parent do |k|
|
141
|
+
@out.puts "* #{k.name}"
|
142
|
+
end
|
143
|
+
doc_class
|
144
|
+
each_parent do |k|
|
145
|
+
doc_class k
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
# registration.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
module Genprovider
|
6
|
+
class Registration
|
7
|
+
def initialize c, namespace, providername, out
|
8
|
+
out.comment.comment "Registration for provider #{providername} of class #{c.class}"
|
9
|
+
out.comment.comment "Generated by 'genprovider' for use with cmpi-bindings-ruby"
|
10
|
+
out.comment.comment "Classname - Namespace - Providername - Libraryname - Capabilities ..."
|
11
|
+
|
12
|
+
mask = Genprovider.classmask c
|
13
|
+
capabilities = ""
|
14
|
+
capabilities << " instance" if (mask & INSTANCE_MASK) != 0
|
15
|
+
capabilities << " method" if (mask & METHOD_MASK) != 0
|
16
|
+
capabilities << " association" if (mask & ASSOCIATION_MASK) != 0
|
17
|
+
capabilities << " indication" if (mask & INDICATION_MASK) != 0
|
18
|
+
|
19
|
+
out.puts "#{c.name} #{namespace} #{providername} rbCmpiProvider#{capabilities}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
#
|
2
|
+
# testcase.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
module Genprovider
|
6
|
+
class Testcase
|
7
|
+
# return Ruby type equivalent
|
8
|
+
def rubytype type
|
9
|
+
case type.to_sym
|
10
|
+
when :boolean then return ""
|
11
|
+
when :string then return "String"
|
12
|
+
when :char16 then return "Integer"
|
13
|
+
when :uint8 then return "Integer"
|
14
|
+
when :uint16 then return "Integer"
|
15
|
+
when :uint32 then return "Integer"
|
16
|
+
when :uint64 then return "Integer"
|
17
|
+
when :sint8 then return "Integer"
|
18
|
+
when :sint16 then return "Integer"
|
19
|
+
when :sint32 then return "Integer"
|
20
|
+
when :sint64 then return "Integer"
|
21
|
+
when :real32 then return "Float"
|
22
|
+
when :real64 then return "Float"
|
23
|
+
when :dateTime then return "Time"
|
24
|
+
when :reference then return "Sfcc::Cim::ObjectPath"
|
25
|
+
when :class then return "Sfcc::Cim::Class"
|
26
|
+
else
|
27
|
+
STDERR.puts "Unhandled type #{type}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize c, namespace, out
|
32
|
+
out.comment.comment "Testcase for #{namespace}:#{c.name}"
|
33
|
+
out.comment.comment "Generated by 'genprovider' for use with cmpi-bindings-ruby"
|
34
|
+
out.puts "require 'rubygems'"
|
35
|
+
out.puts "require 'sfcc'"
|
36
|
+
out.puts "require 'test/unit'"
|
37
|
+
out.puts
|
38
|
+
out.puts "class Test_#{c.name} < Test::Unit::TestCase"
|
39
|
+
out.inc
|
40
|
+
out.def "setup"
|
41
|
+
out.puts "@client = Sfcc::Cim::Client.connect(:uri => 'https://wsman:secret@localhost:5989', :verify => false)"
|
42
|
+
out.puts "@op = Sfcc::Cim::ObjectPath.new('#{namespace}', '#{c.name}')"
|
43
|
+
out.end
|
44
|
+
out.puts
|
45
|
+
out.def "test_registered"
|
46
|
+
out.puts "cimclass = @client.get_class(@op)"
|
47
|
+
out.puts "assert cimclass"
|
48
|
+
out.end # test_registered
|
49
|
+
out.puts
|
50
|
+
out.def "test_instance_names"
|
51
|
+
out.puts "names = @client.instance_names(@op)"
|
52
|
+
out.puts "assert names.size > 0"
|
53
|
+
out.puts "names.each do |ref|"
|
54
|
+
out.inc
|
55
|
+
out.puts "ref.namespace = @op.namespace"
|
56
|
+
out.puts "instance = @client.get_instance ref"
|
57
|
+
out.puts "assert instance"
|
58
|
+
out.puts
|
59
|
+
#
|
60
|
+
# Properties
|
61
|
+
#
|
62
|
+
c.features.each do |p|
|
63
|
+
next unless p.property?
|
64
|
+
element = "instance.#{p.name}"
|
65
|
+
out.puts "assert #{element}"
|
66
|
+
if p.type.array?
|
67
|
+
out.puts "assert_kind_of Array, #{element} # #{p.type}"
|
68
|
+
out.puts "tmp = #{element}[0]"
|
69
|
+
element = "tmp"
|
70
|
+
end
|
71
|
+
rtype = rubytype p.type
|
72
|
+
raise "Unsupported type #{p.type} [#{rtype.class}]" if rtype.nil?
|
73
|
+
out.puts "if #{element}"
|
74
|
+
out.inc
|
75
|
+
if rtype.empty?
|
76
|
+
out.puts "assert #{element}.is_a?(TrueClass) || #{element}.is_a?(FalseClass)"
|
77
|
+
else
|
78
|
+
out.puts "assert_kind_of #{rubytype p.type}, #{element} # #{p.type}"
|
79
|
+
end
|
80
|
+
out.end
|
81
|
+
end
|
82
|
+
out.end # names.each
|
83
|
+
out.end # test_instance_names
|
84
|
+
#
|
85
|
+
# References
|
86
|
+
#
|
87
|
+
out.puts
|
88
|
+
c.features.each do |r|
|
89
|
+
next unless r.reference?
|
90
|
+
end
|
91
|
+
#
|
92
|
+
# Methods
|
93
|
+
#
|
94
|
+
out.puts
|
95
|
+
c.features.each do |m|
|
96
|
+
next unless m.method?
|
97
|
+
out.puts
|
98
|
+
out.def "test_method_#{m.name}"
|
99
|
+
if m.static?
|
100
|
+
# class-level method
|
101
|
+
else
|
102
|
+
# instance level method
|
103
|
+
out.puts "@client.instances(@op).each do |inst|"
|
104
|
+
out.inc
|
105
|
+
m.parameters.each do |p|
|
106
|
+
desc = p.description
|
107
|
+
out.comment desc if desc
|
108
|
+
if p.out?
|
109
|
+
out.puts "p_out_#{p.name} = {} # #{p.type}"
|
110
|
+
else
|
111
|
+
out.puts "p_in_#{p.name} = nil # #{p.type}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
s = "res = inst.#{m.name}("
|
115
|
+
first = true
|
116
|
+
m.parameters.each do |p|
|
117
|
+
if first
|
118
|
+
first = false
|
119
|
+
else
|
120
|
+
s << ", "
|
121
|
+
end
|
122
|
+
if p.includes? :out
|
123
|
+
s << "p_out_#{p.name}"
|
124
|
+
else
|
125
|
+
s << "p_in_#{p.name}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
s << ")"
|
129
|
+
out.puts s
|
130
|
+
out.puts "assert_kind_of #{rubytype m.type}, res"
|
131
|
+
out.end
|
132
|
+
end
|
133
|
+
out.end # test_method_<name>
|
134
|
+
end
|
135
|
+
out.puts
|
136
|
+
out.end # class
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/lib/genprovider.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
module Genprovider
|
5
|
+
INSTANCE_MASK = 1
|
6
|
+
METHOD_MASK = 2
|
7
|
+
ASSOCIATION_MASK = 4
|
8
|
+
INDICATION_MASK = 8
|
9
|
+
|
10
|
+
def self.classmask klass
|
11
|
+
c = klass
|
12
|
+
mask = 0
|
13
|
+
while c
|
14
|
+
mask |= INSTANCE_MASK if c.instance?
|
15
|
+
mask |= METHOD_MASK if c.method?
|
16
|
+
mask |= ASSOCIATION_MASK if c.association?
|
17
|
+
mask |= INDICATION_MASK if c.indication?
|
18
|
+
c = c.parent
|
19
|
+
end
|
20
|
+
if mask == 0
|
21
|
+
STDERR.puts "Assuming that #{klass.name} defines an Instance"
|
22
|
+
mask |= INSTANCE_MASK
|
23
|
+
end
|
24
|
+
mask
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'genprovider/version'
|
28
|
+
require 'genprovider/output'
|
29
|
+
require 'genprovider/class'
|
30
|
+
require 'genprovider/provider'
|
31
|
+
require 'genprovider/registration'
|
32
|
+
require 'genprovider/testcase'
|
33
|
+
require 'genprovider/classinfo'
|
34
|
+
require 'genprovider/rdoc'
|
35
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
[ Description ("A dummy class to represent array data types" )
|
2
|
+
]
|
3
|
+
class RCP_ArrayDataTypes
|
4
|
+
{
|
5
|
+
[Key]
|
6
|
+
string Name;
|
7
|
+
|
8
|
+
boolean bool[];
|
9
|
+
|
10
|
+
string text[];
|
11
|
+
char16 char_16[];
|
12
|
+
|
13
|
+
uint8 unsigned_int_8[];
|
14
|
+
uint16 unsigned_int_16[];
|
15
|
+
uint32 unsigned_int_32[];
|
16
|
+
uint64 unsigned_int_64[];
|
17
|
+
|
18
|
+
sint8 byte[];
|
19
|
+
sint16 short[];
|
20
|
+
sint32 int[];
|
21
|
+
sint64 long[];
|
22
|
+
|
23
|
+
real32 float[];
|
24
|
+
real64 double[];
|
25
|
+
|
26
|
+
datetime date_time[];
|
27
|
+
};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
[ Description ("A class to implement complex methods" )
|
2
|
+
]
|
3
|
+
class RCP_ComplexMethod
|
4
|
+
{
|
5
|
+
[Key]
|
6
|
+
string Name;
|
7
|
+
|
8
|
+
[Description("A method to concatenate count * str, passing the"
|
9
|
+
"result via an out parameter. Returning the result length")]
|
10
|
+
uint32 InOut(uint32 count, [in] string str, [out] string result);
|
11
|
+
|
12
|
+
[Description("A method to count array elements")]
|
13
|
+
uint32 Size([in] string strA[]);
|
14
|
+
};
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* sample indication generator
|
3
|
+
* modeled after
|
4
|
+
* http://sourceforge.net/apps/mediawiki/pywbem/index.php?title=Indications_Tutorial
|
5
|
+
*/
|
6
|
+
|
7
|
+
class RCP_IndicationGenerator
|
8
|
+
{
|
9
|
+
[Static, Description("Generate one or more indications")]
|
10
|
+
uint16 generate_indications(
|
11
|
+
string ind_text,
|
12
|
+
uint16 num_to_send );
|
13
|
+
};
|
@@ -0,0 +1,27 @@
|
|
1
|
+
[ Description ("A dummy class to represent various data types" )
|
2
|
+
]
|
3
|
+
class RCP_SimpleDataTypes
|
4
|
+
{
|
5
|
+
[Key]
|
6
|
+
string Name;
|
7
|
+
|
8
|
+
boolean bool;
|
9
|
+
|
10
|
+
string text;
|
11
|
+
char16 char_16;
|
12
|
+
|
13
|
+
uint8 unsigned_int_8;
|
14
|
+
uint16 unsigned_int_16;
|
15
|
+
uint32 unsigned_int_32;
|
16
|
+
uint64 unsigned_int_64;
|
17
|
+
|
18
|
+
sint8 byte;
|
19
|
+
sint16 short;
|
20
|
+
sint32 int;
|
21
|
+
sint64 long;
|
22
|
+
|
23
|
+
real32 float;
|
24
|
+
real64 double;
|
25
|
+
|
26
|
+
datetime date_time;
|
27
|
+
};
|
@@ -0,0 +1,20 @@
|
|
1
|
+
//
|
2
|
+
// qualifiers.mof - Qualifier definitions for stand-alone mof compilation
|
3
|
+
//
|
4
|
+
//
|
5
|
+
|
6
|
+
#pragma locale ("en_US")
|
7
|
+
//#pragma namespace ("root/cimv2")
|
8
|
+
|
9
|
+
Qualifier Provider : string = null,
|
10
|
+
Scope(any);
|
11
|
+
Qualifier Description : string = null,
|
12
|
+
Scope(any),
|
13
|
+
Flavor(EnableOverride, ToSubclass, Translatable);
|
14
|
+
Qualifier Key : boolean = false,
|
15
|
+
Scope(property, reference),
|
16
|
+
Flavor(DisableOverride, ToSubclass);
|
17
|
+
Qualifier Association : boolean = false,
|
18
|
+
Scope(class);
|
19
|
+
Qualifier Indication : boolean = false,
|
20
|
+
Scope(class);
|
@@ -0,0 +1,148 @@
|
|
1
|
+
#
|
2
|
+
# Provider LMI_Embedded for class LMI_Embedded:CIM::Class
|
3
|
+
#
|
4
|
+
require 'syslog'
|
5
|
+
|
6
|
+
require 'cmpi/provider'
|
7
|
+
|
8
|
+
module Cmpi
|
9
|
+
|
10
|
+
class CIM_ManagedElement < InstanceProvider
|
11
|
+
# typemap for embedded instance
|
12
|
+
def self.typemap
|
13
|
+
{
|
14
|
+
"InstanceID" => Cmpi::string,
|
15
|
+
"Caption" => Cmpi::string,
|
16
|
+
"Description" => Cmpi::string,
|
17
|
+
"ElementName" => Cmpi::string,
|
18
|
+
"Generation" => Cmpi::uint64,
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
#
|
23
|
+
class LMI_Embedded < InstanceProvider
|
24
|
+
|
25
|
+
#
|
26
|
+
# Provider initialization
|
27
|
+
#
|
28
|
+
def initialize( name, broker, context )
|
29
|
+
@trace_file = STDERR
|
30
|
+
super broker
|
31
|
+
end
|
32
|
+
|
33
|
+
def cleanup( context, terminating )
|
34
|
+
@trace_file.puts "cleanup terminating? #{terminating}"
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.typemap
|
39
|
+
{
|
40
|
+
"InstanceID" => Cmpi::string,
|
41
|
+
"Embedded" => Cmpi::embedded_instance,
|
42
|
+
"Str" => Cmpi::string,
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
#
|
48
|
+
# Iterator for names and instances
|
49
|
+
# yields references matching reference and properties
|
50
|
+
#
|
51
|
+
def each( context, reference, properties = nil, want_instance = false )
|
52
|
+
value = "Hello world"
|
53
|
+
|
54
|
+
# create embedded instance
|
55
|
+
ns = reference.namespace
|
56
|
+
pembedded = Cmpi::CMPIObjectPath.new ns, "CIM_ManagedElement"
|
57
|
+
pembedded.InstanceID = "id"
|
58
|
+
@trace_file.puts "pembedded #{pembedded}"
|
59
|
+
|
60
|
+
embedded = Cmpi::CMPIInstance.new pembedded
|
61
|
+
embedded.Description = "descr"
|
62
|
+
|
63
|
+
result = Cmpi::CMPIObjectPath.new reference.namespace, "LMI_Embedded"
|
64
|
+
if want_instance
|
65
|
+
result = Cmpi::CMPIInstance.new result
|
66
|
+
end
|
67
|
+
|
68
|
+
# Set key properties
|
69
|
+
|
70
|
+
result.InstanceID = "Hello world" # string (-> LMI_Embedded)
|
71
|
+
unless want_instance
|
72
|
+
yield result
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
# Instance: Set non-key properties
|
77
|
+
|
78
|
+
result.Embedded = embedded
|
79
|
+
result.Str = "sample string"
|
80
|
+
yield result
|
81
|
+
end
|
82
|
+
public
|
83
|
+
|
84
|
+
def enum_instance_names( context, result, reference )
|
85
|
+
@trace_file.puts "enum_instance_names ref #{reference}"
|
86
|
+
each(context, reference) do |ref|
|
87
|
+
@trace_file.puts "ref #{ref}"
|
88
|
+
result.return_objectpath ref
|
89
|
+
end
|
90
|
+
result.done
|
91
|
+
true
|
92
|
+
end
|
93
|
+
|
94
|
+
def enum_instances( context, result, reference, properties )
|
95
|
+
@trace_file.puts "enum_instances ref #{reference}, props #{properties.inspect}"
|
96
|
+
each(context, reference, properties, true) do |instance|
|
97
|
+
@trace_file.puts "instance #{instance}"
|
98
|
+
result.return_instance instance
|
99
|
+
end
|
100
|
+
result.done
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
def get_instance( context, result, reference, properties )
|
105
|
+
@trace_file.puts "get_instance ref #{reference}, props #{properties.inspect}"
|
106
|
+
each(context, reference, properties, true) do |instance|
|
107
|
+
@trace_file.puts "instance #{instance}"
|
108
|
+
result.return_instance instance
|
109
|
+
break # only return first instance
|
110
|
+
end
|
111
|
+
result.done
|
112
|
+
true
|
113
|
+
end
|
114
|
+
|
115
|
+
def create_instance( context, result, reference, newinst )
|
116
|
+
@trace_file.puts "create_instance ref #{reference}, newinst #{newinst.inspect}"
|
117
|
+
# Create instance according to reference and newinst
|
118
|
+
result.return_objectpath reference
|
119
|
+
result.done
|
120
|
+
true
|
121
|
+
end
|
122
|
+
|
123
|
+
def set_instance( context, result, reference, newinst, properties )
|
124
|
+
@trace_file.puts "set_instance ref #{reference}, newinst #{newinst.inspect}, props #{properties.inspect}"
|
125
|
+
properties.each do |prop|
|
126
|
+
newinst.send "#{prop.name}=".to_sym, FIXME
|
127
|
+
end
|
128
|
+
result.return_instance newinst
|
129
|
+
result.done
|
130
|
+
true
|
131
|
+
end
|
132
|
+
|
133
|
+
def delete_instance( context, result, reference )
|
134
|
+
@trace_file.puts "delete_instance ref #{reference}"
|
135
|
+
result.done
|
136
|
+
true
|
137
|
+
end
|
138
|
+
|
139
|
+
# query : String
|
140
|
+
# lang : String
|
141
|
+
def exec_query( context, result, reference, query, lang )
|
142
|
+
@trace_file.puts "exec_query ref #{reference}, query #{query}, lang #{lang}"
|
143
|
+
result.done
|
144
|
+
true
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|