mirror of
https://github.com/fluencelabs/registry.git
synced 2025-04-24 17:52:14 +00:00
feat(aqua): add tests (#127)
This commit is contained in:
parent
f179336869
commit
9ca1f0498c
146
.github/e2e/docker-compose.yml
vendored
Normal file
146
.github/e2e/docker-compose.yml
vendored
Normal file
@ -0,0 +1,146 @@
|
||||
networks:
|
||||
fluence:
|
||||
driver: bridge
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 10.50.10.0/24
|
||||
|
||||
services:
|
||||
fluence-1:
|
||||
image: ${RUST_PEER_IMAGE}
|
||||
ports:
|
||||
- 7771:7771
|
||||
- 9991:9991
|
||||
command:
|
||||
- --aqua-pool-size=2
|
||||
- -t=7771
|
||||
- -w=9991
|
||||
- -x=10.50.10.10
|
||||
- --external-maddrs
|
||||
- /dns4/fluence-1/tcp/7771
|
||||
- /dns4/fluence-1/tcp/9991/ws
|
||||
- --allow-private-ips
|
||||
- --local
|
||||
# - --bootstraps=/dns/fluence-1/tcp/7771
|
||||
# 12D3KooWBM3SdXWqGaawQDGQ6JprtwswEg3FWGvGhmgmMez1vRbR
|
||||
- -k=hK62afickoeP2uZbmSkAYXxxqP8ozq16VRN7qfTP719EHC5V5tjrtW57BSjUr8GvsEXmJRbtejUWyPZ2rZMyQdq
|
||||
volumes:
|
||||
- ./registry:/.fluence/v1/builtins/registry
|
||||
networks:
|
||||
fluence:
|
||||
ipv4_address: 10.50.10.10
|
||||
|
||||
fluence-2:
|
||||
image: ${RUST_PEER_IMAGE}
|
||||
ports:
|
||||
- 7772:7772
|
||||
- 9992:9992
|
||||
command:
|
||||
- --aqua-pool-size=2
|
||||
- -t=7772
|
||||
- -w=9992
|
||||
- -x=10.50.10.20
|
||||
- --external-maddrs
|
||||
- /dns4/fluence-2/tcp/7772
|
||||
- /dns4/fluence-2/tcp/9992/ws
|
||||
- --allow-private-ips
|
||||
- --bootstraps=/dns/fluence-1/tcp/7771
|
||||
# 12D3KooWQdpukY3p2DhDfUfDgphAqsGu5ZUrmQ4mcHSGrRag6gQK
|
||||
- -k=2WijTVdhVRzyZamWjqPx4V4iNMrajegNMwNa2PmvPSZV6RRpo5M2fsPWdQr22HVRubuJhhSw8BrWiGt6FPhFAuXy
|
||||
volumes:
|
||||
- ./registry:/.fluence/v1/builtins/registry
|
||||
networks:
|
||||
fluence:
|
||||
ipv4_address: 10.50.10.20
|
||||
|
||||
fluence-3:
|
||||
image: ${RUST_PEER_IMAGE}
|
||||
ports:
|
||||
- 7773:7773
|
||||
- 9993:9993
|
||||
command:
|
||||
- --aqua-pool-size=2
|
||||
- -t=7773
|
||||
- -w=9993
|
||||
- -x=10.50.10.30
|
||||
- --external-maddrs
|
||||
- /dns4/fluence-3/tcp/7773
|
||||
- /dns4/fluence-3/tcp/9993/ws
|
||||
- --allow-private-ips
|
||||
- --bootstraps=/dns/fluence-1/tcp/7771
|
||||
# 12D3KooWRT8V5awYdEZm6aAV9HWweCEbhWd7df4wehqHZXAB7yMZ
|
||||
- -k=2n2wBVanBeu2GWtvKBdrYK9DJAocgG3PrTUXMharq6TTfxqTL4sLdXL9BF23n6rsnkAY5pR9vBtx2uWYDQAiZdrX
|
||||
volumes:
|
||||
- ./registry:/.fluence/v1/builtins/registry
|
||||
networks:
|
||||
fluence:
|
||||
ipv4_address: 10.50.10.30
|
||||
|
||||
fluence-4:
|
||||
image: ${RUST_PEER_IMAGE}
|
||||
ports:
|
||||
- 7774:7774
|
||||
- 9994:9994
|
||||
command:
|
||||
- --aqua-pool-size=2
|
||||
- -t=7774
|
||||
- -w=9994
|
||||
- -x=10.50.10.40
|
||||
- --external-maddrs
|
||||
- /dns4/fluence-4/tcp/7774
|
||||
- /dns4/fluence-4/tcp/9994/ws
|
||||
- --allow-private-ips
|
||||
- --bootstraps=/dns/fluence-1/tcp/7771
|
||||
# 12D3KooWBzLSu9RL7wLP6oUowzCbkCj2AGBSXkHSJKuq4wwTfwof
|
||||
- -k=4zp8ucAikkjB8CmkufYiFBW4QCDUCbQG7yMjviX7W8bMyN5rfChQ2Pi5QCWThrCTbAm9uq5nbFbxtFcNZq3De4dX
|
||||
volumes:
|
||||
- ./registry:/.fluence/v1/builtins/registry
|
||||
networks:
|
||||
fluence:
|
||||
ipv4_address: 10.50.10.40
|
||||
|
||||
fluence-5:
|
||||
image: ${RUST_PEER_IMAGE}
|
||||
ports:
|
||||
- 7775:7775
|
||||
- 9995:9995
|
||||
command:
|
||||
- --aqua-pool-size=2
|
||||
- -t=7775
|
||||
- -w=9995
|
||||
- -x=10.50.10.50
|
||||
- --external-maddrs
|
||||
- /dns4/fluence-5/tcp/7775
|
||||
- /dns4/fluence-5/tcp/9995/ws
|
||||
- --allow-private-ips
|
||||
- --bootstraps=/dns/fluence-1/tcp/7771
|
||||
# 12D3KooWBf6hFgrnXwHkBnwPGMysP3b1NJe5HGtAWPYfwmQ2MBiU
|
||||
- -k=3ry26rm5gkJXvdqRH4FoM3ezWq4xVVsBQF7wtKq4E4pbuaa6p1F84tNqifUS7DdfJL9hs2gcdW64Wc342vHZHMUp
|
||||
volumes:
|
||||
- ./registry:/.fluence/v1/builtins/registry
|
||||
networks:
|
||||
fluence:
|
||||
ipv4_address: 10.50.10.50
|
||||
|
||||
fluence-6:
|
||||
image: ${RUST_PEER_IMAGE}
|
||||
ports:
|
||||
- 7776:7776
|
||||
- 9996:9996
|
||||
command:
|
||||
- --aqua-pool-size=2
|
||||
- -t=7776
|
||||
- -w=9996
|
||||
- --bootstraps=/dns/fluence-1/tcp/7771
|
||||
- -x=10.50.10.60
|
||||
- --external-maddrs
|
||||
- /dns4/fluence-6/tcp/7776
|
||||
- /dns4/fluence-6/tcp/9996/ws
|
||||
- --allow-private-ips
|
||||
# 12D3KooWPisGn7JhooWhggndz25WM7vQ2JmA121EV8jUDQ5xMovJ
|
||||
- -k=5Qh8bB1sF28uLPwr3HTvEksCeC6mAWQvebCfcgv9y6j4qKwSzNKm2tzLUg4nACUEo2KZpBw11gNCnwaAdM7o1pEn
|
||||
volumes:
|
||||
- ./registry:/.fluence/v1/builtins/registry
|
||||
networks:
|
||||
fluence:
|
||||
ipv4_address: 10.50.10.60
|
58
.github/workflows/registry.yml
vendored
58
.github/workflows/registry.yml
vendored
@ -1,58 +0,0 @@
|
||||
name: registry
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
|
||||
env:
|
||||
RUST_BACKTRACE: 1
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
concurrency:
|
||||
group: "${{ github.workflow }}-${{ github.ref }}"
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
nextest:
|
||||
name: "cargo nextest"
|
||||
runs-on: builder
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: service
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: nightly
|
||||
target: wasm32-wasi
|
||||
default: true
|
||||
components: rustfmt, clippy
|
||||
|
||||
- name: "Cache rust"
|
||||
uses: Swatinem/rust-cache@v1
|
||||
|
||||
- name: "Install marine"
|
||||
uses: baptiste0928/cargo-install@v1
|
||||
with:
|
||||
crate: marine
|
||||
|
||||
- name: "Build service"
|
||||
run: ./build.sh
|
||||
|
||||
- name: "cargo fmt"
|
||||
run: cargo fmt --all -- --check
|
||||
|
||||
- name: "cargo clippy"
|
||||
run: cargo clippy -Z unstable-options --all
|
||||
|
||||
- name: "Install nextest"
|
||||
run: cargo install --locked cargo-nextest --version 0.9.22
|
||||
|
||||
- name: "cargo nextest"
|
||||
run: cargo nextest run --release --all-features --no-fail-fast --test-threads=1 --
|
||||
|
62
.github/workflows/run-tests.yml
vendored
Normal file
62
.github/workflows/run-tests.yml
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
name: Run tests
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
|
||||
push:
|
||||
branches:
|
||||
- "main"
|
||||
|
||||
concurrency:
|
||||
group: "${{ github.workflow }}-${{ github.ref }}"
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
aqua:
|
||||
uses: ./.github/workflows/tests.yml
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
cargo:
|
||||
name: "Run cargo tests"
|
||||
runs-on: builder
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: service
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Setup rust toolchain
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
|
||||
- name: Install marine
|
||||
uses: baptiste0928/cargo-install@v1
|
||||
with:
|
||||
crate: marine
|
||||
|
||||
- name: Build service
|
||||
run: ./build.sh
|
||||
|
||||
- name: Run cargo fmt
|
||||
run: cargo fmt --all -- --check
|
||||
|
||||
- name: Run cargo clippy
|
||||
env:
|
||||
RUSTFLAGS: ""
|
||||
run: cargo clippy -Z unstable-options --all
|
||||
|
||||
- name: Install cargo-nextest
|
||||
uses: baptiste0928/cargo-install@v1
|
||||
with:
|
||||
crate: cargo-nextest
|
||||
|
||||
- name: Run cargo nextest
|
||||
env:
|
||||
RUSTFLAGS: ""
|
||||
NEXTEST_RETRIES: 2
|
||||
NEXTEST_TEST_THREADS: 1
|
||||
run: cargo nextest run --release --all-features --no-fail-fast
|
143
.github/workflows/tests.yml
vendored
Normal file
143
.github/workflows/tests.yml
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
name: Run tests with workflow_call
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
fluence-env:
|
||||
description: "Fluence enviroment to run tests agains"
|
||||
type: string
|
||||
default: "local"
|
||||
rust-peer-image:
|
||||
description: "rust-peer image tag"
|
||||
type: string
|
||||
default: "fluencelabs/fluence:minimal"
|
||||
aqua-version:
|
||||
description: "@fluencejs/aqua version"
|
||||
type: string
|
||||
ref:
|
||||
description: "GitHub ref to checkout to"
|
||||
type: string
|
||||
default: "main"
|
||||
|
||||
env:
|
||||
FORCE_COLOR: true
|
||||
RUST_PEER_IMAGE: "${{ inputs.rust-peer-image }}"
|
||||
FLUENCE_ENV: "${{ inputs.fluence-env }}"
|
||||
|
||||
jobs:
|
||||
aqua:
|
||||
name: "Run aqua tests"
|
||||
runs-on: builder
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Import secrets
|
||||
uses: hashicorp/vault-action@v2.4.1
|
||||
with:
|
||||
url: https://vault.fluence.dev
|
||||
path: jwt/github
|
||||
role: ci
|
||||
method: jwt
|
||||
jwtGithubAudience: "https://github.com/fluencelabs"
|
||||
jwtTtl: 300
|
||||
secrets: |
|
||||
kv/docker-registry/basicauth/ci username | DOCKER_USERNAME ;
|
||||
kv/docker-registry/basicauth/ci password | DOCKER_PASSWORD ;
|
||||
kv/npm-registry/basicauth/ci token | NODE_AUTH_TOKEN;
|
||||
|
||||
- name: Checkout registry
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: fluencelabs/registry
|
||||
ref: ${{ inputs.ref }}
|
||||
|
||||
- name: Setup node with self-hosted registry
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: "16"
|
||||
registry-url: "https://npm.fluence.dev"
|
||||
cache: "npm"
|
||||
cache-dependency-path: "**/package-lock.json"
|
||||
|
||||
- name: Run npm install in aqua
|
||||
run: npm install
|
||||
working-directory: aqua
|
||||
|
||||
- name: Set aqua version from branch
|
||||
if: inputs.aqua-version != ''
|
||||
run: npm i --save-dev @fluencelabs/aqua@${{ inputs.aqua-version }}
|
||||
working-directory: aqua
|
||||
|
||||
- name: Run npm install in aqua-tests
|
||||
run: npm install
|
||||
working-directory: aqua-tests
|
||||
|
||||
- name: Set aqua version from branch
|
||||
if: inputs.aqua-version != ''
|
||||
run: npm i --save-dev @fluencelabs/aqua@${{ inputs.aqua-version }}
|
||||
working-directory: aqua-tests
|
||||
|
||||
- name: Setup rust toolchain
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
|
||||
- name: Install marine
|
||||
uses: baptiste0928/cargo-install@v1
|
||||
with:
|
||||
crate: marine
|
||||
|
||||
- name: Build service
|
||||
run: ./build.sh
|
||||
working-directory: service
|
||||
|
||||
- name: Create builtin distribution package
|
||||
run: ./builtin-package/package.sh
|
||||
|
||||
- name: Unpack registry package
|
||||
run: tar xvf registry.tar.gz
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: docker.fluence.dev
|
||||
username: ${{ env.DOCKER_USERNAME }}
|
||||
password: ${{ env.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Pull rust-peer image
|
||||
run: docker pull $RUST_PEER_IMAGE
|
||||
|
||||
- name: Setup docker-compose
|
||||
uses: KengoTODA/actions-setup-docker-compose@v1.0.9
|
||||
with:
|
||||
version: 'v2.10.0'
|
||||
|
||||
- name: Run rust-peer
|
||||
uses: isbang/compose-action@v1.1.0
|
||||
with:
|
||||
compose-file: ".github/e2e/docker-compose.yml"
|
||||
down-flags: "--volumes"
|
||||
|
||||
- name: Setup python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.9"
|
||||
cache: "pip"
|
||||
cache-dependency-path: aqua-tests/requirements.txt
|
||||
|
||||
- name: Install python requirements
|
||||
run: pip install -r requirements.txt
|
||||
working-directory: aqua-tests
|
||||
|
||||
# TODO run an aqua script in a loop to check
|
||||
- name: Wait for registry to be deployed
|
||||
run: sleep 40
|
||||
|
||||
- name: Run aqua tests
|
||||
run: pytest -n auto
|
||||
working-directory: aqua-tests
|
||||
|
||||
- name: Dump rust-peer logs on failure
|
||||
if: failure()
|
||||
uses: jwalton/gh-docker-logs@v1
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -13,3 +13,5 @@ registry.tar.gz
|
||||
# Remove after https://github.com/fluencelabs/aqua/issues/287
|
||||
aqua/target/typescript/**
|
||||
example/src/generated/**
|
||||
|
||||
**/__pycache__
|
||||
|
7
aqua-tests/README.md
Normal file
7
aqua-tests/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Registry API tests
|
||||
|
||||
## How to run
|
||||
|
||||
- `npm i`
|
||||
- `pip3 install -r requirements.txt`
|
||||
- `pytest -n auto`
|
8
aqua-tests/aqua/test.aqua
Normal file
8
aqua-tests/aqua/test.aqua
Normal file
@ -0,0 +1,8 @@
|
||||
module Test
|
||||
|
||||
import "@fluencelabs/aqua-lib/builtin.aqua"
|
||||
import "@fluencelabs/registry/resources-api.aqua"
|
||||
export getResource, createResource, getResourceId, get_peer_id, registerServiceRecord, resolveResource, unregisterService
|
||||
|
||||
func get_peer_id() -> PeerId:
|
||||
<- INIT_PEER_ID
|
10
aqua-tests/config.py
Normal file
10
aqua-tests/config.py
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
def get_local():
|
||||
return [
|
||||
'/ip4/127.0.0.1/tcp/9991/ws/p2p/12D3KooWBM3SdXWqGaawQDGQ6JprtwswEg3FWGvGhmgmMez1vRbR',
|
||||
'/ip4/127.0.0.1/tcp/9992/ws/p2p/12D3KooWQdpukY3p2DhDfUfDgphAqsGu5ZUrmQ4mcHSGrRag6gQK',
|
||||
'/ip4/127.0.0.1/tcp/9993/ws/p2p/12D3KooWRT8V5awYdEZm6aAV9HWweCEbhWd7df4wehqHZXAB7yMZ',
|
||||
'/ip4/127.0.0.1/tcp/9994/ws/p2p/12D3KooWBzLSu9RL7wLP6oUowzCbkCj2AGBSXkHSJKuq4wwTfwof',
|
||||
'/ip4/127.0.0.1/tcp/9995/ws/p2p/12D3KooWBf6hFgrnXwHkBnwPGMysP3b1NJe5HGtAWPYfwmQ2MBiU',
|
||||
'/ip4/127.0.0.1/tcp/9996/ws/p2p/12D3KooWPisGn7JhooWhggndz25WM7vQ2JmA121EV8jUDQ5xMovJ'
|
||||
]
|
14441
aqua-tests/package-lock.json
generated
Normal file
14441
aqua-tests/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
34
aqua-tests/package.json
Normal file
34
aqua-tests/package.json
Normal file
@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "aqua-tests",
|
||||
"version": "1.0.0",
|
||||
"description": "Aqua Registry library",
|
||||
|
||||
"dependencies": {
|
||||
"@fluencelabs/aqua-lib": "^0.5.1",
|
||||
"@fluencelabs/trust-graph": "^3.0.1",
|
||||
"@fluencelabs/registry": "file:../aqua"
|
||||
},
|
||||
"scripts": {
|
||||
"compile-aqua": "aqua -i . -o ./target/typescript",
|
||||
"generate-aqua": "../service/build.sh",
|
||||
"build": "npm run compile-aqua"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/fluencelabs/registry.git",
|
||||
"directory": "aqua"
|
||||
},
|
||||
"keywords": [
|
||||
"aqua",
|
||||
"fluence"
|
||||
],
|
||||
"author": "Fluence Labs",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/fluencelabs/registry/issues"
|
||||
},
|
||||
"homepage": "https://github.com/fluencelabs/registry",
|
||||
"devDependencies": {
|
||||
"@fluencelabs/aqua": "0.7.6-344"
|
||||
}
|
||||
}
|
4
aqua-tests/requirements.txt
Normal file
4
aqua-tests/requirements.txt
Normal file
@ -0,0 +1,4 @@
|
||||
delegator.py==0.1.1
|
||||
pytest==7.1.3
|
||||
pytest-xdist==2.5.0
|
||||
ed25519==1.5
|
137
aqua-tests/test_aqua.py
Normal file
137
aqua-tests/test_aqua.py
Normal file
@ -0,0 +1,137 @@
|
||||
import delegator
|
||||
import random
|
||||
import json
|
||||
import ed25519
|
||||
import os
|
||||
from config import get_local
|
||||
|
||||
def get_sk():
|
||||
return ed25519.create_keypair()[0].to_ascii(encoding="base64").decode("utf-8")
|
||||
|
||||
def get_relay():
|
||||
env = os.environ.get("FLUENCE_ENV")
|
||||
if env == "local":
|
||||
peers = get_local()
|
||||
else:
|
||||
if env is None:
|
||||
env = "testnet"
|
||||
c = delegator.run(f"npx aqua config default_peers {env}", block=True)
|
||||
peers = c.out.strip().split("\n")
|
||||
|
||||
assert len(peers) != 0, c.err
|
||||
peer = peers[random.randint(0, len(peers) - 1)]
|
||||
assert len(peer) != 0, c.err
|
||||
|
||||
return peer
|
||||
|
||||
def get_random_peer_id():
|
||||
addr = get_relay()
|
||||
return addr.split("/")[-1]
|
||||
|
||||
def run_aqua(func, args, sk, relay=get_relay()):
|
||||
|
||||
# "a" : arg1, "b" : arg2 .....
|
||||
data = {chr(97 + i): arg for (i, arg) in enumerate(args)}
|
||||
call = f"{func}(" + ", ".join([chr(97 + i) for i in range(0, len(args))]) + ")"
|
||||
file = "./aqua/test.aqua"
|
||||
|
||||
command = f"npx aqua run --addr {relay} -f '{call}' -i {file} --sk {sk} -d '{json.dumps(data)}'"
|
||||
print(command)
|
||||
c = delegator.run(command, block=True)
|
||||
if len(c.err) != 0:
|
||||
print(c.err)
|
||||
|
||||
result = json.loads(c.out)
|
||||
print(result)
|
||||
return result
|
||||
|
||||
def create_resource(label, sk):
|
||||
result, error = run_aqua("createResource", [label], sk)
|
||||
assert len(result) == 1, error
|
||||
return result[0]
|
||||
|
||||
def get_peer_id(sk):
|
||||
return run_aqua("get_peer_id", [], sk)
|
||||
|
||||
def test_create_resource():
|
||||
sk = get_sk()
|
||||
label = "some_label"
|
||||
result = create_resource(label, sk)
|
||||
peer_id = get_peer_id(sk)
|
||||
resource_id = run_aqua("getResourceId", [label, peer_id], sk)
|
||||
assert(result == resource_id)
|
||||
|
||||
def test_get_resource():
|
||||
sk = get_sk()
|
||||
label = "some_label"
|
||||
resource_id = create_resource(label, sk)
|
||||
peer_id = get_peer_id(sk)
|
||||
result, error = run_aqua("getResource", [resource_id], sk)
|
||||
assert len(result) == 1, error
|
||||
resource = result[0]
|
||||
assert resource["id"] == resource_id, error
|
||||
assert resource["owner_peer_id"] == peer_id, error
|
||||
assert resource["label"] == label, error
|
||||
|
||||
def test_register_record_unregister():
|
||||
sk = get_sk()
|
||||
relay = get_relay()
|
||||
label = "some_label"
|
||||
value = "some_value"
|
||||
peer_id = get_peer_id(sk)
|
||||
service_id = "id"
|
||||
|
||||
resource_id = create_resource(label, sk)
|
||||
result, error = run_aqua("registerServiceRecord", [resource_id, value, peer_id, service_id], sk, relay)
|
||||
assert result, error
|
||||
|
||||
result, error = run_aqua("resolveResource", [resource_id, 2], sk, relay)
|
||||
assert len(result) == 1, error
|
||||
|
||||
records = result[0]
|
||||
assert len(records) == 1, "records not found"
|
||||
|
||||
record = records[0]
|
||||
assert record["metadata"]["key_id"] == resource_id
|
||||
assert record["metadata"]["issued_by"] == peer_id
|
||||
assert record["metadata"]["peer_id"] == peer_id
|
||||
assert record["metadata"]["service_id"] == [service_id]
|
||||
|
||||
result, error = run_aqua("unregisterService", [resource_id, peer_id], sk, relay)
|
||||
assert result, error
|
||||
|
||||
result, error = run_aqua("resolveResource", [resource_id, 2], sk, relay)
|
||||
assert len(result) == 1, error
|
||||
assert len(result[0]) == 0
|
||||
|
||||
def test_register_unregister_remote_record():
|
||||
sk = get_sk()
|
||||
relay = get_relay()
|
||||
label = "some_label"
|
||||
value = "some_value"
|
||||
issuer_peer_id = get_peer_id(sk)
|
||||
peer_id = get_random_peer_id()
|
||||
service_id = "id"
|
||||
|
||||
resource_id = create_resource(label, sk)
|
||||
result, error = run_aqua("registerServiceRecord", [resource_id, value, peer_id, service_id], sk, relay)
|
||||
assert result, error
|
||||
|
||||
result, error = run_aqua("resolveResource", [resource_id, 2], sk, relay)
|
||||
assert len(result) == 1, error
|
||||
|
||||
records = result[0]
|
||||
assert len(records) == 1, "records not found"
|
||||
|
||||
record = records[0]
|
||||
assert record["metadata"]["key_id"] == resource_id
|
||||
assert record["metadata"]["issued_by"] == issuer_peer_id
|
||||
assert record["metadata"]["peer_id"] == peer_id
|
||||
assert record["metadata"]["service_id"] == [service_id]
|
||||
|
||||
result, error = run_aqua("unregisterService", [resource_id, peer_id], sk, relay)
|
||||
assert result, error
|
||||
|
||||
result, error = run_aqua("resolveResource", [resource_id, 2], sk, relay)
|
||||
assert len(result) == 1, error
|
||||
assert len(result[0]) == 0
|
@ -116,7 +116,7 @@ func registerServiceRecord(resource_id: ResourceId, value: string, peer_id: Peer
|
||||
|
||||
|
||||
func unregisterService(resource_id: ResourceId, peer_id: PeerId) -> bool, *Error:
|
||||
success: *bool
|
||||
success: ?bool
|
||||
error: *Error
|
||||
|
||||
on HOST_PEER_ID:
|
||||
@ -126,7 +126,7 @@ func unregisterService(resource_id: ResourceId, peer_id: PeerId) -> bool, *Error
|
||||
error <<- sig_result.error!
|
||||
success <<- false
|
||||
else:
|
||||
key, error_get <- getResource(resource_id)
|
||||
key, error_get <- getResourceHelper(resource_id)
|
||||
if key == nil:
|
||||
appendErrors(error, error_get)
|
||||
success <<- false
|
||||
@ -165,10 +165,11 @@ func unregisterService(resource_id: ResourceId, peer_id: PeerId) -> bool, *Error
|
||||
|
||||
<- succ, error
|
||||
|
||||
func resolveResource(resource_id: ResourceId, ack: i16) -> []Record, *Error:
|
||||
func resolveResource(resource_id: ResourceId, ack: i16) -> ?[]Record, *Error:
|
||||
on HOST_PEER_ID:
|
||||
nodes <- getNeighbors(resource_id)
|
||||
res: *[]Record
|
||||
result: ?[]Record
|
||||
records: *[]Record
|
||||
error: *Error
|
||||
successful: *bool
|
||||
for n <- nodes par:
|
||||
@ -177,7 +178,7 @@ func resolveResource(resource_id: ResourceId, ack: i16) -> []Record, *Error:
|
||||
t <- Peer.timestamp_sec()
|
||||
get_result <- Registry.get_records(resource_id, t)
|
||||
if get_result.success:
|
||||
res <<- get_result.result
|
||||
records <<- get_result.result
|
||||
successful <<- true
|
||||
else:
|
||||
error <<- get_result.error
|
||||
@ -185,17 +186,25 @@ func resolveResource(resource_id: ResourceId, ack: i16) -> []Record, *Error:
|
||||
success <- wait(successful, ack, DEFAULT_TIMEOUT)
|
||||
if success == false:
|
||||
error <<- "timeout exceeded"
|
||||
|
||||
result <- Registry.merge(res)
|
||||
if result.success == false:
|
||||
error <<- result.error
|
||||
<- result.result, error
|
||||
else:
|
||||
merged <- Registry.merge(records)
|
||||
if merged.success == false:
|
||||
error <<- merged.error
|
||||
else:
|
||||
result <<- merged.result
|
||||
<- result, error
|
||||
|
||||
-- Execute the given call on providers
|
||||
-- Note that you can provide another Aqua function as an argument to this one
|
||||
func executeOnProviders(resource_id: ResourceId, ack: i16, call: Record -> ()) -> *Error:
|
||||
providers, error <- resolveResource(resource_id, ack)
|
||||
for r <- providers par:
|
||||
on r.metadata.peer_id via r.metadata.relay_id:
|
||||
call(r)
|
||||
<- error
|
||||
func executeOnResource(resource_id: ResourceId, ack: i16, call: Record -> ()) -> bool, *Error:
|
||||
success: ?bool
|
||||
result, error <- resolveResource(resource_id, ack)
|
||||
|
||||
if result == nil:
|
||||
success <<- false
|
||||
else:
|
||||
for r <- result! par:
|
||||
on r.metadata.peer_id via r.metadata.relay_id:
|
||||
call(r)
|
||||
success <<- true
|
||||
<- success!, error
|
||||
|
@ -6,12 +6,15 @@ This example shows how to use Registry to discover and call fluence services wit
|
||||
|
||||
## Table of contents:
|
||||
|
||||
1. [Set up the environment](#set-up-the-environment)
|
||||
2. [Deploy echo service written in Rust](#deploy-echo-service-written-in-rust)
|
||||
3. [Run echo service written in JS/TS](#run-echo-service-written-in-jsts)
|
||||
4. [Register both services in Registry](#register-both-services-using-registry)
|
||||
5. [Call both services using resourceId](#call-both-services-using-resourceid)
|
||||
6. [Remove service record](#remove-service-record)
|
||||
- [Services advertisement and discovery](#services-advertisement-and-discovery)
|
||||
- [Overview](#overview)
|
||||
- [Table of contents:](#table-of-contents)
|
||||
- [Set up the environment](#set-up-the-environment)
|
||||
- [Deploy echo service written in Rust](#deploy-echo-service-written-in-rust)
|
||||
- [Run echo service written in JS/TS](#run-echo-service-written-in-jsts)
|
||||
- [Register both services using Registry](#register-both-services-using-registry)
|
||||
- [Call both services using resourceId](#call-both-services-using-resourceid)
|
||||
- [Remove service record](#remove-service-record)
|
||||
|
||||
## Set up the environment
|
||||
|
||||
@ -31,7 +34,7 @@ You can also use VSCode with [Aqua extension](https://marketplace.visualstudio.c
|
||||
|
||||
## Deploy echo service written in Rust
|
||||
|
||||
To deploy the Fluence application execute
|
||||
To deploy the Fluence application execute
|
||||
```sh
|
||||
fluence deploy
|
||||
```
|
||||
@ -61,7 +64,7 @@ npm run start
|
||||
|
||||
First, aqua code in [src/aqua/export.aqua](src/aqua/export.aqua) will be compiled to typescript and you will see it in [src/generated/export.ts](src/generated/export.ts).
|
||||
|
||||
Then you possibly will have to confirm ts-node installation and [src/echo.ts](src/echo.ts) will be executed. It registers local js service with serviceId "echo", so anyone who has `relayId`, `peerId` and `serviceId` ("echo") will be able to call it. Copy the command from the terminal, which will look similar to this:
|
||||
Then you possibly will have to confirm ts-node installation and [src/echo.ts](src/echo.ts) will be executed. It registers local js service with serviceId "echo", so anyone who has `relayId`, `peerId` and `serviceId` ("echo") will be able to call it. Copy the command from the terminal, which will look similar to this:
|
||||
```sh
|
||||
fluence run -f 'echoJS("12D3KooWCmnhnGvKTqEXpVLzdrYu3TkQ3HcLyArGJpLPooJQ69dN", "12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", "echo", "hi")'
|
||||
```
|
||||
@ -98,9 +101,9 @@ It is `resourceId`, which we will use to register our services, and then we will
|
||||
|
||||
To register the `echo` service written in Rust, replace `RESOURCE_ID` and execute
|
||||
```sh
|
||||
fluence run -f 'registerService("RESOURCE_ID")'
|
||||
fluence run -f 'registerServiceRecord("RESOURCE_ID")'
|
||||
```
|
||||
This command calls [registerService](src/aqua/main.aqua#L26) aqua function, which uses `registerServiceRecord` function from Resources API to register the rust service on this `resourceId`
|
||||
This command calls [registerServiceRecord](src/aqua/main.aqua#L26) aqua function, which uses `registerServiceRecord` function from Resources API to register the rust service on this `resourceId`
|
||||
|
||||
You should see this output:
|
||||
```
|
||||
|
@ -10,7 +10,7 @@ services:
|
||||
|
||||
dependencies:
|
||||
npm:
|
||||
"@fluencelabs/aqua": 0.7.6-344
|
||||
"@fluencelabs/aqua": 0.7.7-349
|
||||
"@fluencelabs/registry": 0.6.2
|
||||
"@fluencelabs/aqua-lib": 0.4.3
|
||||
cargo:
|
||||
|
56
example/package-lock.json
generated
56
example/package-lock.json
generated
@ -8,8 +8,20 @@
|
||||
"name": "echo",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@fluencelabs/fluence": "^0.25.1",
|
||||
"@fluencelabs/fluence-network-environment": "^1.0.13"
|
||||
"@fluencelabs/fluence": "^0.26.2",
|
||||
"@fluencelabs/fluence-network-environment": "^1.0.13",
|
||||
"@fluencelabs/registry": "file:../aqua"
|
||||
}
|
||||
},
|
||||
"../aqua": {
|
||||
"version": "0.3.1",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fluencelabs/aqua-lib": "^0.5.1",
|
||||
"@fluencelabs/trust-graph": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fluencelabs/aqua": "^0.7.3-318"
|
||||
}
|
||||
},
|
||||
"node_modules/@ampproject/remapping": {
|
||||
@ -645,9 +657,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@fluencelabs/avm": {
|
||||
"version": "0.30.5",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.30.5.tgz",
|
||||
"integrity": "sha512-Ea+ZX80/MjoKyLp8l+NublSW46gAqa4DXNDcYFxx30LhBSxtAGAr+ZiK0LlWKqFkj4EQtB6VuG9hRLNwgzZ1FA=="
|
||||
"version": "0.30.11",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.30.11.tgz",
|
||||
"integrity": "sha512-7Uz2H0MH+22b1LpH6pFZxkgSaYRNbaTjJIGOZFF3lDK3diiwfInk9fdR/r76mOhjqicqg0qnzK+w/9g5yJ1HYg=="
|
||||
},
|
||||
"node_modules/@fluencelabs/connection": {
|
||||
"version": "0.2.0",
|
||||
@ -674,11 +686,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@fluencelabs/fluence": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.25.2.tgz",
|
||||
"integrity": "sha512-NTyF4Xx9IJuXpogERFlf5HCeZ55exSd46o3CoBiAEBpw73qwtYjOfUcbhYLU+FZzI2o0aIhbnYIb0fkzEOZpiQ==",
|
||||
"version": "0.26.2",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.26.2.tgz",
|
||||
"integrity": "sha512-QixzyAqOE7EYVWIbaryez+T4gyEWXMF2Yk57nieAGvJfJXhcJbw2oYXL7dcHpd7JEDvKmgwpX5XWEbdsudbHmw==",
|
||||
"dependencies": {
|
||||
"@fluencelabs/avm": "0.30.5",
|
||||
"@fluencelabs/avm": "0.30.11",
|
||||
"@fluencelabs/connection": "0.2.0",
|
||||
"@fluencelabs/interfaces": "0.1.0",
|
||||
"@fluencelabs/keypair": "0.2.0",
|
||||
@ -764,6 +776,10 @@
|
||||
"ts-jest": "^27.1.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@fluencelabs/registry": {
|
||||
"resolved": "../aqua",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/@istanbuljs/load-nyc-config": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
|
||||
@ -7085,9 +7101,9 @@
|
||||
}
|
||||
},
|
||||
"@fluencelabs/avm": {
|
||||
"version": "0.30.5",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.30.5.tgz",
|
||||
"integrity": "sha512-Ea+ZX80/MjoKyLp8l+NublSW46gAqa4DXNDcYFxx30LhBSxtAGAr+ZiK0LlWKqFkj4EQtB6VuG9hRLNwgzZ1FA=="
|
||||
"version": "0.30.11",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.30.11.tgz",
|
||||
"integrity": "sha512-7Uz2H0MH+22b1LpH6pFZxkgSaYRNbaTjJIGOZFF3lDK3diiwfInk9fdR/r76mOhjqicqg0qnzK+w/9g5yJ1HYg=="
|
||||
},
|
||||
"@fluencelabs/connection": {
|
||||
"version": "0.2.0",
|
||||
@ -7110,11 +7126,11 @@
|
||||
}
|
||||
},
|
||||
"@fluencelabs/fluence": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.25.2.tgz",
|
||||
"integrity": "sha512-NTyF4Xx9IJuXpogERFlf5HCeZ55exSd46o3CoBiAEBpw73qwtYjOfUcbhYLU+FZzI2o0aIhbnYIb0fkzEOZpiQ==",
|
||||
"version": "0.26.2",
|
||||
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.26.2.tgz",
|
||||
"integrity": "sha512-QixzyAqOE7EYVWIbaryez+T4gyEWXMF2Yk57nieAGvJfJXhcJbw2oYXL7dcHpd7JEDvKmgwpX5XWEbdsudbHmw==",
|
||||
"requires": {
|
||||
"@fluencelabs/avm": "0.30.5",
|
||||
"@fluencelabs/avm": "0.30.11",
|
||||
"@fluencelabs/connection": "0.2.0",
|
||||
"@fluencelabs/interfaces": "0.1.0",
|
||||
"@fluencelabs/keypair": "0.2.0",
|
||||
@ -7184,6 +7200,14 @@
|
||||
"ts-jest": "^27.1.4"
|
||||
}
|
||||
},
|
||||
"@fluencelabs/registry": {
|
||||
"version": "file:../aqua",
|
||||
"requires": {
|
||||
"@fluencelabs/aqua": "^0.7.3-318",
|
||||
"@fluencelabs/aqua-lib": "^0.5.1",
|
||||
"@fluencelabs/trust-graph": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"@istanbuljs/load-nyc-config": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
|
||||
|
@ -13,7 +13,7 @@
|
||||
],
|
||||
"author": "Fluence Labs",
|
||||
"dependencies": {
|
||||
"@fluencelabs/fluence": "^0.25.1",
|
||||
"@fluencelabs/fluence": "^0.26.2",
|
||||
"@fluencelabs/fluence-network-environment": "^1.0.13"
|
||||
},
|
||||
"prettier": {}
|
||||
|
@ -1,4 +1,4 @@
|
||||
module Export
|
||||
import "services/echoService.aqua"
|
||||
import registerServiceRecord from "@fluencelabs/registry/resources-api.aqua"
|
||||
import registerServiceRecord from "../../aqua/resources-api.aqua"
|
||||
export EchoService, registerServiceRecord
|
||||
|
@ -2,8 +2,8 @@ module Main
|
||||
|
||||
import App from "deployed.app.aqua"
|
||||
import EchoService from "services/echoService.aqua"
|
||||
import "@fluencelabs/registry/resources-api.aqua"
|
||||
export App, echo, echoJS, createRes, registerService, echoAll, unregisterEchoService
|
||||
import "../../aqua/resources-api.aqua"
|
||||
export App, echo, echoJS, createRes, registerEchoService, echoAll, unregisterEchoService
|
||||
|
||||
func echo(msg: string) -> string:
|
||||
services <- App.services() -- Get ids of the deployed services
|
||||
@ -23,7 +23,7 @@ func createRes() -> ?string:
|
||||
resourceId, error <- createResource("echo")
|
||||
<- resourceId
|
||||
|
||||
func registerService(resourceId: string) -> *bool:
|
||||
func registerEchoService(resourceId: string) -> *bool:
|
||||
results: *bool
|
||||
services <- App.services()
|
||||
for srv <- services.echoService.default:
|
||||
@ -34,7 +34,7 @@ func echoAll(resourceId: string, msg: string) -> *string:
|
||||
-- 2 is the min number of peers we want to ask
|
||||
records <- resolveResource(resourceId, 2)
|
||||
results: *string
|
||||
for r <- records:
|
||||
for r <- records!:
|
||||
on r.metadata.peer_id via r.metadata.relay_id:
|
||||
EchoService r.metadata.service_id!
|
||||
results <- EchoService.echo(msg)
|
||||
|
@ -14,8 +14,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { Fluence, KeyPair, setLogLevel } from "@fluencelabs/fluence";
|
||||
import { krasnodar } from "@fluencelabs/fluence-network-environment";
|
||||
import { registerEchoService, registerServiceRecord } from "./generated/export";
|
||||
import { testNet } from "@fluencelabs/fluence-network-environment";
|
||||
import { registerEchoService, registerServiceRecordRecord } from "./generated/export";
|
||||
import assert from "node:assert";
|
||||
|
||||
// don't store your secret key in the code. This is just for the example
|
||||
@ -23,7 +23,7 @@ const secretKey = "Iz3HUmNIB78lkNNVmMkDKrju0nCivtkJNyObrFAr774=";
|
||||
|
||||
async function main() {
|
||||
const keypair = await KeyPair.fromEd25519SK(Buffer.from(secretKey, "base64"));
|
||||
const connectTo = krasnodar[0];
|
||||
const connectTo = testNet[0];
|
||||
assert(connectTo !== undefined);
|
||||
|
||||
// connect to the Fluence network
|
||||
@ -52,11 +52,11 @@ async function main() {
|
||||
console.log(
|
||||
`
|
||||
Copy this code to call this service:
|
||||
|
||||
|
||||
fluence run -f 'echoJS("${peerId}", "${relayId}", "${serviceId}", "hi")'`
|
||||
);
|
||||
} else {
|
||||
const [success, error] = await registerServiceRecord(
|
||||
const [success, error] = await registerServiceRecordRecord(
|
||||
resourceId,
|
||||
"echo",
|
||||
peerId,
|
||||
|
5
rust-toolchain.toml
Normal file
5
rust-toolchain.toml
Normal file
@ -0,0 +1,5 @@
|
||||
[toolchain]
|
||||
channel = "nightly"
|
||||
components = [ "rustfmt", "clippy" ]
|
||||
targets = [ "x86_64-unknown-linux-gnu", "x86_64-apple-darwin", "wasm32-wasi" ]
|
||||
profile = "minimal"
|
Loading…
x
Reference in New Issue
Block a user