trying to add services

This commit is contained in:
Pavel Murygin 2021-06-18 01:02:45 +03:00
parent c790075a0e
commit dafa8a61e5
7 changed files with 418 additions and 113 deletions

View File

@ -4,11 +4,12 @@ service DashboardEvent("event"):
collectPeerInfo(peer: PeerId, ident: Info, services: []Service, blueprints: []Blueprint, modules: []Module) collectPeerInfo(peer: PeerId, ident: Info, services: []Service, blueprints: []Blueprint, modules: []Module)
collectServiceInterface(peer: PeerId, serviceId: string, interface: Interface) collectServiceInterface(peer: PeerId, serviceId: string, interface: Interface)
-- func collectServiceInterfaces(peer: Peer, services: []Service): func collectServiceInterfaces(peer: PeerId, services: []Service):
-- on peer: on peer:
-- for srv <- services par: for srv <- services par:
-- info <- Srv.get_interface(srv.id) info <- Srv.get_interface(srv.id)
-- DashboardEvent.collectServiceInterface(peer, service.id, info.Interface) on %init_peer_id%:
DashboardEvent.collectServiceInterface(peer, srv.id, info.interface)
func askAllAndSend(peer: PeerId): func askAllAndSend(peer: PeerId):
on peer: on peer:
@ -17,7 +18,7 @@ func askAllAndSend(peer: PeerId):
modules <- Dist.list_modules() modules <- Dist.list_modules()
services <- Srv.list() services <- Srv.list()
DashboardEvent.collectPeerInfo(peer, ident, services, blueprints, modules) DashboardEvent.collectPeerInfo(peer, ident, services, blueprints, modules)
-- collectServiceInterfaces(peer, services) collectServiceInterfaces(peer, services)
func findAndAskNeighboursSchema(relayPeerId: PeerId, clientId: PeerId): func findAndAskNeighboursSchema(relayPeerId: PeerId, clientId: PeerId):

View File

@ -19,7 +19,7 @@ limitations under the License.
import Browser exposing (Document) import Browser exposing (Document)
import Browser.Navigation as Navigation import Browser.Navigation as Navigation
import Config exposing (Flags) import Config exposing (Flags)
import Dict import Dict exposing (Dict)
import Model exposing (Model) import Model exposing (Model)
import Msg exposing (Msg(..)) import Msg exposing (Msg(..))
import Route import Route
@ -56,6 +56,7 @@ init flags url key =
, modules = Dict.empty , modules = Dict.empty
, modulesByHash = Dict.empty , modulesByHash = Dict.empty
, blueprints = Dict.empty , blueprints = Dict.empty
, services = Dict.empty
, toggledInterface = Nothing , toggledInterface = Nothing
, knownPeers = flags.knownPeers , knownPeers = flags.knownPeers
, isInitialized = False , isInitialized = False

View File

@ -55,6 +55,7 @@ type alias Model =
, modules : Dict String Module , modules : Dict String Module
, modulesByHash : Dict String Module , modulesByHash : Dict String Module
, blueprints : Dict String Blueprint , blueprints : Dict String Blueprint
, services : Dict String Service
, toggledInterface : Maybe String , toggledInterface : Maybe String
, knownPeers : List String , knownPeers : List String
, isInitialized : Bool , isInitialized : Bool

View File

@ -5,13 +5,20 @@ import Dict exposing (Dict)
import Json.Encode exposing (Value) import Json.Encode exposing (Value)
import Modules.Model exposing (Module) import Modules.Model exposing (Module)
import Nodes.Model exposing (Identify) import Nodes.Model exposing (Identify)
import Service.Model exposing (Service) import Service.Model exposing (Interface, Service)
type alias ServiceInfo =
{ id : String
, blueprint_id : String
, owner_id : String
}
type alias CollectPeerInfo = type alias CollectPeerInfo =
{ peerId : String { peerId : String
, identify : Maybe Identify , identify : Maybe Identify
, services : Maybe (List Service) , services : Maybe (List ServiceInfo)
, modules : Maybe (List Module) , modules : Maybe (List Module)
, blueprints : Maybe (List Blueprint) , blueprints : Maybe (List Blueprint)
} }
@ -20,30 +27,10 @@ type alias CollectPeerInfo =
port collectPeerInfo : (CollectPeerInfo -> msg) -> Sub msg port collectPeerInfo : (CollectPeerInfo -> msg) -> Sub msg
type alias FunctionSignature =
{ arguments : List String
, name : String
, output_types : List String
}
type alias RecordType =
{ fields : List String
, id : Int
, name : String
}
type alias ServiceInterface =
{ function_signatures : List FunctionSignature
, record_types : List RecordType
}
type alias CollectServiceInterface = type alias CollectServiceInterface =
{ blueprint_id : String { peer_id : String
, service_id : String , service_id : String
, interface : ServiceInterface , interface : Interface
} }

View File

@ -25,4 +25,10 @@ type alias Service =
{ id : String { id : String
, blueprint_id : String , blueprint_id : String
, owner_id : String , owner_id : String
, interface : Maybe Interface
} }
setInterface : Interface -> Service -> Service
setInterface interface service =
{ service | interface = Just interface }

View File

@ -27,7 +27,7 @@ import Msg exposing (..)
import Nodes.Model exposing (Identify) import Nodes.Model exposing (Identify)
import Port exposing (getAll) import Port exposing (getAll)
import Route exposing (getAllCmd) import Route exposing (getAllCmd)
import Service.Model exposing (Service) import Service.Model exposing (Service, setInterface)
import Url import Url
@ -55,13 +55,34 @@ update msg model =
Browser.External href -> Browser.External href ->
( model, Nav.load href ) ( model, Nav.load href )
CollectServiceInterface { blueprint_id, service_id, interface } -> CollectServiceInterface { peer_id, service_id, interface } ->
( model, Cmd.none ) let
service =
Dict.get service_id model.services
updatedServices =
Dict.update service_id (Maybe.map (setInterface interface)) model.services
newModel =
{ model | services = updatedServices }
in
( newModel, Cmd.none )
CollectPeerInfo { peerId, identify, services, modules, blueprints } -> CollectPeerInfo { peerId, identify, services, modules, blueprints } ->
let let
fromServiceInfo =
\si ->
{ id = si.id
, blueprint_id = si.blueprint_id
, owner_id = si.owner_id
, interface = Nothing
}
servicesCorrectType =
services |> Maybe.map (List.map fromServiceInfo)
updated = updated =
Maybe.map4 (updateModel model peerId) identify services modules blueprints Maybe.map4 (updateModel model peerId) identify servicesCorrectType modules blueprints
updatedModel = updatedModel =
withDefault model updated withDefault model updated
@ -98,6 +119,9 @@ updateModel model peer identify services modules blueprints =
data = data =
Maybe.withDefault emptyPeerData (Dict.get peer model.discoveredPeers) Maybe.withDefault emptyPeerData (Dict.get peer model.discoveredPeers)
servicesDict =
services |> List.map (\m -> ( m.id, m )) |> Dict.fromList
moduleDict = moduleDict =
modules |> List.map (\m -> ( m.name, m )) |> Dict.fromList modules |> List.map (\m -> ( m.name, m )) |> Dict.fromList
@ -117,9 +141,15 @@ updateModel model peer identify services modules blueprints =
Dict.union blueprintDict model.blueprints Dict.union blueprintDict model.blueprints
newData = newData =
{ data | identify = identify, services = services, modules = Dict.keys moduleDict, blueprints = Dict.keys blueprintDict } { data | identify = identify, modules = Dict.keys moduleDict, blueprints = Dict.keys blueprintDict }
updated = updated =
Dict.insert peer newData model.discoveredPeers Dict.insert peer newData model.discoveredPeers
in in
{ model | discoveredPeers = updated, modules = updatedModules, modulesByHash = updatedModulesByHash, blueprints = updatedBlueprints } { model
| discoveredPeers = updated
, services = servicesDict
, modules = updatedModules
, modulesByHash = updatedModulesByHash
, blueprints = updatedBlueprints
}

View File

@ -10,6 +10,92 @@ import { RequestFlowBuilder } from '@fluencelabs/fluence/dist/api.unstable';
export async function collectServiceInterfaces(client, peer, services) {
let request;
const promise = new Promise((resolve, reject) => {
request = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "services") [] services)
)
(call -relay- ("op" "identity") [])
)
(xor
(fold services srv
(par
(seq
(call peer ("srv" "get_interface") [srv.$.id!] info)
(xor
(call %init_peer_id% ("event" "collectServiceInterface") [peer srv.$.id! info.$.interface!])
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
)
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(next srv)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
)
)
)
(seq
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
(call -relay- ("op" "identity") [])
)
)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
)
`,
)
.configHandler((h) => {
h.on('getDataSrv', '-relay-', () => {
return client.relayPeerId;
});
h.on('getDataSrv', 'peer', () => {return peer;});
h.on('getDataSrv', 'services', () => {return services;});
h.onEvent('errorHandlingSrv', 'error', (args) => {
// assuming error is the single argument
const [err] = args;
reject(err);
});
})
.handleScriptError(reject)
.handleTimeout(() => {
reject('Request timed out for collectServiceInterfaces');
})
.build();
});
await client.initiateFlow(request);
return Promise.race([promise, Promise.resolve()]);
}
export async function askAllAndSend(client, peer) { export async function askAllAndSend(client, peer) {
let request; let request;
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
@ -23,33 +109,74 @@ export async function askAllAndSend(client, peer) {
(seq (seq
(seq (seq
(seq (seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) (seq
(call %init_peer_id% ("getDataSrv" "peer") [] peer) (seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call -relay- ("op" "identity") [])
)
(xor
(seq
(seq
(seq
(call peer ("peer" "identify") [] ident)
(call peer ("dist" "list_blueprints") [] blueprints)
)
(call peer ("dist" "list_modules") [] modules)
)
(call peer ("srv" "list") [] services)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
) )
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
) )
(xor (call %init_peer_id% ("event" "collectPeerInfo") [peer ident services blueprints modules])
(seq
(seq
(seq
(call peer ("peer" "identify") [] ident)
(call peer ("dist" "list_blueprints") [] blueprints)
)
(call peer ("dist" "list_modules") [] modules)
)
(call peer ("srv" "list") [] services)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
) )
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
) )
(call %init_peer_id% ("event" "collectPeerInfo") [peer ident services blueprints modules]) (xor
(fold services srv
(par
(seq
(call peer ("srv" "get_interface") [srv.$.id!] info)
(xor
(call %init_peer_id% ("event" "collectServiceInterface") [peer srv.$.id! info.$.interface!])
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
)
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(next srv)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
)
)
)
(seq
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
(call -relay- ("op" "identity") [])
)
)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
) )
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
) )
`, `,
@ -109,25 +236,60 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId)
(seq (seq
(seq (seq
(seq (seq
(xor (seq
(seq (seq
(seq (xor
(seq (seq
(call n2 ("peer" "identify") [] ident) (seq
(call n2 ("dist" "list_blueprints") [] blueprints) (seq
(call n2 ("peer" "identify") [] ident)
(call n2 ("dist" "list_blueprints") [] blueprints)
)
(call n2 ("dist" "list_modules") [] modules)
)
(call n2 ("srv" "list") [] services)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
(call -relay- ("op" "identity") [])
)
(call n ("event" "collectPeerInfo") [n2 ident services blueprints modules])
)
(xor
(fold services srv
(par
(seq
(call n2 ("srv" "get_interface") [srv.$.id!] info)
(xor
(call %init_peer_id% ("event" "collectServiceInterface") [n2 srv.$.id! info.$.interface!])
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
)
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(next srv)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
) )
(call n2 ("dist" "list_modules") [] modules)
) )
(call n2 ("srv" "list") [] services)
) )
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
) )
) )
(call -relay- ("op" "identity") [])
) )
(call n ("event" "collectPeerInfo") [n2 ident services blueprints modules]) (call -relay- ("op" "identity") [])
) )
(next n2) (next n2)
) )
@ -135,7 +297,7 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId)
) )
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
) )
) )
(seq (seq
@ -154,7 +316,7 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId)
(seq (seq
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5])
) )
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
) )
@ -162,7 +324,7 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId)
) )
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6])
) )
) )
@ -214,31 +376,6 @@ export async function getAll(client, relayPeerId, knownPeers) {
(par (par
(seq (seq
(seq (seq
(seq
(call -relay- ("op" "identity") [])
(xor
(seq
(seq
(seq
(call relayPeerId ("peer" "identify") [] ident)
(call relayPeerId ("dist" "list_blueprints") [] blueprints)
)
(call relayPeerId ("dist" "list_modules") [] modules)
)
(call relayPeerId ("srv" "list") [] services)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("event" "collectPeerInfo") [relayPeerId ident services blueprints modules])
)
(fold knownPeers peer
(par
(seq (seq
(seq (seq
(seq (seq
@ -247,26 +384,133 @@ export async function getAll(client, relayPeerId, knownPeers) {
(seq (seq
(seq (seq
(seq (seq
(call peer ("peer" "identify") [] ident0) (call relayPeerId ("peer" "identify") [] ident)
(call peer ("dist" "list_blueprints") [] blueprints0) (call relayPeerId ("dist" "list_blueprints") [] blueprints)
) )
(call peer ("dist" "list_modules") [] modules0) (call relayPeerId ("dist" "list_modules") [] modules)
) )
(call peer ("srv" "list") [] services0) (call relayPeerId ("srv" "list") [] services)
) )
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("event" "collectPeerInfo") [relayPeerId ident services blueprints modules])
)
(call -relay- ("op" "identity") [])
)
(xor
(fold services srv
(par
(seq
(call relayPeerId ("srv" "get_interface") [srv.$.id!] info)
(xor
(call %init_peer_id% ("event" "collectServiceInterface") [relayPeerId srv.$.id! info.$.interface!])
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
) )
) )
) )
(call -relay- ("op" "identity") []) (seq
(seq
(seq
(call -relay- ("op" "identity") [])
(next srv)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
)
) )
(call %init_peer_id% ("event" "collectPeerInfo") [peer ident0 services0 blueprints0 modules0])
) )
(next peer) (seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
) )
) )
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(fold knownPeers peer
(par
(seq
(seq
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(xor
(seq
(seq
(seq
(call peer ("peer" "identify") [] ident0)
(call peer ("dist" "list_blueprints") [] blueprints0)
)
(call peer ("dist" "list_modules") [] modules0)
)
(call peer ("srv" "list") [] services0)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
)
)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("event" "collectPeerInfo") [peer ident0 services0 blueprints0 modules0])
)
(call -relay- ("op" "identity") [])
)
(xor
(fold services0 srv0
(par
(seq
(call peer ("srv" "get_interface") [srv0.$.id!] info0)
(xor
(call %init_peer_id% ("event" "collectServiceInterface") [peer srv0.$.id! info0.$.interface!])
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5])
)
)
)
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(next srv0)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
)
)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6])
)
)
)
(seq
(call -relay- ("op" "identity") [])
(next peer)
)
)
)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
)
) )
) )
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
@ -283,25 +527,60 @@ export async function getAll(client, relayPeerId, knownPeers) {
(seq (seq
(seq (seq
(seq (seq
(xor (seq
(seq (seq
(seq (xor
(seq (seq
(call n2 ("peer" "identify") [] ident1) (seq
(call n2 ("dist" "list_blueprints") [] blueprints1) (seq
(call n2 ("peer" "identify") [] ident1)
(call n2 ("dist" "list_blueprints") [] blueprints1)
)
(call n2 ("dist" "list_modules") [] modules1)
)
(call n2 ("srv" "list") [] services1)
)
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 7])
)
)
(call -relay- ("op" "identity") [])
)
(call n ("event" "collectPeerInfo") [n2 ident1 services1 blueprints1 modules1])
)
(xor
(fold services1 srv1
(par
(seq
(call n2 ("srv" "get_interface") [srv1.$.id!] info1)
(xor
(call %init_peer_id% ("event" "collectServiceInterface") [n2 srv1.$.id! info1.$.interface!])
(seq
(call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 8])
)
)
)
(seq
(seq
(seq
(call -relay- ("op" "identity") [])
(next srv1)
)
(call -relay- ("op" "identity") [])
)
(call %init_peer_id% ("op" "identity") [])
) )
(call n2 ("dist" "list_modules") [] modules1)
) )
(call n2 ("srv" "list") [] services1)
) )
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 9])
) )
) )
(call -relay- ("op" "identity") [])
) )
(call n ("event" "collectPeerInfo") [n2 ident1 services1 blueprints1 modules1]) (call -relay- ("op" "identity") [])
) )
(next n2) (next n2)
) )
@ -309,7 +588,7 @@ export async function getAll(client, relayPeerId, knownPeers) {
) )
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 10])
) )
) )
(seq (seq
@ -328,7 +607,7 @@ export async function getAll(client, relayPeerId, knownPeers) {
(seq (seq
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 11])
) )
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
) )
@ -336,7 +615,7 @@ export async function getAll(client, relayPeerId, knownPeers) {
) )
(seq (seq
(call -relay- ("op" "identity") []) (call -relay- ("op" "identity") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 12])
) )
) )