From 204f20cc322ab62f983883217fa96585f119c60e Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sat, 13 Oct 2018 16:59:42 +0200 Subject: [PATCH 01/10] change topology during runtime --- config/topology.png | Bin 0 -> 15409 bytes cqc/backend/cqcProtocol.py | 1 + examples/cqc/pythonLib/corrRNG/aliceTest.py | 12 ++++ examples/cqc/pythonLib/corrRNG/charlieTest.py | 58 ++++++++++++++++++ examples/cqc/pythonLib/corrRNG/run.sh | 1 + 5 files changed, 72 insertions(+) create mode 100644 config/topology.png create mode 100644 examples/cqc/pythonLib/corrRNG/charlieTest.py diff --git a/config/topology.png b/config/topology.png new file mode 100644 index 0000000000000000000000000000000000000000..358cddefcc110c4ed09bff244896389d8e9a92fc GIT binary patch literal 15409 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 literal 0 HcmV?d00001 diff --git a/cqc/backend/cqcProtocol.py b/cqc/backend/cqcProtocol.py index ba80b8d..7765e81 100755 --- a/cqc/backend/cqcProtocol.py +++ b/cqc/backend/cqcProtocol.py @@ -132,6 +132,7 @@ def is_adjacent(self, remote_host_name): :return: """ # Check if a topology is defined, otherwise use fully connected + self._setup_topology(Settings.CONF_TOPOLOGY_FILE) if self.topology is None: return True diff --git a/examples/cqc/pythonLib/corrRNG/aliceTest.py b/examples/cqc/pythonLib/corrRNG/aliceTest.py index 215d0a8..d719515 100644 --- a/examples/cqc/pythonLib/corrRNG/aliceTest.py +++ b/examples/cqc/pythonLib/corrRNG/aliceTest.py @@ -52,6 +52,18 @@ def main(): print("| "+to_print+" |") print("|"+"-"*(len(to_print)+2)+"|") + fh = open(os.environ.get('NETSIM') + "/config/topology.json","w") + fh.write('{"Alice": ["Bob","Charlie"], "Bob": ["Alice", "Charlie"], "Charlie": ["Bob"]}') + + # Create an EPR pair + q = Alice.createEPR("Charlie") + + # Measure qubit + m=q.measure() + to_print="App {}: Measurement outcome is: {}".format(Alice.name,m) + print("|"+"-"*(len(to_print)+2)+"|") + print("| "+to_print+" |") + print("|"+"-"*(len(to_print)+2)+"|") ################################################################################################## main() diff --git a/examples/cqc/pythonLib/corrRNG/charlieTest.py b/examples/cqc/pythonLib/corrRNG/charlieTest.py new file mode 100644 index 0000000..5fee5c9 --- /dev/null +++ b/examples/cqc/pythonLib/corrRNG/charlieTest.py @@ -0,0 +1,58 @@ +# +# Copyright (c) 2017, Stephanie Wehner and Axel Dahlberg +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Stephanie Wehner, QuTech. +# 4. Neither the name of the QuTech organization nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from SimulaQron.general.hostConfig import * +from SimulaQron.cqc.backend.cqcHeader import * +from SimulaQron.cqc.pythonLib.cqc import * + + + +##################################################################################################### +# +# main +# +def main(): + + # Initialize the connection + with CQCConnection("Charlie") as Charlie: + + # Receive qubit + q=Charlie.recvEPR() + + # Measure qubit + m=q.measure() + to_print="App {}: Measurement outcome is: {}".format(Charlie.name,m) + print("|"+"-"*(len(to_print)+2)+"|") + print("| "+to_print+" |") + print("|"+"-"*(len(to_print)+2)+"|") + + +################################################################################################## +main() + diff --git a/examples/cqc/pythonLib/corrRNG/run.sh b/examples/cqc/pythonLib/corrRNG/run.sh index 23908b2..6bd0a39 100755 --- a/examples/cqc/pythonLib/corrRNG/run.sh +++ b/examples/cqc/pythonLib/corrRNG/run.sh @@ -2,3 +2,4 @@ python aliceTest.py & python bobTest.py & +python charlieTest.py & From c3e851e622fdabc077055510a5b5c4205d96ac45 Mon Sep 17 00:00:00 2001 From: Daniel Quinn Date: Sat, 13 Oct 2018 17:05:21 +0100 Subject: [PATCH 02/10] Add the 'cabler' script This is a simple CLI tool to update the config scripts. Run it without arguments for an explanation --- cabler | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100755 cabler diff --git a/cabler b/cabler new file mode 100755 index 0000000..47e2f3f --- /dev/null +++ b/cabler @@ -0,0 +1,162 @@ +#!/usr/bin/env python + +import argparse +import os +import random +import sys + + +class CommandError(Exception): + pass + + +class Command: + + def __init__(self): + + self.config = os.path.join(os.path.dirname(__file__), 'config') + + self.topology = [] + self.__acquire_current_topology() + + self.parser = argparse.ArgumentParser( + description='Re-cable the network') + + subparsers = self.parser.add_subparsers(dest='subcommand') + + parser_add = subparsers.add_parser('add', help='Add a node') + parser_add.add_argument('name', type=str, help='The common name') + parser_add.add_argument('hostname', type=str, help='The hostname') + parser_add.add_argument( + 'port', + type=int, + nargs='?', + help="An available port number (if one isn't specified, it will " + "be generated)" + ) + + parser_remove = subparsers.add_parser('remove', help='Remove help') + parser_remove.add_argument( + 'name', + choices=[_[0] for _ in self.topology] + ) + + self.args = self.parser.parse_args() + + def main(self): + + if not self.args.subcommand: + self.parser.print_help() + sys.exit(0) + + try: + if self.args.subcommand == 'add': + + self.add_node( + self.args.name, + self.args.hostname, + self.args.port + ) + + elif self.args.subcommand == 'remove': + + self.remove_node(self.args.name) + + else: + + raise CommandError( + "Undefined subcommand. " + "This shouldn't be possible. " + "Stop it." + ) + + except CommandError as e: + sys.stderr.write("{}\n".format(e)) + sys.exit(1) + + self.__write_all_the_things() + + sys.exit(0) + + def add_node(self, name, hostname, port): + + if port in [_[2] for _ in self.topology]: + raise CommandError("That port is already in use.") + + if not port: + port = self.__get_random_port() + + sys.stdout.write("Adding {} to the network at {}:{}\n".format( + name, hostname, port)) + + self.topology.append(( + name, + hostname, + port + )) + + def remove_node(self, name): + + sys.stdout.write("Removing {} from the network\n".format(name)) + + tmp = [] + for line in self.topology: + if not line[0] == name: + tmp.append(line) + self.topology = tmp + + def __get_random_port(self): + port = random.randint(8000, 9000) + if port not in [_[2] for _ in self.topology]: + return port + return self.__get_random_port() + + def __write_all_the_things(self): + self.__update_app_nodes() + self.__update_classic_net() + self.__update_cqc_nodes() + self.__update_nodes() + self.__update_virtual_nodes() + + def __acquire_current_topology(self): + with open(os.path.join(self.config, 'appNodes.cfg'), 'r') as r: + for line in r: + if line.startswith('#'): + continue + if not line.strip(): + continue + name, hostname, port = [_.strip() for _ in line.split(',')] + self.topology.append((name, hostname, int(port))) + + # A lot of the following is copypasta, but I'm leaving it this way with the + # assumption that there's something about these files that I'm not yet + # aware of. + + def __update_app_nodes(self): + with open(os.path.join(self.config, 'appNodes.cfg'), 'w') as f: + for line in self.topology: + f.write('{}, {}, {}\n'.format(*line)) + + def __update_classic_net(self): + with open(os.path.join(self.config, 'classicalNet.cfg'), 'w') as f: + for line in self.topology: + f.write('{}, {}, {}\n'.format(*line)) + + def __update_cqc_nodes(self): + with open(os.path.join(self.config, 'cqcNodes.cfg'), 'w') as f: + for line in self.topology: + f.write('{}, {}, {}\n'.format(*line)) + + def __update_nodes(self): + with open(os.path.join(self.config, 'Nodes.cfg'), 'w') as f: + for line in self.topology: + f.write(line[0]) + + def __update_virtual_nodes(self): + with open(os.path.join(self.config, 'virtualNodes.cfg'), 'w') as f: + for line in self.topology: + f.write('{}, {}, {}\n'.format(*line)) + + +if __name__ == '__main__': + Command().main() From 317d3248b7e326d2b600425459b8f866a531ed62 Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sat, 13 Oct 2018 20:57:49 +0200 Subject: [PATCH 03/10] add node --- config/classicalNet.cfg | 2 -- config/logging.cfg | 1 - run/addNewNode.sh | 14 ++++++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 run/addNewNode.sh diff --git a/config/classicalNet.cfg b/config/classicalNet.cfg index 015d1df..df46f85 100755 --- a/config/classicalNet.cfg +++ b/config/classicalNet.cfg @@ -10,5 +10,3 @@ Bob, localhost, 8812 Charlie, localhost, 8813 David, localhost, 8814 - - diff --git a/config/logging.cfg b/config/logging.cfg index 80b4722..ebf34e5 100755 --- a/config/logging.cfg +++ b/config/logging.cfg @@ -27,4 +27,3 @@ args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt= - diff --git a/run/addNewNode.sh b/run/addNewNode.sh new file mode 100644 index 0000000..879180b --- /dev/null +++ b/run/addNewNode.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh +echo +echo "$1, localhost, $2" >> "../config/appNodes.cfg" +echo +echo "$1, localhost, $2" >> "../config/classicalNet.cfg" +echo +echo "$1, localhost, $2" >> "../config/cqcNodes.cfg" +echo +echo "$1, localhost, $2" >> "../config/virtualNodes.cfg" +echo +echo $1 >> "../config/Nodes.cfg" + +python "$NETSIM/run/startNode.py" "$1" & +python "$NETSIM/run/startCQC.py" "$1" & \ No newline at end of file From 7a66631b7631e2ef54d41e603f8a8f5aba50c0d0 Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sun, 14 Oct 2018 10:58:37 +0200 Subject: [PATCH 04/10] add nodes --- config/Nodes.cfg | 2 ++ config/appNodes.cfg | 2 +- config/classicalNet.cfg | 2 +- config/cqcNodes.cfg | 2 +- config/virtualNodes.cfg | 2 +- run/addNode.py | 47 +++++++++++++++++++++++++++++++++++++++++ cabler => run/cabler.py | 0 7 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 run/addNode.py rename cabler => run/cabler.py (100%) diff --git a/config/Nodes.cfg b/config/Nodes.cfg index 02e7dc5..347c49e 100644 --- a/config/Nodes.cfg +++ b/config/Nodes.cfg @@ -3,3 +3,5 @@ Bob Charlie David Eve +Amjad +Amjad \ No newline at end of file diff --git a/config/appNodes.cfg b/config/appNodes.cfg index 913470a..ae041f4 100755 --- a/config/appNodes.cfg +++ b/config/appNodes.cfg @@ -9,4 +9,4 @@ Alice, localhost, 8811 Bob, localhost, 8812 Charlie, localhost, 8813 David, localhost, 8814 -Eve, localhost, 8815 +Eve, localhost, 8815 \ No newline at end of file diff --git a/config/classicalNet.cfg b/config/classicalNet.cfg index df46f85..496e566 100755 --- a/config/classicalNet.cfg +++ b/config/classicalNet.cfg @@ -9,4 +9,4 @@ # Alice, localhost, 8811 Bob, localhost, 8812 Charlie, localhost, 8813 -David, localhost, 8814 +David, localhost, 8814 \ No newline at end of file diff --git a/config/cqcNodes.cfg b/config/cqcNodes.cfg index 8bd031e..7dff845 100755 --- a/config/cqcNodes.cfg +++ b/config/cqcNodes.cfg @@ -9,4 +9,4 @@ Alice, localhost, 8806 Bob, localhost, 8807 Charlie, localhost, 8808 David, localhost, 8809 -Eve, localhost, 8810 +Eve, localhost, 8810 \ No newline at end of file diff --git a/config/virtualNodes.cfg b/config/virtualNodes.cfg index 1b78b8a..a148b4a 100755 --- a/config/virtualNodes.cfg +++ b/config/virtualNodes.cfg @@ -9,4 +9,4 @@ Alice, localhost, 8801 Bob, localhost, 8802 Charlie, localhost, 8803 David, localhost, 8804 -Eve, localhost, 8805 +Eve, localhost, 8805 \ No newline at end of file diff --git a/run/addNode.py b/run/addNode.py new file mode 100644 index 0000000..ef1948b --- /dev/null +++ b/run/addNode.py @@ -0,0 +1,47 @@ +import subprocess +import os +import ast +import cabler + +pass_ok=True +port=None +host=None +node=None + +while pass_ok: + node = input("Enter node: ") + port = input("Enter port: ") + host = input("Enter host: ") + pass_ok=False + +# +cabler = cabler.Command() +cabler.add_node(node, host, port) + + +fh = open("../config/Nodes.cfg", "r") +nodes=[] +for n in fh.readlines(): + nodes.append(n) + +print("The nodes are: ", nodes ) + +neigbors = input("Enter neighbors of "+node ) + +## read the topology file and update it + + +with open("../config/topology.json", "r") as f: + s = f.read() + topology = ast.literal_eval(s) + topology[node] = neighbors + + +fh = open("../config/Nodes.cfg", "w") +fh.write("\n") +fh.write(topology) + +exit() + +os.system("python startNode.py "+node) +os.system("python startCQC.py "+node) diff --git a/cabler b/run/cabler.py similarity index 100% rename from cabler rename to run/cabler.py From 4590c63579e8932d5cfc2058625611062c627e6e Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sun, 14 Oct 2018 11:21:42 +0200 Subject: [PATCH 05/10] add node --- run/addNode.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/run/addNode.py b/run/addNode.py index ef1948b..1e550cc 100644 --- a/run/addNode.py +++ b/run/addNode.py @@ -10,7 +10,7 @@ while pass_ok: node = input("Enter node: ") - port = input("Enter port: ") + port = int(input("Enter port: ")) host = input("Enter host: ") pass_ok=False @@ -26,7 +26,7 @@ print("The nodes are: ", nodes ) -neigbors = input("Enter neighbors of "+node ) +neigbors = input("Enter neigbors of "+ node ) ## read the topology file and update it @@ -34,12 +34,12 @@ with open("../config/topology.json", "r") as f: s = f.read() topology = ast.literal_eval(s) - topology[node] = neighbors + topology[node] = [neigbors] +print(topology) -fh = open("../config/Nodes.cfg", "w") -fh.write("\n") -fh.write(topology) +fh = open("../config/topology.json", "w") +fh.write(str(topology)) exit() From 7a91c7276ced5311c16371cb75a951ed4483f8c2 Mon Sep 17 00:00:00 2001 From: Petros Gigis Date: Sun, 14 Oct 2018 11:36:14 +0200 Subject: [PATCH 06/10] input validation in addNode.py --- run/addNode.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/run/addNode.py b/run/addNode.py index 1e550cc..4903c07 100644 --- a/run/addNode.py +++ b/run/addNode.py @@ -2,19 +2,31 @@ import os import ast import cabler +import socket -pass_ok=True port=None host=None node=None -while pass_ok: - node = input("Enter node: ") - port = int(input("Enter port: ")) - host = input("Enter host: ") - pass_ok=False +node=input("Enter node: ") + +while(True): + try: + port=int(input("Enter port: ")) + if port >= 1024 and port <= 65535: + break + except: + print("Please provide a valid port number in the range 1024-65535.") + +while(True): + try: + host=input("Enter host: ") + socket.gethostbyname(host) + break + except socket.error: + print("Please provide a valid host name.") + -# cabler = cabler.Command() cabler.add_node(node, host, port) From a22daff34afc3f1c1e25096e9d80006570b1168c Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sun, 14 Oct 2018 12:38:11 +0200 Subject: [PATCH 07/10] add backward links, not finished --- config/Nodes.cfg | 8 +------- config/topology.json | 2 +- cqc/backend/cqcProtocol.py | 4 ++++ run/addNewNode.sh | 14 -------------- virtNode/virtual.py | 4 ++++ 5 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 run/addNewNode.sh diff --git a/config/Nodes.cfg b/config/Nodes.cfg index 347c49e..680ae00 100644 --- a/config/Nodes.cfg +++ b/config/Nodes.cfg @@ -1,7 +1 @@ -Alice -Bob -Charlie -David -Eve -Amjad -Amjad \ No newline at end of file +{'Alice': ['Bob'], 'Bob': ['Alice', 'Charlie'], 'Charlie': ['Bob']} \ No newline at end of file diff --git a/config/topology.json b/config/topology.json index cd5f850..18132a2 100644 --- a/config/topology.json +++ b/config/topology.json @@ -1 +1 @@ -{"Alice": ["Bob"], "Bob": ["Alice", "Charlie"], "Charlie": ["Bob"]} \ No newline at end of file +{'Alice': ['Bob'], 'Bob': ['Alice', 'Charlie'], 'Charlie': ['Bob'], 'Amjad': [' Bob']} \ No newline at end of file diff --git a/cqc/backend/cqcProtocol.py b/cqc/backend/cqcProtocol.py index a72faa2..cfe9ff6 100755 --- a/cqc/backend/cqcProtocol.py +++ b/cqc/backend/cqcProtocol.py @@ -158,6 +158,10 @@ def is_adjacent(self, remote_host_name): if self.name in self.topology: if remote_host_name in self.topology[self.name]: + + ## construct a link, if the nodes are not connected + self.virtRoot.callRemote("connect_to_node_by_name", remote_host_name) + return True else: return False diff --git a/run/addNewNode.sh b/run/addNewNode.sh deleted file mode 100644 index 879180b..0000000 --- a/run/addNewNode.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env sh -echo -echo "$1, localhost, $2" >> "../config/appNodes.cfg" -echo -echo "$1, localhost, $2" >> "../config/classicalNet.cfg" -echo -echo "$1, localhost, $2" >> "../config/cqcNodes.cfg" -echo -echo "$1, localhost, $2" >> "../config/virtualNodes.cfg" -echo -echo $1 >> "../config/Nodes.cfg" - -python "$NETSIM/run/startNode.py" "$1" & -python "$NETSIM/run/startCQC.py" "$1" & \ No newline at end of file diff --git a/virtNode/virtual.py b/virtNode/virtual.py index 70769c2..b914baa 100755 --- a/virtNode/virtual.py +++ b/virtNode/virtual.py @@ -219,6 +219,10 @@ def get_connection(self, name): except Exception as e: raise e + def remote_connect_to_node_by_name(self, remote_node_name): + if remote_node_name in not self.conn: + self.connect_to_node(self.config.hostDict[remote_node_name] ) + def connect_to_node(self, node): """ Connects to other node. If node not up yet, waits for CONF_WAIT_TIME seconds. From 1df2cb5a9555bcc2a9d899d94a758a4744630d18 Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sun, 14 Oct 2018 14:12:05 +0200 Subject: [PATCH 08/10] add node. It should logically works, but not tested --- cqc/backend/cqcProtocol.py | 3 +++ virtNode/virtual.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/cqc/backend/cqcProtocol.py b/cqc/backend/cqcProtocol.py index cfe9ff6..f59ac52 100755 --- a/cqc/backend/cqcProtocol.py +++ b/cqc/backend/cqcProtocol.py @@ -153,6 +153,9 @@ def is_adjacent(self, remote_host_name): """ # Check if a topology is defined, otherwise use fully connected self._setup_topology(Settings.CONF_TOPOLOGY_FILE) + # Check the nodes dict + yield self.virtRoot.callRemote("update_hostDict", topology[self.name]) + if self.topology is None: return True diff --git a/virtNode/virtual.py b/virtNode/virtual.py index b914baa..fd18c79 100755 --- a/virtNode/virtual.py +++ b/virtNode/virtual.py @@ -197,6 +197,11 @@ def connectNet(self): e)) raise e + def remote_update_hostDict(self, node_topology): + if len(self.hostDict) != len(node_topology): + self.config.read_config(Settings.CONF_TOPOLOGY_FILE) + + def remote_check_connections(self): """ Checks if all connections are up. (Just checks if the number of connections equal the number of nodes in config-file) From 803a82af7a4531c8b70c87d69e701bb4f91f0117 Mon Sep 17 00:00:00 2001 From: Petros Gigis Date: Sun, 14 Oct 2018 14:55:56 +0200 Subject: [PATCH 09/10] test code, code refactoring at addNode.py --- examples/cqc/pythonLib/corrRNG/petrosTest.py | 57 ++++++++++++ examples/cqc/pythonLib/corrRNG/run.sh | 2 + run/addNode.py | 95 +++++++++++--------- 3 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 examples/cqc/pythonLib/corrRNG/petrosTest.py diff --git a/examples/cqc/pythonLib/corrRNG/petrosTest.py b/examples/cqc/pythonLib/corrRNG/petrosTest.py new file mode 100644 index 0000000..89a06a1 --- /dev/null +++ b/examples/cqc/pythonLib/corrRNG/petrosTest.py @@ -0,0 +1,57 @@ +# +# Copyright (c) 2017, Stephanie Wehner and Axel Dahlberg +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Stephanie Wehner, QuTech. +# 4. Neither the name of the QuTech organization nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from SimulaQron.general.hostConfig import * +from SimulaQron.cqc.backend.cqcHeader import * +from SimulaQron.cqc.pythonLib.cqc import * + + + +##################################################################################################### +# +# main +# +def main(): + + # Initialize the connection + with CQCConnection("Petros") as Petros: + + # Create an EPR pair + q = Petros.createEPR("Bob") + + # Measure qubit + m=q.measure() + to_print="App {}: Measurement outcome is: {}".format(Petros.name,m) + print("|"+"-"*(len(to_print)+2)+"|") + print("| "+to_print+" |") + print("|"+"-"*(len(to_print)+2)+"|") + +################################################################################################## +main() + diff --git a/examples/cqc/pythonLib/corrRNG/run.sh b/examples/cqc/pythonLib/corrRNG/run.sh index 6bd0a39..57b7b82 100755 --- a/examples/cqc/pythonLib/corrRNG/run.sh +++ b/examples/cqc/pythonLib/corrRNG/run.sh @@ -3,3 +3,5 @@ python aliceTest.py & python bobTest.py & python charlieTest.py & +python ../../../../../run/addNode.py & +python petrosTest.py & \ No newline at end of file diff --git a/run/addNode.py b/run/addNode.py index 4903c07..ef330a9 100644 --- a/run/addNode.py +++ b/run/addNode.py @@ -3,57 +3,66 @@ import ast import cabler import socket +import json -port=None -host=None -node=None -node=input("Enter node: ") +def get_input(): + port, host, node = None, None, None -while(True): - try: - port=int(input("Enter port: ")) - if port >= 1024 and port <= 65535: - break - except: - print("Please provide a valid port number in the range 1024-65535.") - -while(True): - try: - host=input("Enter host: ") - socket.gethostbyname(host) - break - except socket.error: - print("Please provide a valid host name.") + node=input("Enter node: ") + while(True): + try: + port=int(input("Enter port: ")) + if port >= 8000 and port <= 9000: + break + except: + print("Please provide a valid port number in the range 8000-9000.") -cabler = cabler.Command() -cabler.add_node(node, host, port) + while(True): + try: + host=input("Enter host: ") + socket.gethostbyname(host) + break + except socket.error: + print("Please provide a valid host name.") + return port, host, node -fh = open("../config/Nodes.cfg", "r") -nodes=[] -for n in fh.readlines(): - nodes.append(n) +def add_cabler(port, host, node): + cabler = cabler.Command() + cabler.add_node(node, host, port) -print("The nodes are: ", nodes ) +def read_config_Nodes(): + fh = open("../config/Nodes.cfg", "r") + nodes=[] + for n in fh.readlines(): + nodes.append(n) + print("The nodes are: ", nodes ) + return nodes -neigbors = input("Enter neigbors of "+ node ) +def get_input_neigbors(node): + neigbors = input("Enter neigbors of "+ node ) + return neigbors ## read the topology file and update it - - -with open("../config/topology.json", "r") as f: - s = f.read() - topology = ast.literal_eval(s) - topology[node] = [neigbors] - -print(topology) - -fh = open("../config/topology.json", "w") -fh.write(str(topology)) - -exit() - -os.system("python startNode.py "+node) -os.system("python startCQC.py "+node) +def update_topology(node, neigbors): + with open("../config/topology.json", "r") as f: + s = f.read() + topology = ast.literal_eval(s) + topology[node] = [neigbors] + print(topology) + + with open('../config/topology.json', 'w') as fp: + json.dump(topology, fp) + + +if __name__ == "__main__": + port, host, node = get_input() + add_cabler(port, host, node) + nodes = read_config_Nodes() + neigbors = get_input_neigbors(node) + update_topology(node, neigbors) + + os.system("python startNode.py "+node) + os.system("python startCQC.py "+node) From b5fedf193b7c67c90e30f86166f707ede9f92b12 Mon Sep 17 00:00:00 2001 From: amjadmajid Date: Sun, 14 Oct 2018 17:28:34 +0200 Subject: [PATCH 10/10] add nodes not working --- config/Nodes.cfg | 6 +++- config/appNodes.cfg | 7 ----- config/cqcNodes.cfg | 7 ----- config/topology.json | 2 +- config/virtualNodes.cfg | 7 ----- cqc/backend/cqcProtocol.py | 5 ++++ examples/cqc/pythonLib/corrRNG/run.sh | 7 ++--- run/addNode.py | 40 +++++++++++++++++---------- run/cabler.py | 1 + run/startNode.py | 2 +- virtNode/virtual.py | 3 +- 11 files changed, 44 insertions(+), 43 deletions(-) diff --git a/config/Nodes.cfg b/config/Nodes.cfg index 680ae00..731dab6 100644 --- a/config/Nodes.cfg +++ b/config/Nodes.cfg @@ -1 +1,5 @@ -{'Alice': ['Bob'], 'Bob': ['Alice', 'Charlie'], 'Charlie': ['Bob']} \ No newline at end of file +Alice +Bob +Charlie +David +Eve \ No newline at end of file diff --git a/config/appNodes.cfg b/config/appNodes.cfg index ae041f4..9f88dc8 100755 --- a/config/appNodes.cfg +++ b/config/appNodes.cfg @@ -1,10 +1,3 @@ -# Network configuration file -# -# For each host its informal name, as well as its location in the network must -# be listed. -# -# [name], [hostname], [port number] -# Alice, localhost, 8811 Bob, localhost, 8812 Charlie, localhost, 8813 diff --git a/config/cqcNodes.cfg b/config/cqcNodes.cfg index 7dff845..0f95991 100755 --- a/config/cqcNodes.cfg +++ b/config/cqcNodes.cfg @@ -1,10 +1,3 @@ -# Network configuration file -# -# For each host its informal name, as well as its location in the network must -# be listed. -# -# [name], [hostname], [port number] -# Alice, localhost, 8806 Bob, localhost, 8807 Charlie, localhost, 8808 diff --git a/config/topology.json b/config/topology.json index 18132a2..6a71558 100644 --- a/config/topology.json +++ b/config/topology.json @@ -1 +1 @@ -{'Alice': ['Bob'], 'Bob': ['Alice', 'Charlie'], 'Charlie': ['Bob'], 'Amjad': [' Bob']} \ No newline at end of file +{"Alice": ["Bob","Charlie"], "Bob": ["Alice", "Charlie"], "Charlie": ["Bob"]} \ No newline at end of file diff --git a/config/virtualNodes.cfg b/config/virtualNodes.cfg index a148b4a..7d604ca 100755 --- a/config/virtualNodes.cfg +++ b/config/virtualNodes.cfg @@ -1,10 +1,3 @@ -# Network configuration file -# -# For each host its informal name, as well as its location in the network must -# be listed. -# -# [name], [hostname], [port number] -# Alice, localhost, 8801 Bob, localhost, 8802 Charlie, localhost, 8803 diff --git a/cqc/backend/cqcProtocol.py b/cqc/backend/cqcProtocol.py index f59ac52..5e88fc5 100755 --- a/cqc/backend/cqcProtocol.py +++ b/cqc/backend/cqcProtocol.py @@ -98,6 +98,11 @@ def lookup(self, ip, port): Lookup name of remote host used within SimulaQron given ip and portnumber. """ + # # Check if a topology is defined, otherwise use fully connected + # self._setup_topology(Settings.CONF_TOPOLOGY_FILE) + # # Check the nodes dict + # yield self.virtRoot.callRemote("update_hostDict", topology[self.name]) + for entry in self.cqcNet.hostDict: node = self.cqcNet.hostDict[entry] if (node.ip == ip) and (node.port == port): diff --git a/examples/cqc/pythonLib/corrRNG/run.sh b/examples/cqc/pythonLib/corrRNG/run.sh index 57b7b82..478ad6e 100755 --- a/examples/cqc/pythonLib/corrRNG/run.sh +++ b/examples/cqc/pythonLib/corrRNG/run.sh @@ -1,7 +1,6 @@ #!/bin/sh - +python ../../../../run/addNode.py python aliceTest.py & -python bobTest.py & -python charlieTest.py & -python ../../../../../run/addNode.py & +# python bobTest.py & +# python charlieTest.py & python petrosTest.py & \ No newline at end of file diff --git a/run/addNode.py b/run/addNode.py index ef330a9..da52440 100644 --- a/run/addNode.py +++ b/run/addNode.py @@ -1,14 +1,22 @@ import subprocess import os import ast -import cabler +from cabler import Command import socket import json +config = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', 'config')) +run = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', 'run')) + +nodesFile = os.environ.get('NETSIM') + "/config/Nodes.cfg" +topologyFile = os.environ.get('NETSIM') + "/config/topology.json" + +startNode = os.environ.get('NETSIM') + "/run/startNode.py" +startCQC = os.environ.get('NETSIM') + "/run/startCQC.py" +# startCQC = os.path.join(run, 'startCQC.py') def get_input(): port, host, node = None, None, None - node=input("Enter node: ") while(True): @@ -30,14 +38,14 @@ def get_input(): return port, host, node def add_cabler(port, host, node): - cabler = cabler.Command() + cabler = Command() cabler.add_node(node, host, port) - + def read_config_Nodes(): - fh = open("../config/Nodes.cfg", "r") + fh = open(nodesFile, "r") nodes=[] for n in fh.readlines(): - nodes.append(n) + nodes.append(n.strip()) print("The nodes are: ", nodes ) return nodes @@ -47,14 +55,14 @@ def get_input_neigbors(node): ## read the topology file and update it def update_topology(node, neigbors): - with open("../config/topology.json", "r") as f: - s = f.read() - topology = ast.literal_eval(s) + with open(topologyFile, "r") as f: + # s = f.read() + topology = json.load(f) topology[node] = [neigbors] - print(topology) + print("The new topology {}".format(topology)) - with open('../config/topology.json', 'w') as fp: - json.dump(topology, fp) + with open(topologyFile, 'w') as fp: + fp.write(str(topology)) if __name__ == "__main__": @@ -64,5 +72,9 @@ def update_topology(node, neigbors): neigbors = get_input_neigbors(node) update_topology(node, neigbors) - os.system("python startNode.py "+node) - os.system("python startCQC.py "+node) + print("Where are here 0") + print ("python " + startNode + " " +node) + os.system("python " + startNode + " " +node + "&") + print("Where are here 1") + os.system("python "+ startCQC + " " +node + "&") + print("Where are here 2") diff --git a/run/cabler.py b/run/cabler.py index 3cd42b7..18863d2 100755 --- a/run/cabler.py +++ b/run/cabler.py @@ -144,6 +144,7 @@ def add_node( self.topology[key].append((name, hostname, port)) self.topology['Nodes'].append(name) + self.__write_all_the_things() def remove_node(self, name): for key in ('appNodes', 'cqcNodes', 'Nodes', 'virtualNodes'): diff --git a/run/startNode.py b/run/startNode.py index 9571fb3..db84823 100755 --- a/run/startNode.py +++ b/run/startNode.py @@ -37,5 +37,5 @@ virtualFile = os.environ.get('NETSIM') + "/config/virtualNodes.cfg" be = backEnd(sys.argv[1], virtualFile) - +print("----> ", sys.argv[1]) node = be.start(maxQubits=Settings.CONF_MAXQUBITS, maxRegisters=Settings.CONF_MAXREGS) diff --git a/virtNode/virtual.py b/virtNode/virtual.py index fd18c79..79ac4d3 100755 --- a/virtNode/virtual.py +++ b/virtNode/virtual.py @@ -225,7 +225,8 @@ def get_connection(self, name): raise e def remote_connect_to_node_by_name(self, remote_node_name): - if remote_node_name in not self.conn: + print("remte_node_name: {}".format(remote_node_name)) + if remote_node_name not in self.conn: self.connect_to_node(self.config.hostDict[remote_node_name] ) def connect_to_node(self, node):