Лампы: g.scripts.update() : TypeError: элемент последовательности 2: ожидаемая строка или Unicode, найден NoneType

Я использую 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(). Я просто не могу понять, что я делаю неправильно. Буду признателен за любую помощь.


person liv2hak    schedule 18.07.2014    source источник


Ответы (2)


Вам нужно сохранить свои сценарии в файле с именем gremlin.groovy или указать пространство имен сценария, когда вы получите его из указателя сценариев Bulbs.

Как и Rexster, Bulbs использует первую часть имени файла Groovy в качестве пространства имен.

Например, методы, определенные в файлах gremlin.groovy, добавляются в пространство имен Bulbs gremlin.

Все предопределенные сценарии Gremlin для Bulbs определены в gremlin.groovy файлах, поэтому gremlin является пространством имен по умолчанию:

В вашем приложении может быть несколько/дополнительных gremlin.groovy файлов. Сделайте это, если вы хотите сохранить все в одном и том же пространстве имен или если вы хотите переопределить предопределенный метод:

>>> g.scripts.update("/path/to/gremlin.groovy") # add scripts to gremlin namespace

См... https://github.com/espeed/bulbs/blob/f666fa89b3c99bc0a6b4e964aa1bff70b05a2e96/bulbs/groovy.py#L112

Вы можете создавать пространства имен для конкретных приложений и моделей, определяя свои методы Gremlin в файлах с такими именами, как myapp.groovy или somemodel.groovy:

>>> g.scripts.update("/path/to/myapp.groovy")     # add scripts to myapp namespace
>>> g.scripts.update("/path/to/somemodel.groovy") # add scripts to somemodel namespace

А затем, чтобы получить скрипт в определенном пространстве имен, выполните:

>>> script = g.scripts.get('myapp:isConnected')      # use prefix notation, or...
>>> script = g.scripts.get('isConnected', 'myapp')   # specify namespace as arg

См... https://github.com/espeed/bulbs/blob/f666fa89b3c99bc0a6b4e964aa1bff70b05a2e96/bulbs/groovy.py#L77

Чтобы сгенерировать конкатенированные файлы сценариев на стороне сервера для каждого пространства имен, используйте метод g.make_script_files():

>>> g.make_script_files() # write files to the current dir, or...
>>> g.make_script_files("/path/to/scripts/dir")    # write files to specified dir

Метод make_scripte_files() создаст отдельный файл .groovy для каждого пространства имен. Если вы переопределяете метод в пространстве имен, в сгенерированный файл будет включен только последний.

См... https://github.com/espeed/bulbs/blob/f666fa89b3c99bc0a6b4e964aa1bff70b05a2e96/bulbs/rexster/graph.py#L62

Подробнее см....

person espeed    schedule 20.07.2014

Для этого может быть «путь лампочки», но вы можете попытаться выставить свою функцию глобально, поместив ее на сервер с помощью Rexster. Затем в разделе <script-engine><init-scripts> вы можете просто добавить свой is_connected.groovy. В образце rexster.xml уже должен быть такой пример:

<script-engines>
    <script-engine>
        <name>gremlin-groovy</name>
        <reset-threshold>-1</reset-threshold>
        <init-scripts>config/is_connected.groovy</init-scripts>
        <imports>com.tinkerpop.rexster.client.*</imports>
        <static-imports>java.lang.Math.PI</static-imports>
    </script-engine>
</script-engines>
person stephen mallette    schedule 19.07.2014