feat(aqua): add tests (#127)

This commit is contained in:
Aleksey Proshutisnkiy 2022-10-10 17:25:10 +04:00 committed by GitHub
parent f179336869
commit 9ca1f0498c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 15089 additions and 112 deletions

146
.github/e2e/docker-compose.yml vendored Normal file
View 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

View File

@ -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
View 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
View 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
View File

@ -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
View File

@ -0,0 +1,7 @@
# Registry API tests
## How to run
- `npm i`
- `pip3 install -r requirements.txt`
- `pytest -n auto`

View 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
View 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

File diff suppressed because it is too large Load Diff

34
aqua-tests/package.json Normal file
View 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"
}
}

View 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
View 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

View File

@ -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

View File

@ -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:
```

View File

@ -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:

View File

@ -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",

View File

@ -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": {}

View File

@ -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

View File

@ -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)

View File

@ -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
View 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"