From c24526b5d3c76f871e3d052ac8f681258f7e8f56 Mon Sep 17 00:00:00 2001 From: Thom Carlin Date: Thu, 8 Feb 2024 11:33:41 -0500 Subject: [PATCH] Add Getting Started Guide (#925) --- .../creating_a_basic_network.rst | 104 ++++++++++++++++++ docs/source/getting_started_guide/index.rst | 28 +++++ .../installing_receptor.rst | 21 ++++ .../getting_started_guide/introduction.rst | 16 +++ docs/source/getting_started_guide/mesh.png | Bin 0 -> 23784 bytes .../trying_sample_commands.rst | 53 +++++++++ docs/source/index.rst | 1 + docs/source/user_guide/basic_usage.rst | 2 + docs/source/user_guide/connecting_nodes.rst | 1 + docs/source/user_guide/index.rst | 33 ++++-- .../user_guide/interacting_with_nodes.rst | 2 + 11 files changed, 249 insertions(+), 12 deletions(-) create mode 100644 docs/source/getting_started_guide/creating_a_basic_network.rst create mode 100644 docs/source/getting_started_guide/index.rst create mode 100644 docs/source/getting_started_guide/installing_receptor.rst create mode 100644 docs/source/getting_started_guide/introduction.rst create mode 100644 docs/source/getting_started_guide/mesh.png create mode 100644 docs/source/getting_started_guide/trying_sample_commands.rst diff --git a/docs/source/getting_started_guide/creating_a_basic_network.rst b/docs/source/getting_started_guide/creating_a_basic_network.rst new file mode 100644 index 000000000..98358ac7a --- /dev/null +++ b/docs/source/getting_started_guide/creating_a_basic_network.rst @@ -0,0 +1,104 @@ + +.. _creating_a_basic_network: + +############################### +Creating a basic 3-node network +############################### + +In this section, we will create a three-node network. +The three nodes are: foo, bar, and mal. + +`foo -> bar <- mal` + +foo and mal are directly connected to bar with TCP connections. + +foo can reach mal by sending network packets through bar. + +*********************** +Receptor configurations +*********************** + +1. Create three configuration files, one for each node. + + **foo.yml** + +.. code-block:: yaml + + --- + - node: + id: foo + + - control-service: + service: control + filename: /tmp/foo.sock + + - tcp-peer: + address: localhost:2222 + redial: true + + - log-level: debug + ... + +**bar.yml** + +.. code-block:: yaml + + --- + - node: + id: bar + + - control-service: + service: control + filename: /tmp/bar.sock + + - tcp-listener: + port: 2222 + + - log-level: debug + ... + + **mal.yml** + +.. code-block:: yaml + + --- + - node: + id: mal + + - control-service: + service: control + filename: /tmp/mal.sock + + - tcp-peer: + address: localhost:2222 + redial: true + + - log-level: debug + + - work-command: + workType: echo + command: bash + params: "-c \"while read -r line; do echo $line; sleep 1; done\"" + allowruntimeparams: true + ... + +2. Run the services in separate terminals. + +.. code-block:: bash + + ./receptor --config foo.yml + +.. code-block:: bash + + ./receptor --config bar.yml + +.. code-block:: bash + + ./receptor --config mal.yml + +.. seealso:: + + :ref:`configuring_receptor_with_a_config_file` + Configuring Receptor with a configuration file + :ref:`connecting_nodes` + Detail on connecting receptor nodes diff --git a/docs/source/getting_started_guide/index.rst b/docs/source/getting_started_guide/index.rst new file mode 100644 index 000000000..30017aa72 --- /dev/null +++ b/docs/source/getting_started_guide/index.rst @@ -0,0 +1,28 @@ +############################# +Getting started with Receptor +############################# + +Receptor is an overlay network intended to ease the distribution of work across +a large and dispersed collection of workers. Receptor nodes establish peer-to- +peer connections with each other via existing networks. Once connected, the re- +ceptor mesh provides datagram (UDP-like) and stream (TCP-like) capabilities to +applications, as well as robust unit-of-work handling with resiliency against +transient network failures. + +.. image:: mesh.png + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + introduction + installing_receptor + creating_a_basic_network + trying_sample_commands + +.. seealso:: + + :ref:`interacting_with_nodes` + Further examples of working with nodes + :ref:`connecting_nodes` + Detail on connecting receptor nodes diff --git a/docs/source/getting_started_guide/installing_receptor.rst b/docs/source/getting_started_guide/installing_receptor.rst new file mode 100644 index 000000000..86b18bc39 --- /dev/null +++ b/docs/source/getting_started_guide/installing_receptor.rst @@ -0,0 +1,21 @@ + +.. _installing_receptor: + +################### +Installing Receptor +################### + +1. `Download receptor `_ +2. Install receptor (per installation guide below) +3. Install receptorctl + +.. code-block:: bash + + pip install receptorctl + +.. seealso:: + + :ref:`installing` + Detailed installation instructions + :ref:`using_receptor_containers` + Using receptor in containers diff --git a/docs/source/getting_started_guide/introduction.rst b/docs/source/getting_started_guide/introduction.rst new file mode 100644 index 000000000..3a4d5dd5f --- /dev/null +++ b/docs/source/getting_started_guide/introduction.rst @@ -0,0 +1,16 @@ +######################## +Introduction to receptor +######################## + +Receptor is an overlay network. +It eases the work distribution across a large and dispersed collection +of workers + +Receptor nodes establish peer-to-peer connections with each other through +existing networks + +Once connected, the receptor mesh provides: + +* Datagram (UDP-like) and stream (TCP-like) capabilities to applications +* Robust unit-of-work handling +* Resiliency against transient network failures diff --git a/docs/source/getting_started_guide/mesh.png b/docs/source/getting_started_guide/mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..9de9f0e3ecf70af277a63e395d34cf2d51b8f20c GIT binary patch literal 23784 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%0A93d~QzfaR@5_Yo<4aA_14Oqf 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