Я использую TitanGraphDB + Cassandra. Я запускаю Титан следующим образом
cd titan-cassandra-0.3.1
bin/titan.sh config/titan-server-rexster.xml config/titan-server-cassandra.properties
У меня есть оболочка Rexster, которую я могу использовать для связи с Titan + Cassandra выше.
cd rexster-console-2.3.0
bin/rexster-console.sh
Я пытаюсь смоделировать топологию сети с помощью базы данных Titan Graph. Я хочу запрограммировать базу данных Titan Graph из моей программы на Python. Я использую пакет луковиц для этого. Я создаю пять типов вершин
- switch
- port
- device
- flow
- flow_entry
Я создаю ребра между вершинами, которые связаны логически. Края не обозначены.
Допустим, я хочу проверить связь между Vertex A
и Vertex B
.
У меня есть отличный скрипт is_connected.groovy
def isConnected (portA, portB) {
return portA.both().retain([portB]).hasNext()
}
Теперь с моей консоли rexster
g = rexster.getGraph("graph")
==>titangraph[embeddedcassandra:null]
rexster[groovy]> g.V('type', 'flow')
==>v[116]
==>v[100]
rexster[groovy]> g.V('type', 'flow_entry')
==>v[120]
==>v[104]
Как вы можете видеть выше, у меня есть две вершины потока типа v[116]
и v[100]
.
У меня есть две вершины типа flow_entry
v[120]
и v[104]
Я хочу проверить связь между v[120]
и v[116]
, например
rexster[groovy]> ?e is_connected.groovy
==>null
rexster[groovy]> is_connected(g.v(116),g.v(120))
==>true
Пока все хорошо. Теперь я хочу использовать этот скрипт из моей программы на Python, которая импортирует пакет лампочек.
Моя структура каталогов выглядит следующим образом.
Projects/ryu
--> ryu/app_simple_switch.py
Projects/ryu_extras
--> rexster-console-2.3.0
--> titan-cassandra-0.3.1
Мой скрипт is_connected.groovy, который содержит функцию/процедуру isConnected(), хранится в Projects/ryu_extras/rexster-console-2.3.0
Теперь из моей программы на Python, которая находится в Projects/ryu/ryu/app/simple_switch.py
, я пытаюсь сделать следующее.
self.g.scripts.update('Projects/ryu_extras/rexster-console-2.3.0/is_connected.groovy') # add file to scripts index
script = self.g.scripts.get('isConnected') # get a function by its name
params = dict(portA=flow,portB=fe1) # put function params in dict
items = self.g.gremlin.query(script, params)
self.create_outgoing_edge(flow,fe1)
self.create_outgoing_edge(fe1,sw_vertex)
Я получаю следующую ошибку.
hub: uncaught exception: Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/ryu/lib/hub.py", line 48, in _launch
func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 256, in _event_loop
handler(ev)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 322, in _packet_in_handler
self.compute_path(src,dst,datapath)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 289, in compute_path
self.g.scripts.update('/home/karthik/Projects/ryu_extras/rexster-console-2.3.0/is_connected.groovy') # add file to scripts index
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 120, in update
methods = self._get_methods(file_path)
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 160, in _get_methods
return Parser(file_path).get_methods()
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 255, in __init__
Scanner(handlers).scan(groovy_file)
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 246, in scan
self.get_item(fin,line)
File "/usr/local/lib/python2.7/dist-packages/bulbs/groovy.py", line 236, in get_item
content = "\n".join(sections).strip()
TypeError: sequence item 2: expected string or Unicode, NoneType found
Как вы можете видеть, ошибка находится в функции scripts.update(). Я просто не могу понять, что я делаю неправильно. Буду признателен за любую помощь.