def do_idl(schema_file, remote, *commands): schema_helper = ovs.db.idl.SchemaHelper(schema_file) track_notify = False if remote.startswith("ssl:"): if len(commands) < 3: sys.stderr.write("SSL connection requires private key, " "certificate for private key, and peer CA " "certificate as arguments\n") sys.exit(1) ovs.stream.Stream.ssl_set_private_key_file(commands[0]) ovs.stream.Stream.ssl_set_certificate_file(commands[1]) ovs.stream.Stream.ssl_set_ca_cert_file(commands[2]) commands = commands[3:] if commands and commands[0] == "track-notify": commands = commands[1:] track_notify = True if commands and commands[0].startswith("?"): readonly = {} for x in commands[0][1:].split("?"): readonly = [] table, columns = x.split(":") columns = columns.split(",") for index, column in enumerate(columns): if column[-1] == '!': columns[index] = columns[index][:-1] readonly.append(columns[index]) schema_helper.register_columns(table, columns, readonly) commands = commands[1:] else: schema_helper.register_all() idl = ovs.db.idl.Idl(remote, schema_helper) if "simple3" in idl.tables: idl.index_create("simple3", "simple3_by_name") if commands: remotes = remote.split(',') stream = None for r in remotes: error, stream = ovs.stream.Stream.open_block( ovs.stream.Stream.open(r)) if not error and stream: break stream = None if not stream: sys.stderr.write("failed to connect to \"%s\"" % remote) sys.exit(1) rpc = ovs.jsonrpc.Connection(stream) else: rpc = None symtab = {} seqno = 0 step = 0 def mock_notify(event, row, updates=None): output = "%03d: " % step output += "event:" + str(event) + ", row={" output += get_simple_table_printable_row(row) + "}, updates=" if updates is None: output += "None" else: output += "{" + get_simple_table_printable_row(updates) + "}" output += '\n' sys.stdout.write(output) sys.stdout.flush() if track_notify and "simple" in idl.tables: idl.notify = mock_notify commands = list(commands) if len(commands) >= 1 and "condition" in commands[0]: update_condition(idl, commands.pop(0)) sys.stdout.write("%03d: change conditions\n" % step) sys.stdout.flush() step += 1 for command in commands: if command.startswith("+"): # The previous transaction didn't change anything. command = command[1:] else: # Wait for update. while idl.change_seqno == seqno and not idl.run(): rpc.run() poller = ovs.poller.Poller() idl.wait(poller) rpc.wait(poller) poller.block() print_idl(idl, step) step += 1 seqno = idl.change_seqno if command == "reconnect": print("%03d: reconnect" % step) sys.stdout.flush() step += 1 idl.force_reconnect() elif "condition" in command: update_condition(idl, command) sys.stdout.write("%03d: change conditions\n" % step) sys.stdout.flush() step += 1 elif not command.startswith("["): idl_set(idl, command, step) step += 1 else: json = ovs.json.from_string(command) if isinstance(json, six.string_types): sys.stderr.write("\"%s\": %s\n" % (command, json)) sys.exit(1) json = substitute_uuids(json, symtab) request = ovs.jsonrpc.Message.create_request("transact", json) error, reply = rpc.transact_block(request) if error: sys.stderr.write("jsonrpc transaction failed: %s\n" % os.strerror(error)) sys.exit(1) elif reply.error is not None: sys.stderr.write("jsonrpc transaction failed: %s\n" % reply.error) sys.exit(1) sys.stdout.write("%03d: " % step) sys.stdout.flush() step += 1 if reply.result is not None: parse_uuids(reply.result, symtab) reply.id = None sys.stdout.write("%s\n" % ovs.json.to_string(reply.to_json())) sys.stdout.flush() if rpc: rpc.close() while idl.change_seqno == seqno and not idl.run(): poller = ovs.poller.Poller() idl.wait(poller) poller.block() print_idl(idl, step) step += 1 idl.close() print("%03d: done" % step)
def do_idl(schema_file, remote, *commands): schema_helper = ovs.db.idl.SchemaHelper(schema_file) track_notify = False if remote.startswith("ssl:"): if len(commands) < 3: sys.stderr.write("SSL connection requires private key, " "certificate for private key, and peer CA " "certificate as arguments\n") sys.exit(1) ovs.stream.Stream.ssl_set_private_key_file(commands[0]) ovs.stream.Stream.ssl_set_certificate_file(commands[1]) ovs.stream.Stream.ssl_set_ca_cert_file(commands[2]) commands = commands[3:] if commands and commands[0] == "track-notify": commands = commands[1:] track_notify = True if commands and commands[0].startswith("?"): readonly = {} for x in commands[0][1:].split("?"): readonly = [] table, columns = x.split(":") columns = columns.split(",") for index, column in enumerate(columns): if column[-1] == '!': columns[index] = columns[index][:-1] readonly.append(columns[index]) schema_helper.register_columns(table, columns, readonly) commands = commands[1:] else: schema_helper.register_all() idl = ovs.db.idl.Idl(remote, schema_helper) if "simple3" in idl.tables: idl.index_create("simple3", "simple3_by_name") if commands: error, stream = ovs.stream.Stream.open_block( ovs.stream.Stream.open(remote)) if error: sys.stderr.write("failed to connect to \"%s\"" % remote) sys.exit(1) rpc = ovs.jsonrpc.Connection(stream) else: rpc = None symtab = {} seqno = 0 step = 0 def mock_notify(event, row, updates=None): output = "%03d: " % step output += "event:" + str(event) + ", row={" output += get_simple_table_printable_row(row) + "}, updates=" if updates is None: output += "None" else: output += "{" + get_simple_table_printable_row(updates) + "}" output += '\n' sys.stdout.write(output) sys.stdout.flush() if track_notify and "simple" in idl.tables: idl.notify = mock_notify commands = list(commands) if len(commands) >= 1 and "condition" in commands[0]: update_condition(idl, commands.pop(0)) sys.stdout.write("%03d: change conditions\n" % step) sys.stdout.flush() step += 1 for command in commands: if command.startswith("+"): # The previous transaction didn't change anything. command = command[1:] else: # Wait for update. while idl.change_seqno == seqno and not idl.run(): rpc.run() poller = ovs.poller.Poller() idl.wait(poller) rpc.wait(poller) poller.block() print_idl(idl, step) step += 1 seqno = idl.change_seqno if command == "reconnect": print("%03d: reconnect" % step) sys.stdout.flush() step += 1 idl.force_reconnect() elif "condition" in command: update_condition(idl, command) sys.stdout.write("%03d: change conditions\n" % step) sys.stdout.flush() step += 1 elif not command.startswith("["): idl_set(idl, command, step) step += 1 else: json = ovs.json.from_string(command) if isinstance(json, six.string_types): sys.stderr.write("\"%s\": %s\n" % (command, json)) sys.exit(1) json = substitute_uuids(json, symtab) request = ovs.jsonrpc.Message.create_request("transact", json) error, reply = rpc.transact_block(request) if error: sys.stderr.write("jsonrpc transaction failed: %s" % os.strerror(error)) sys.exit(1) elif reply.error is not None: sys.stderr.write("jsonrpc transaction failed: %s" % reply.error) sys.exit(1) sys.stdout.write("%03d: " % step) sys.stdout.flush() step += 1 if reply.result is not None: parse_uuids(reply.result, symtab) reply.id = None sys.stdout.write("%s\n" % ovs.json.to_string(reply.to_json())) sys.stdout.flush() if rpc: rpc.close() while idl.change_seqno == seqno and not idl.run(): poller = ovs.poller.Poller() idl.wait(poller) poller.block() print_idl(idl, step) step += 1 idl.close() print("%03d: done" % step)