acirb 1.0.4h → 1.0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/acirb/aaa.rb +1211 -92
- data/lib/acirb/ac.rb +167 -8
- data/lib/acirb/action.rb +309 -33
- data/lib/acirb/actrl.rb +1937 -79
- data/lib/acirb/actrlcap.rb +24 -2
- data/lib/acirb/adcom.rb +376 -26
- data/lib/acirb/aib.rb +47 -5
- data/lib/acirb/arp.rb +311 -19
- data/lib/acirb/bfd.rb +199 -15
- data/lib/acirb/bgp.rb +892 -69
- data/lib/acirb/callhome.rb +322 -23
- data/lib/acirb/cap.rb +45 -6
- data/lib/acirb/cdp.rb +235 -20
- data/lib/acirb/cnw.rb +122 -6
- data/lib/acirb/comm.rb +4565 -186
- data/lib/acirb/comp.rb +4882 -205
- data/lib/acirb/compat.rb +413 -38
- data/lib/acirb/condition.rb +176 -13
- data/lib/acirb/config.rb +235 -16
- data/lib/acirb/coop.rb +563 -44
- data/lib/acirb/copp.rb +1711 -40
- data/lib/acirb/ctrlr.rb +20 -2
- data/lib/acirb/ctx.rb +48 -6
- data/lib/acirb/datetime.rb +359 -24
- data/lib/acirb/dbg.rb +1902 -87
- data/lib/acirb/dbgac.rb +770 -47
- data/lib/acirb/dbgexp.rb +560 -41
- data/lib/acirb/dhcp.rb +898 -71
- data/lib/acirb/dhcptlv.rb +64 -8
- data/lib/acirb/dhcptlvpol.rb +72 -8
- data/lib/acirb/dlgt.rb +7 -1
- data/lib/acirb/dns.rb +203 -18
- data/lib/acirb/draw.rb +18 -2
- data/lib/acirb/edr.rb +52 -5
- data/lib/acirb/eigrp.rb +604 -49
- data/lib/acirb/ep.rb +43 -4
- data/lib/acirb/epm.rb +72 -8
- data/lib/acirb/eptrk.rb +147 -7
- data/lib/acirb/eqpt.rb +12467 -400
- data/lib/acirb/eqptcap.rb +131 -12
- data/lib/acirb/eqptcapacity.rb +6446 -254
- data/lib/acirb/eqptdiag.rb +171 -11
- data/lib/acirb/eqptdiagp.rb +956 -61
- data/lib/acirb/ethpm.rb +624 -19
- data/lib/acirb/event.rb +155 -12
- data/lib/acirb/extnw.rb +112 -11
- data/lib/acirb/fabric.rb +6199 -418
- data/lib/acirb/fault.rb +700 -51
- data/lib/acirb/file.rb +113 -9
- data/lib/acirb/firmware.rb +535 -40
- data/lib/acirb/fmcast.rb +63 -6
- data/lib/acirb/frmwrk.rb +201 -17
- data/lib/acirb/fsm.rb +26 -1
- data/lib/acirb/fv.rb +5653 -431
- data/lib/acirb/fvcap.rb +25 -2
- data/lib/acirb/fvns.rb +375 -33
- data/lib/acirb/fvtopo.rb +60 -5
- data/lib/acirb/geo.rb +86 -8
- data/lib/acirb/glean.rb +50 -5
- data/lib/acirb/ha.rb +6 -1
- data/lib/acirb/health.rb +258 -21
- data/lib/acirb/hvs.rb +312 -22
- data/lib/acirb/icmp.rb +34 -4
- data/lib/acirb/icmpv4.rb +42 -4
- data/lib/acirb/icmpv6.rb +78 -5
- data/lib/acirb/ident.rb +533 -43
- data/lib/acirb/igmp.rb +59 -4
- data/lib/acirb/igmpsnoop.rb +254 -18
- data/lib/acirb/im.rb +94 -7
- data/lib/acirb/imginstall.rb +18 -1
- data/lib/acirb/infra.rb +3909 -243
- data/lib/acirb/ip.rb +276 -24
- data/lib/acirb/ipmcsnoop.rb +217 -18
- data/lib/acirb/ipv4.rb +120 -8
- data/lib/acirb/ipv6.rb +121 -9
- data/lib/acirb/isis.rb +2885 -103
- data/lib/acirb/isistlv.rb +64 -8
- data/lib/acirb/l1.rb +616 -46
- data/lib/acirb/l1cap.rb +24 -2
- data/lib/acirb/l2.rb +5676 -152
- data/lib/acirb/l2cap.rb +25 -2
- data/lib/acirb/l2ext.rb +249 -19
- data/lib/acirb/l3.rb +562 -38
- data/lib/acirb/l3cap.rb +25 -2
- data/lib/acirb/l3ext.rb +758 -59
- data/lib/acirb/l3vm.rb +36 -3
- data/lib/acirb/l4.rb +35 -3
- data/lib/acirb/lacp.rb +226 -18
- data/lib/acirb/lbp.rb +24 -2
- data/lib/acirb/leqpt.rb +94 -7
- data/lib/acirb/lldp.rb +383 -29
- data/lib/acirb/lldptlv.rb +64 -8
- data/lib/acirb/lldptlvpol.rb +72 -8
- data/lib/acirb/maint.rb +464 -34
- data/lib/acirb/mcast.rb +19 -3
- data/lib/acirb/mcp.rb +168 -15
- data/lib/acirb/memory.rb +457 -18
- data/lib/acirb/mgmt.rb +708 -50
- data/lib/acirb/mldsnoop.rb +225 -16
- data/lib/acirb/mo.rb +27 -3
- data/lib/acirb/mock.rb +48 -4
- data/lib/acirb/mon.rb +378 -40
- data/lib/acirb/monitor.rb +124 -9
- data/lib/acirb/naming.rb +13 -2
- data/lib/acirb/nd.rb +304 -25
- data/lib/acirb/nw.rb +320 -39
- data/lib/acirb/nws.rb +71 -7
- data/lib/acirb/oam.rb +65 -3
- data/lib/acirb/observer.rb +56 -4
- data/lib/acirb/opflex.rb +5794 -168
- data/lib/acirb/os.rb +25 -2
- data/lib/acirb/ospf.rb +1185 -82
- data/lib/acirb/ospfv3.rb +477 -31
- data/lib/acirb/pc.rb +205 -11
- data/lib/acirb/pcons.rb +444 -42
- data/lib/acirb/phys.rb +22 -2
- data/lib/acirb/ping.rb +172 -6
- data/lib/acirb/pki.rb +194 -15
- data/lib/acirb/pol.rb +1063 -88
- data/lib/acirb/policer.rb +16 -2
- data/lib/acirb/pool.rb +49 -6
- data/lib/acirb/pres.rb +216 -19
- data/lib/acirb/proc.rb +4069 -130
- data/lib/acirb/psu.rb +40 -4
- data/lib/acirb/qos.rb +312 -28
- data/lib/acirb/qosm.rb +979 -40
- data/lib/acirb/qosp.rb +147 -11
- data/lib/acirb/rbqm.rb +113 -9
- data/lib/acirb/regress.rb +14 -1
- data/lib/acirb/reln.rb +304 -26
- data/lib/acirb/repl.rb +34 -4
- data/lib/acirb/res.rb +120 -12
- data/lib/acirb/rib.rb +85 -9
- data/lib/acirb/rmon.rb +150 -10
- data/lib/acirb/rpm.rb +11 -1
- data/lib/acirb/rtcom.rb +27 -3
- data/lib/acirb/rtctrl.rb +641 -59
- data/lib/acirb/rtextcom.rb +45 -4
- data/lib/acirb/rtflt.rb +23 -3
- data/lib/acirb/rtleak.rb +58 -6
- data/lib/acirb/rtmap.rb +354 -32
- data/lib/acirb/rtpfx.rb +54 -5
- data/lib/acirb/rtregcom.rb +43 -4
- data/lib/acirb/rtsum.rb +8 -1
- data/lib/acirb/rule.rb +27 -4
- data/lib/acirb/satm.rb +175 -6
- data/lib/acirb/snmp.rb +409 -34
- data/lib/acirb/span.rb +1263 -84
- data/lib/acirb/stats.rb +607 -31
- data/lib/acirb/statstore.rb +38 -4
- data/lib/acirb/stormctrl.rb +36 -3
- data/lib/acirb/stp.rb +315 -28
- data/lib/acirb/sts.rb +538 -45
- data/lib/acirb/svccore.rb +173 -8
- data/lib/acirb/svi.rb +61 -3
- data/lib/acirb/synthetic.rb +639 -44
- data/lib/acirb/sysdebug.rb +248 -18
- data/lib/acirb/sysfile.rb +31 -4
- data/lib/acirb/syshist.rb +39 -4
- data/lib/acirb/syslog.rb +180 -14
- data/lib/acirb/sysmgr.rb +38 -4
- data/lib/acirb/sysmgrp.rb +21 -2
- data/lib/acirb/tag.rb +159 -12
- data/lib/acirb/task.rb +48 -3
- data/lib/acirb/test.rb +40 -3
- data/lib/acirb/testinfralab.rb +97 -8
- data/lib/acirb/tlv.rb +68 -10
- data/lib/acirb/top.rb +212 -16
- data/lib/acirb/topoctrl.rb +100 -9
- data/lib/acirb/traceroute.rb +210 -11
- data/lib/acirb/traceroutep.rb +215 -12
- data/lib/acirb/trig.rb +344 -30
- data/lib/acirb/troubleshoot.rb +136 -8
- data/lib/acirb/tunnel.rb +148 -11
- data/lib/acirb/uribv4.rb +83 -8
- data/lib/acirb/uribv6.rb +63 -6
- data/lib/acirb/vlan.rb +88 -5
- data/lib/acirb/vlanmgr.rb +21 -2
- data/lib/acirb/vmm.rb +715 -50
- data/lib/acirb/vns.rb +6681 -428
- data/lib/acirb/vpc.rb +260 -14
- data/lib/acirb/vsvc.rb +48 -4
- data/lib/acirb/vtap.rb +20 -2
- data/lib/acirb/vxlan.rb +73 -4
- data/lib/acirb/vz.rb +1934 -145
- data/lib/acirb.rb +1 -1
- data/lib/events.rb +143 -6
- data/lib/loader.rb +5 -3
- data/lib/mo.rb +72 -15
- data/lib/naming.rb +1 -1
- data/lib/query.rb +3 -1
- data/lib/restclient.rb +172 -47
- data/lib/version.rb +1 -1
- metadata +32 -4
data/lib/acirb.rb
CHANGED
data/lib/events.rb
CHANGED
@@ -1,27 +1,164 @@
|
|
1
1
|
require 'restclient'
|
2
|
-
require 'websocket
|
2
|
+
require 'websocket'
|
3
|
+
require 'socket'
|
4
|
+
require 'openssl'
|
5
|
+
require 'nokogiri'
|
6
|
+
require 'json'
|
3
7
|
|
4
8
|
# rubocop:disable ClassLength
|
5
|
-
# rubocop:disable FormatString
|
6
9
|
module ACIrb
|
7
10
|
# Event channel interface
|
11
|
+
|
8
12
|
class EventChannel
|
9
|
-
attr_accessor :
|
10
|
-
|
13
|
+
attr_accessor :rest
|
14
|
+
|
15
|
+
class ApicWebSocketRecvTimeout < StandardError
|
16
|
+
end
|
17
|
+
|
18
|
+
class WebSocketNoHandshake < StandardError
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(rest, _options = {})
|
11
22
|
@rest = rest
|
23
|
+
|
12
24
|
uri = URI.parse(@rest.baseurl)
|
13
25
|
|
14
26
|
if uri.scheme == 'https'
|
15
27
|
scheme = 'wss'
|
28
|
+
secure = true
|
16
29
|
else
|
17
30
|
scheme = 'ws'
|
31
|
+
secure = false
|
32
|
+
end
|
33
|
+
|
34
|
+
url = '%s://%s/socket%s' % [scheme, uri.host, rest.auth_cookie]
|
35
|
+
|
36
|
+
@handshake = WebSocket::Handshake::Client.new(url: url)
|
37
|
+
@frame = WebSocket::Frame::Incoming::Server.new(version: @handshake.version)
|
38
|
+
|
39
|
+
@socket = TCPSocket.new(@handshake.host, uri.port)
|
40
|
+
|
41
|
+
if secure
|
42
|
+
puts 'connecting over secure websocket'
|
43
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
44
|
+
|
45
|
+
ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE unless rest.verify
|
46
|
+
|
47
|
+
ssl_sock = OpenSSL::SSL::SSLSocket.new(@socket, ctx)
|
48
|
+
ssl_sock.sync_close = true
|
49
|
+
ssl_sock.connect
|
50
|
+
|
51
|
+
@transport_socket = @socket
|
52
|
+
@socket = ssl_sock
|
53
|
+
else
|
54
|
+
@transport_socket = nil
|
55
|
+
end
|
56
|
+
|
57
|
+
@socket.write(@handshake.to_s)
|
58
|
+
@socket.flush
|
59
|
+
|
60
|
+
loop do
|
61
|
+
data = @socket.getc
|
62
|
+
next if data.nil?
|
63
|
+
|
64
|
+
@handshake << data
|
65
|
+
|
66
|
+
if @handshake.finished?
|
67
|
+
fail @handshake.error.to_s unless @handshake.valid?
|
68
|
+
@handshaked = true
|
69
|
+
break
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def send(data, type = :text)
|
75
|
+
fail WebSocketNoHandshake unless @handshaked
|
76
|
+
|
77
|
+
data = WebSocket::Frame::Outgoing::Client.new(
|
78
|
+
version: @handshake.version,
|
79
|
+
data: data,
|
80
|
+
type: type
|
81
|
+
).to_s
|
82
|
+
@socket.write data
|
83
|
+
@socket.flush
|
84
|
+
end
|
85
|
+
|
86
|
+
def receive(timeout = nil)
|
87
|
+
fail WebSocketNoHandshake unless @handshaked
|
88
|
+
|
89
|
+
readable, writable, error = IO.select([@socket], nil, nil, timeout)
|
90
|
+
if readable
|
91
|
+
begin
|
92
|
+
data = @socket.read_nonblock(1024)
|
93
|
+
rescue Errno::EAGAIN, Errno::EWOULDBLOCK, (IO::WaitReadable if defined?(IO::WaitReadable)) => e
|
94
|
+
puts '%s, retrying' % e
|
95
|
+
retry
|
96
|
+
end
|
97
|
+
else
|
98
|
+
fail ApicWebSocketRecvTimeout, 'Timeout for websocket read'
|
99
|
+
end
|
100
|
+
@frame << data
|
101
|
+
|
102
|
+
messages = []
|
103
|
+
while message = @frame.next
|
104
|
+
if message.type === :ping
|
105
|
+
send(message.data, :pong)
|
106
|
+
return messages
|
107
|
+
end
|
108
|
+
messages << message.to_s
|
18
109
|
end
|
19
110
|
|
20
|
-
|
21
|
-
|
111
|
+
events = []
|
112
|
+
messages.each do |msg|
|
113
|
+
events += MoEvent.parse_event(self, msg.to_s)
|
114
|
+
end
|
115
|
+
events
|
116
|
+
end
|
117
|
+
|
118
|
+
def close
|
119
|
+
@socket.close
|
120
|
+
end
|
121
|
+
end
|
22
122
|
|
123
|
+
class MoEvent
|
124
|
+
def initialize(_options = {})
|
23
125
|
end
|
24
126
|
|
127
|
+
def self.parse_event(event_channel, event_str)
|
128
|
+
subscription = nil
|
129
|
+
events = []
|
130
|
+
|
131
|
+
if event_channel.rest.format == 'xml'
|
132
|
+
doc = Nokogiri::XML(event_str)
|
133
|
+
subscription_id = doc.at_css('imdata')['subscriptionId']
|
134
|
+
puts event_str
|
135
|
+
doc.root.elements.each do |xml_obj|
|
136
|
+
event = {
|
137
|
+
type: xml_obj.attributes['status'].to_s,
|
138
|
+
properties: Hash[xml_obj.attributes.map { |k, str| [k, str.value.to_s] }],
|
139
|
+
class: xml_obj.name,
|
140
|
+
subscription_id: subscription_id
|
141
|
+
}
|
142
|
+
events.push(event)
|
143
|
+
end
|
144
|
+
elsif event_channel.rest.format == 'json'
|
145
|
+
doc = JSON.parse(event_str, symbolize_names: false)
|
146
|
+
subscription_id = doc['subscriptionId']
|
147
|
+
imdata = doc['imdata']
|
148
|
+
imdata.each do |obj|
|
149
|
+
cls = obj.keys[0]
|
150
|
+
event = {
|
151
|
+
type: obj[cls]['attributes']['status'].to_s,
|
152
|
+
properties: Hash[obj[cls]['attributes'].map { |k, str| [k, str.to_s] }],
|
153
|
+
class: cls,
|
154
|
+
subscription_id: subscription_id[0]
|
155
|
+
}
|
156
|
+
events.push(event)
|
157
|
+
end
|
25
158
|
|
159
|
+
end
|
160
|
+
|
161
|
+
events
|
162
|
+
end
|
26
163
|
end
|
27
164
|
end
|
data/lib/loader.rb
CHANGED
@@ -29,6 +29,7 @@ module ACIrb
|
|
29
29
|
element.attributes.each do |k, v|
|
30
30
|
create_attr[k.to_s] = v.to_s
|
31
31
|
end
|
32
|
+
create_attr[:mark_dirty] = false
|
32
33
|
mo = mo.new(parent_mo, create_attr)
|
33
34
|
|
34
35
|
element.elements.each do |e|
|
@@ -68,12 +69,13 @@ module ACIrb
|
|
68
69
|
|
69
70
|
mo = ACIrb.const_get(ACIrb::CLASSMAP[class_name])
|
70
71
|
|
71
|
-
|
72
|
+
create_attr = {}
|
72
73
|
(values['attributes'] || {}).each do |propName, propVal|
|
73
|
-
|
74
|
+
create_attr[propName.to_s] = propVal
|
74
75
|
end
|
75
76
|
|
76
|
-
|
77
|
+
create_attr[:mark_dirty] = false
|
78
|
+
mo = mo.new(parent_mo, create_attr)
|
77
79
|
|
78
80
|
(values['children'] || []).each do |child|
|
79
81
|
mo.add_child(get_mo_from_hash(mo, child))
|
data/lib/mo.rb
CHANGED
@@ -10,44 +10,66 @@ module ACIrb
|
|
10
10
|
class << self
|
11
11
|
# for class variables
|
12
12
|
attr_reader :prefix, :class_name, :child_classes, :props,
|
13
|
-
:naming_props, :prefixes, :ruby_class, :containers
|
13
|
+
:naming_props, :prefixes, :ruby_class, :containers,
|
14
|
+
:read_only
|
14
15
|
end
|
15
16
|
|
16
17
|
# for instance variables
|
17
18
|
attr_reader :children, :attributes
|
18
|
-
attr_accessor :parent
|
19
|
+
attr_accessor :parent, :dirty_props
|
19
20
|
|
21
|
+
# Internal: Returns class prefixes
|
20
22
|
def prefixes
|
21
23
|
self.class.prefixes
|
22
24
|
end
|
23
25
|
|
26
|
+
# Internal: Returns child classes
|
24
27
|
def child_classes
|
25
28
|
self.class.child_classes
|
26
29
|
end
|
27
30
|
|
31
|
+
# Internal: Returns containiner classes
|
28
32
|
def containers
|
29
33
|
self.class.containers
|
30
34
|
end
|
31
35
|
|
36
|
+
# Internal: Returns naming properties
|
32
37
|
def naming_props
|
33
38
|
self.class.naming_props
|
34
39
|
end
|
35
40
|
|
41
|
+
# Internal: Returns class properties
|
36
42
|
def props
|
37
43
|
self.class.props
|
38
44
|
end
|
39
45
|
|
46
|
+
# Internal: Returns object class name in APIC package.class notation
|
40
47
|
def class_name
|
41
48
|
self.class.class_name
|
42
49
|
end
|
43
50
|
|
51
|
+
# Internal: Returns class name as ruby package notation
|
44
52
|
def ruby_class
|
45
53
|
self.class.ruby_class
|
46
54
|
end
|
47
55
|
|
48
|
-
|
56
|
+
# Interal: Returns boolean for if this class is read only
|
57
|
+
def read_only
|
58
|
+
self.class.read_only
|
59
|
+
end
|
60
|
+
|
61
|
+
def initialize(create_parent, create_options = {})
|
62
|
+
# always mark dirty unless otherwise specified
|
63
|
+
if create_options[:mark_dirty] == false
|
64
|
+
mark_dirty = false
|
65
|
+
else
|
66
|
+
mark_dirty = true
|
67
|
+
end
|
68
|
+
create_options.delete(:mark_dirty)
|
69
|
+
|
49
70
|
@attributes = {}
|
50
|
-
|
71
|
+
@dirty_props = []
|
72
|
+
props.each do |prop, _flags|
|
51
73
|
@attributes[prop.to_s] = ''
|
52
74
|
end
|
53
75
|
@children = []
|
@@ -61,12 +83,16 @@ module ACIrb
|
|
61
83
|
|
62
84
|
# for performance reasons, do not use set_prop here
|
63
85
|
# and build the dn string after all attributes are set
|
64
|
-
|
65
|
-
|
86
|
+
create_options.each do |k, v|
|
87
|
+
flags = props[k.to_s]
|
88
|
+
@attributes[k.to_s] = v.to_s
|
89
|
+
@dirty_props.push(k.to_s) if mark_dirty
|
66
90
|
end
|
67
91
|
@attributes['dn'] = build_dn
|
92
|
+
@attributes['rn'] = rn
|
68
93
|
end
|
69
94
|
|
95
|
+
# Internal: Adds another MO object as a child to this class
|
70
96
|
def add_child(child)
|
71
97
|
unless child.containers.include?(ruby_class)
|
72
98
|
fail child.class.to_s + ' cannot be child of ' + self.class.to_s
|
@@ -81,11 +107,16 @@ module ACIrb
|
|
81
107
|
def set_prop(key, val)
|
82
108
|
key = key.to_s
|
83
109
|
val = val.to_s
|
110
|
+
|
84
111
|
return if key == 'dn' || key == 'rn'
|
112
|
+
|
85
113
|
@attributes[key] = val
|
114
|
+
@dirty_props.push(key)
|
115
|
+
|
86
116
|
if naming_props.include? key
|
87
117
|
dn_str = build_dn
|
88
118
|
@attributes['dn'] = dn_str
|
119
|
+
@attributes['rn'] = rn
|
89
120
|
end
|
90
121
|
end
|
91
122
|
|
@@ -95,14 +126,34 @@ module ACIrb
|
|
95
126
|
p
|
96
127
|
end
|
97
128
|
|
129
|
+
def get_attributes_to_include
|
130
|
+
incl_attr = {}
|
131
|
+
@attributes.each do |key, value|
|
132
|
+
if props[key.to_s]['isDn'] == true || props[key.to_s]['isRn'] == true || @dirty_props.include?(key) || naming_props.include?(key)
|
133
|
+
incl_attr[key.to_s] = value
|
134
|
+
end
|
135
|
+
end
|
136
|
+
incl_attr
|
137
|
+
end
|
138
|
+
|
139
|
+
def get_children_to_include
|
140
|
+
incl_children = []
|
141
|
+
@children.each do |child|
|
142
|
+
incl_children.push(child) if child.read_only == false
|
143
|
+
end
|
144
|
+
incl_children
|
145
|
+
end
|
146
|
+
|
98
147
|
def to_xml
|
99
148
|
# TODO: Use nokogiri here
|
100
149
|
# https://github.com/sparklemotion/nokogiri/wiki/Cheat-sheet
|
101
150
|
x = REXML::Element.new mo_type.to_s
|
102
|
-
|
103
|
-
|
151
|
+
|
152
|
+
get_attributes_to_include.each do |key, value|
|
153
|
+
x.attributes[key.to_s] = value
|
104
154
|
end
|
105
|
-
|
155
|
+
|
156
|
+
get_children_to_include.each do |child|
|
106
157
|
x.add_element(child.to_xml)
|
107
158
|
end
|
108
159
|
x
|
@@ -111,10 +162,13 @@ module ACIrb
|
|
111
162
|
def to_hash
|
112
163
|
h = {}
|
113
164
|
h[mo_type.to_s] = {}
|
114
|
-
h[mo_type.to_s]['attributes'] =
|
165
|
+
h[mo_type.to_s]['attributes'] = {}
|
166
|
+
get_attributes_to_include.each do |key, value|
|
167
|
+
h[mo_type.to_s]['attributes'][key.to_s] = value
|
168
|
+
end
|
115
169
|
h[mo_type.to_s]['attributes']['dn'] = dn
|
116
170
|
h[mo_type.to_s]['children'] = [] if children.length > 0
|
117
|
-
|
171
|
+
get_children_to_include.each do |child|
|
118
172
|
h[mo_type.to_s]['children'].push(child.to_hash)
|
119
173
|
end
|
120
174
|
h
|
@@ -125,15 +179,17 @@ module ACIrb
|
|
125
179
|
end
|
126
180
|
|
127
181
|
def create(restclient)
|
128
|
-
|
182
|
+
self.status = 'created,modified'
|
129
183
|
restclient.post(data: self,
|
130
184
|
url: "/api/mo/#{dn}.#{restclient.format}")
|
185
|
+
@dirty_props = []
|
131
186
|
end
|
132
187
|
|
133
188
|
def destroy(restclient)
|
134
|
-
|
189
|
+
self.status = 'deleted'
|
135
190
|
restclient.post(data: self,
|
136
191
|
url: "/api/mo/#{dn}.#{restclient.format}")
|
192
|
+
@dirty_props = []
|
137
193
|
end
|
138
194
|
|
139
195
|
def exists(restclient, recurse = false)
|
@@ -182,7 +238,7 @@ module ACIrb
|
|
182
238
|
ret
|
183
239
|
end
|
184
240
|
header_table = hash_to_table(
|
185
|
-
'Class' => class_name
|
241
|
+
'Class' => class_name
|
186
242
|
)
|
187
243
|
attribute_table = hash_to_table(attributes)
|
188
244
|
header_table.push(attribute_table)
|
@@ -191,7 +247,8 @@ module ACIrb
|
|
191
247
|
|
192
248
|
def method_missing(name, *args, &block)
|
193
249
|
lookup_name = name.to_s
|
194
|
-
return @attributes[lookup_name] if @attributes.
|
250
|
+
return @attributes[lookup_name] if @attributes.key? lookup_name
|
251
|
+
return set_prop(lookup_name.chomp('='), args[0]) if @attributes.key? lookup_name.chomp('=')
|
195
252
|
child_matches = []
|
196
253
|
@children.each do |child|
|
197
254
|
child_matches.push(child) if child.class.prefix.sub('-', '') == lookup_name
|
data/lib/naming.rb
CHANGED
data/lib/query.rb
CHANGED
@@ -7,7 +7,7 @@ module ACIrb
|
|
7
7
|
class Query
|
8
8
|
attr_accessor :subtree, :class_filter, :query_target, :subtree_class_filter,
|
9
9
|
:prop_filter, :subtree_prop_filter, :subtree_include,
|
10
|
-
:page_size, :include_prop, :subscribe, :sort_order
|
10
|
+
:page_size, :include_prop, :subscribe, :sort_order, :page
|
11
11
|
|
12
12
|
def make_options
|
13
13
|
query_params = []
|
@@ -28,6 +28,8 @@ module ACIrb
|
|
28
28
|
if @subtree_include
|
29
29
|
query_params.push('page-size=%s' % @page_size) \
|
30
30
|
if @page_size
|
31
|
+
query_params.push('page=%s' % @page) \
|
32
|
+
if @page
|
31
33
|
query_params.push('order-by=%s' % @sort_order) \
|
32
34
|
if @sort_order
|
33
35
|
query_params.push('rsp-prop-include=%s' % @include_prop) \
|