From fe0e6cd146833aabd5412b80842387a53eceb595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Mon, 20 Aug 2018 17:44:32 +0300 Subject: [PATCH 01/24] reorganize folder structure of mesg, api, cli packages. resolves #377 --- mesg/mesg.go => api/api.go | 26 +++++++------- mesg/mesg_test.go => api/api_test.go | 8 ++--- {mesg => api}/deploy.go | 10 +++--- {mesg => api}/deploy_deployer.go | 10 +++--- {mesg => api}/deploy_deployer_test.go | 36 +++++++++---------- {mesg => api}/deploy_test.go | 14 ++++---- {mesg => api}/service-test-invalid/empty | 0 {mesg => api}/service-test/Dockerfile | 0 {mesg => api}/service-test/mesg.yml | 0 cmd/service/delete.go | 2 +- cmd/service/deploy.go | 2 +- cmd/service/detail.go | 2 +- cmd/service/dev.go | 2 +- cmd/service/execute.go | 2 +- cmd/service/list.go | 2 +- cmd/service/logs.go | 2 +- cmd/service/start.go | 2 +- cmd/service/stop.go | 2 +- cmd/service/utils.go | 2 +- cmd/stop.go | 2 +- core/main.go | 8 ++--- dev-cli | 2 +- {cli => interface/cli}/main.go | 0 {api => interface/grpc}/client/client.go | 0 {api => interface/grpc}/client/client_test.go | 0 {api => interface/grpc}/client/service.go | 0 .../grpc}/client/service_test.go | 0 {api => interface/grpc}/client/task.go | 0 {api => interface/grpc}/client/task_test.go | 0 {api => interface/grpc}/client/types.go | 0 {api => interface/grpc}/client/wokflow.go | 0 .../grpc}/client/workflow_test.go | 0 {api => interface/grpc}/core/api.pb.go | 0 {api => interface/grpc}/core/api.proto | 0 {api => interface/grpc}/core/core_test.go | 10 +++--- {api => interface/grpc}/core/delete.go | 0 {api => interface/grpc}/core/delete_test.go | 0 {api => interface/grpc}/core/deploy.go | 6 ++-- .../grpc}/core/deploy_integration_test.go | 0 {api => interface/grpc}/core/deploy_test.go | 0 {api => interface/grpc}/core/error.go | 0 {api => interface/grpc}/core/error_test.go | 0 {api => interface/grpc}/core/execute.go | 0 {api => interface/grpc}/core/execute_test.go | 0 {api => interface/grpc}/core/get_service.go | 0 .../grpc}/core/get_service_test.go | 0 {api => interface/grpc}/core/list_services.go | 0 .../grpc}/core/list_services_test.go | 0 {api => interface/grpc}/core/listen_event.go | 0 .../grpc}/core/listen_event_test.go | 0 {api => interface/grpc}/core/listen_result.go | 0 .../grpc}/core/listen_result_test.go | 0 {api => interface/grpc}/core/start.go | 0 {api => interface/grpc}/core/start_test.go | 0 {api => interface/grpc}/core/stop.go | 0 {api => interface/grpc}/core/stop_test.go | 0 {api => interface/grpc}/core/type.go | 12 +++---- {api => interface/grpc}/server.go | 12 +++---- {api => interface/grpc}/server_test.go | 2 +- {api => interface/grpc}/service/api.pb.go | 0 {api => interface/grpc}/service/api.proto | 0 {api => interface/grpc}/service/emit_event.go | 0 .../grpc}/service/emit_event_test.go | 0 {api => interface/grpc}/service/error.go | 0 {api => interface/grpc}/service/error_test.go | 0 .../grpc}/service/listen_task.go | 0 .../grpc}/service/submit_result.go | 0 .../grpc}/service/submit_result_test.go | 0 {api => interface/grpc}/service/type.go | 0 69 files changed, 89 insertions(+), 89 deletions(-) rename mesg/mesg.go => api/api.go (51%) rename mesg/mesg_test.go => api/api_test.go (68%) rename {mesg => api}/deploy.go (72%) rename {mesg => api}/deploy_deployer.go (96%) rename {mesg => api}/deploy_deployer_test.go (83%) rename {mesg => api}/deploy_test.go (90%) rename {mesg => api}/service-test-invalid/empty (100%) rename {mesg => api}/service-test/Dockerfile (100%) rename {mesg => api}/service-test/mesg.yml (100%) rename {cli => interface/cli}/main.go (100%) rename {api => interface/grpc}/client/client.go (100%) rename {api => interface/grpc}/client/client_test.go (100%) rename {api => interface/grpc}/client/service.go (100%) rename {api => interface/grpc}/client/service_test.go (100%) rename {api => interface/grpc}/client/task.go (100%) rename {api => interface/grpc}/client/task_test.go (100%) rename {api => interface/grpc}/client/types.go (100%) rename {api => interface/grpc}/client/wokflow.go (100%) rename {api => interface/grpc}/client/workflow_test.go (100%) rename {api => interface/grpc}/core/api.pb.go (100%) rename {api => interface/grpc}/core/api.proto (100%) rename {api => interface/grpc}/core/core_test.go (72%) rename {api => interface/grpc}/core/delete.go (100%) rename {api => interface/grpc}/core/delete_test.go (100%) rename {api => interface/grpc}/core/deploy.go (90%) rename {api => interface/grpc}/core/deploy_integration_test.go (100%) rename {api => interface/grpc}/core/deploy_test.go (100%) rename {api => interface/grpc}/core/error.go (100%) rename {api => interface/grpc}/core/error_test.go (100%) rename {api => interface/grpc}/core/execute.go (100%) rename {api => interface/grpc}/core/execute_test.go (100%) rename {api => interface/grpc}/core/get_service.go (100%) rename {api => interface/grpc}/core/get_service_test.go (100%) rename {api => interface/grpc}/core/list_services.go (100%) rename {api => interface/grpc}/core/list_services_test.go (100%) rename {api => interface/grpc}/core/listen_event.go (100%) rename {api => interface/grpc}/core/listen_event_test.go (100%) rename {api => interface/grpc}/core/listen_result.go (100%) rename {api => interface/grpc}/core/listen_result_test.go (100%) rename {api => interface/grpc}/core/start.go (100%) rename {api => interface/grpc}/core/start_test.go (100%) rename {api => interface/grpc}/core/stop.go (100%) rename {api => interface/grpc}/core/stop_test.go (100%) rename {api => interface/grpc}/core/type.go (70%) rename {api => interface/grpc}/server.go (87%) rename {api => interface/grpc}/server_test.go (98%) rename {api => interface/grpc}/service/api.pb.go (100%) rename {api => interface/grpc}/service/api.proto (100%) rename {api => interface/grpc}/service/emit_event.go (100%) rename {api => interface/grpc}/service/emit_event_test.go (100%) rename {api => interface/grpc}/service/error.go (100%) rename {api => interface/grpc}/service/error_test.go (100%) rename {api => interface/grpc}/service/listen_task.go (100%) rename {api => interface/grpc}/service/submit_result.go (100%) rename {api => interface/grpc}/service/submit_result_test.go (100%) rename {api => interface/grpc}/service/type.go (100%) diff --git a/mesg/mesg.go b/api/api.go similarity index 51% rename from mesg/mesg.go rename to api/api.go index 99116aa4c..b5d0e2d72 100644 --- a/mesg/mesg.go +++ b/api/api.go @@ -1,34 +1,34 @@ -package mesg +package api import "github.com/mesg-foundation/core/container" -// MESG gives all functionalies of MESG core. -type MESG struct { +// API exposes all functionalies of MESG core. +type API struct { container *container.Container } // Option is a configuration func for MESG. -type Option func(*MESG) +type Option func(*API) -// New creates a new MESG with given options. -func New(options ...Option) (*MESG, error) { - m := &MESG{} +// New creates a new API with given options. +func New(options ...Option) (*API, error) { + a := &API{} for _, option := range options { - option(m) + option(a) } var err error - if m.container == nil { - m.container, err = container.New() + if a.container == nil { + a.container, err = container.New() if err != nil { return nil, err } } - return m, nil + return a, nil } // ContainerOption configures underlying container access API. func ContainerOption(container *container.Container) Option { - return func(m *MESG) { - m.container = container + return func(a *API) { + a.container = container } } diff --git a/mesg/mesg_test.go b/api/api_test.go similarity index 68% rename from mesg/mesg_test.go rename to api/api_test.go index 775dbd781..290943d45 100644 --- a/mesg/mesg_test.go +++ b/api/api_test.go @@ -1,4 +1,4 @@ -package mesg +package api import ( "testing" @@ -8,14 +8,14 @@ import ( "github.com/stretchr/testify/require" ) -func newMESGAndDockerTest(t *testing.T) (*MESG, *dockertest.Testing) { +func newAPIAndDockerTest(t *testing.T) (*API, *dockertest.Testing) { dt := dockertest.New() container, err := container.New(container.ClientOption(dt.Client())) require.Nil(t, err) - m, err := New(ContainerOption(container)) + a, err := New(ContainerOption(container)) require.Nil(t, err) - return m, dt + return a, dt } diff --git a/mesg/deploy.go b/api/deploy.go similarity index 72% rename from mesg/deploy.go rename to api/deploy.go index 14bc53752..c0e3f4dbe 100644 --- a/mesg/deploy.go +++ b/api/deploy.go @@ -1,4 +1,4 @@ -package mesg +package api import ( "io" @@ -18,8 +18,8 @@ func DeployServiceStatusOption(statuses chan DeployStatus) DeployServiceOption { } // DeployService deploys a service from a gzipped tarball. -func (m *MESG) DeployService(r io.Reader, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { - deployer := newServiceDeployer(m) +func (a *API) DeployService(r io.Reader, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { + deployer := newServiceDeployer(a) for _, option := range options { option(deployer) } @@ -30,8 +30,8 @@ func (m *MESG) DeployService(r io.Reader, options ...DeployServiceOption) (*serv // Supported URL types: // - https://github.com/mesg-foundation/service-ethereum // - https://github.com/mesg-foundation/service-ethereum#branchName -func (m *MESG) DeployServiceFromURL(url string, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { - deployer := newServiceDeployer(m) +func (a *API) DeployServiceFromURL(url string, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { + deployer := newServiceDeployer(a) for _, option := range options { option(deployer) } diff --git a/mesg/deploy_deployer.go b/api/deploy_deployer.go similarity index 96% rename from mesg/deploy_deployer.go rename to api/deploy_deployer.go index 3b9357b8e..cbb91c66d 100644 --- a/mesg/deploy_deployer.go +++ b/api/deploy_deployer.go @@ -1,4 +1,4 @@ -package mesg +package api import ( "fmt" @@ -20,7 +20,7 @@ import ( type serviceDeployer struct { Statuses chan DeployStatus - mesg *MESG + api *API } // StatusType indicates the type of status message. @@ -40,9 +40,9 @@ type DeployStatus struct { Type StatusType } -func newServiceDeployer(mesg *MESG) *serviceDeployer { +func newServiceDeployer(api *API) *serviceDeployer { return &serviceDeployer{ - mesg: mesg, + api: api, } } @@ -109,7 +109,7 @@ func (d *serviceDeployer) deploy(path string) (*service.Service, *importer.Valid } d.sendStatus("Building Docker image...", RUNNING) - imageHash, err := d.mesg.container.Build(path) + imageHash, err := d.api.container.Build(path) if err != nil { return nil, nil, err } diff --git a/mesg/deploy_deployer_test.go b/api/deploy_deployer_test.go similarity index 83% rename from mesg/deploy_deployer_test.go rename to api/deploy_deployer_test.go index 32fd78464..759358d3b 100644 --- a/mesg/deploy_deployer_test.go +++ b/api/deploy_deployer_test.go @@ -1,4 +1,4 @@ -package mesg +package api import ( "os" @@ -10,8 +10,8 @@ import ( ) func TestGitCloneRepositoryDoNotExist(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) path, _ := deployer.createTempDir() defer os.RemoveAll(path) @@ -20,7 +20,7 @@ func TestGitCloneRepositoryDoNotExist(t *testing.T) { } func TestGitCloneWithoutURLSchema(t *testing.T) { - m, _ := newMESGAndDockerTest(t) + m, _ := newAPIAndDockerTest(t) deployer := newServiceDeployer(m) path, _ := deployer.createTempDir() @@ -30,8 +30,8 @@ func TestGitCloneWithoutURLSchema(t *testing.T) { } func TestGitCloneCustomBranch(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) branchName := "5-generic-service" path, _ := deployer.createTempDir() @@ -46,8 +46,8 @@ func TestGitCloneCustomBranch(t *testing.T) { } func TestCreateTempFolder(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) path, err := deployer.createTempDir() defer os.RemoveAll(path) @@ -56,8 +56,8 @@ func TestCreateTempFolder(t *testing.T) { } func TestRemoveTempFolder(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) path, _ := deployer.createTempDir() err := os.RemoveAll(path) @@ -65,8 +65,8 @@ func TestRemoveTempFolder(t *testing.T) { } func TestInjectConfigurationInDependencies(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) s := &service.Service{} deployer.injectConfigurationInDependencies(s, "TestInjectConfigurationInDependencies") @@ -74,8 +74,8 @@ func TestInjectConfigurationInDependencies(t *testing.T) { } func TestInjectConfigurationInDependenciesWithConfig(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) s := &service.Service{ Configuration: &service.Dependency{ @@ -89,8 +89,8 @@ func TestInjectConfigurationInDependenciesWithConfig(t *testing.T) { } func TestInjectConfigurationInDependenciesWithDependency(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) s := &service.Service{ Dependencies: map[string]*service.Dependency{ @@ -105,8 +105,8 @@ func TestInjectConfigurationInDependenciesWithDependency(t *testing.T) { } func TestInjectConfigurationInDependenciesWithDependencyOverride(t *testing.T) { - m, _ := newMESGAndDockerTest(t) - deployer := newServiceDeployer(m) + a, _ := newAPIAndDockerTest(t) + deployer := newServiceDeployer(a) s := &service.Service{ Dependencies: map[string]*service.Dependency{ diff --git a/mesg/deploy_test.go b/api/deploy_test.go similarity index 90% rename from mesg/deploy_test.go rename to api/deploy_test.go index 05512ec9b..b1346cc73 100644 --- a/mesg/deploy_test.go +++ b/api/deploy_test.go @@ -1,4 +1,4 @@ -package mesg +package api import ( "fmt" @@ -17,7 +17,7 @@ import ( func TestDeployService(t *testing.T) { path := "./service-test" - mesg, dt := newMESGAndDockerTest(t) + a, dt := newAPIAndDockerTest(t) dt.ProvideImageBuild(ioutil.NopCloser(strings.NewReader(`{"stream":"sha256:x"}`)), nil) statuses := make(chan DeployStatus) @@ -32,7 +32,7 @@ func TestDeployService(t *testing.T) { }) require.Nil(t, err) - service, validationError, err := mesg.DeployService(archive, DeployServiceStatusOption(statuses)) + service, validationError, err := a.DeployService(archive, DeployServiceStatusOption(statuses)) require.Nil(t, validationError) require.Nil(t, err) require.Equal(t, 1, structhash.Version(service.Id)) @@ -64,7 +64,7 @@ func TestDeployService(t *testing.T) { func TestDeployInvalidService(t *testing.T) { path := "./service-test-invalid" - mesg, dt := newMESGAndDockerTest(t) + a, dt := newAPIAndDockerTest(t) dt.ProvideImageBuild(ioutil.NopCloser(strings.NewReader(`{"stream":"sha256:x"}`)), nil) statuses := make(chan DeployStatus) @@ -79,7 +79,7 @@ func TestDeployInvalidService(t *testing.T) { }) require.Nil(t, err) - service, validationError, err := mesg.DeployService(archive, DeployServiceStatusOption(statuses)) + service, validationError, err := a.DeployService(archive, DeployServiceStatusOption(statuses)) require.Nil(t, service) require.Nil(t, err) require.Equal(t, (&importer.ValidationError{}).Error(), validationError.Error()) @@ -100,7 +100,7 @@ func TestDeployInvalidService(t *testing.T) { func TestDeployServiceFromURL(t *testing.T) { url := "https://github.com/mesg-foundation/service-webhook" - mesg, dt := newMESGAndDockerTest(t) + a, dt := newAPIAndDockerTest(t) dt.ProvideImageBuild(ioutil.NopCloser(strings.NewReader(`{"stream":"sha256:x"}`)), nil) statuses := make(chan DeployStatus) @@ -109,7 +109,7 @@ func TestDeployServiceFromURL(t *testing.T) { wg.Add(1) go func() { defer wg.Done() - service, validationError, err := mesg.DeployServiceFromURL(url, DeployServiceStatusOption(statuses)) + service, validationError, err := a.DeployServiceFromURL(url, DeployServiceStatusOption(statuses)) require.Nil(t, validationError) require.Nil(t, err) require.Equal(t, 1, structhash.Version(service.Id)) diff --git a/mesg/service-test-invalid/empty b/api/service-test-invalid/empty similarity index 100% rename from mesg/service-test-invalid/empty rename to api/service-test-invalid/empty diff --git a/mesg/service-test/Dockerfile b/api/service-test/Dockerfile similarity index 100% rename from mesg/service-test/Dockerfile rename to api/service-test/Dockerfile diff --git a/mesg/service-test/mesg.yml b/api/service-test/mesg.yml similarity index 100% rename from mesg/service-test/mesg.yml rename to api/service-test/mesg.yml diff --git a/cmd/service/delete.go b/cmd/service/delete.go index 6523ea294..34629ce54 100644 --- a/cmd/service/delete.go +++ b/cmd/service/delete.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/cobra" survey "gopkg.in/AlecAivazis/survey.v1" ) diff --git a/cmd/service/deploy.go b/cmd/service/deploy.go index 79b2bdb98..3c21ef446 100644 --- a/cmd/service/deploy.go +++ b/cmd/service/deploy.go @@ -10,8 +10,8 @@ import ( "github.com/briandowns/spinner" "github.com/docker/docker/pkg/archive" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/cobra" ) diff --git a/cmd/service/detail.go b/cmd/service/detail.go index b7cfea491..327c2eb61 100644 --- a/cmd/service/detail.go +++ b/cmd/service/detail.go @@ -6,8 +6,8 @@ import ( "strings" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/cobra" ) diff --git a/cmd/service/dev.go b/cmd/service/dev.go index 9c6210132..a04623229 100644 --- a/cmd/service/dev.go +++ b/cmd/service/dev.go @@ -6,8 +6,8 @@ import ( "os" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) diff --git a/cmd/service/execute.go b/cmd/service/execute.go index bb80dbd8f..d7f283985 100644 --- a/cmd/service/execute.go +++ b/cmd/service/execute.go @@ -10,8 +10,8 @@ import ( "time" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/mesg-foundation/core/service" "github.com/mesg-foundation/core/utils/xpflag" uuid "github.com/satori/go.uuid" diff --git a/cmd/service/list.go b/cmd/service/list.go index 740250060..97dc486ed 100644 --- a/cmd/service/list.go +++ b/cmd/service/list.go @@ -7,8 +7,8 @@ import ( "strings" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/mesg-foundation/core/service" "github.com/spf13/cobra" ) diff --git a/cmd/service/logs.go b/cmd/service/logs.go index 6e51330a9..c8a09339c 100644 --- a/cmd/service/logs.go +++ b/cmd/service/logs.go @@ -5,8 +5,8 @@ import ( "os" "github.com/docker/docker/pkg/stdcopy" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/cobra" ) diff --git a/cmd/service/start.go b/cmd/service/start.go index 24139e86a..36a70c922 100644 --- a/cmd/service/start.go +++ b/cmd/service/start.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/cobra" ) diff --git a/cmd/service/stop.go b/cmd/service/stop.go index 187fbe71d..56e0cf6f2 100644 --- a/cmd/service/stop.go +++ b/cmd/service/stop.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/cobra" ) diff --git a/cmd/service/utils.go b/cmd/service/utils.go index 1e809d6f6..85d31d50c 100644 --- a/cmd/service/utils.go +++ b/cmd/service/utils.go @@ -7,9 +7,9 @@ import ( "os" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" "github.com/mesg-foundation/core/config" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/mesg-foundation/core/service/importer" "github.com/spf13/viper" "google.golang.org/grpc" diff --git a/cmd/stop.go b/cmd/stop.go index 0ee3aa4bb..10be8dae1 100644 --- a/cmd/stop.go +++ b/cmd/stop.go @@ -6,10 +6,10 @@ import ( "sync" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/cmd/utils" "github.com/mesg-foundation/core/config" "github.com/mesg-foundation/core/daemon" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/mesg-foundation/core/service" "github.com/spf13/cobra" "github.com/spf13/viper" diff --git a/core/main.go b/core/main.go index daf40d7b0..7b5faf1bc 100644 --- a/core/main.go +++ b/core/main.go @@ -5,8 +5,8 @@ import ( "os/signal" "syscall" - "github.com/mesg-foundation/core/api" "github.com/mesg-foundation/core/config" + "github.com/mesg-foundation/core/interface/grpc" "github.com/mesg-foundation/core/logger" "github.com/mesg-foundation/core/version" "github.com/sirupsen/logrus" @@ -19,11 +19,11 @@ func main() { logger.Init(format, level) logrus.Println("Starting MESG Core", version.Version) - go startServer(&api.Server{ + go startServer(&grpc.Server{ Network: "tcp", Address: viper.GetString(config.APIServerAddress), }) - go startServer(&api.Server{ + go startServer(&grpc.Server{ Network: "unix", Address: viper.GetString(config.APIServerSocket), }) @@ -32,7 +32,7 @@ func main() { <-abort } -func startServer(server *api.Server) { +func startServer(server *grpc.Server) { err := server.Serve() defer server.Stop() if err != nil { diff --git a/dev-cli b/dev-cli index 26835db76..79228788e 100755 --- a/dev-cli +++ b/dev-cli @@ -3,5 +3,5 @@ version="local" go run \ -ldflags="-X 'github.com/mesg-foundation/core/version.Version=$version'" \ - cli/main.go \ + interface/cli/main.go \ $@ \ No newline at end of file diff --git a/cli/main.go b/interface/cli/main.go similarity index 100% rename from cli/main.go rename to interface/cli/main.go diff --git a/api/client/client.go b/interface/grpc/client/client.go similarity index 100% rename from api/client/client.go rename to interface/grpc/client/client.go diff --git a/api/client/client_test.go b/interface/grpc/client/client_test.go similarity index 100% rename from api/client/client_test.go rename to interface/grpc/client/client_test.go diff --git a/api/client/service.go b/interface/grpc/client/service.go similarity index 100% rename from api/client/service.go rename to interface/grpc/client/service.go diff --git a/api/client/service_test.go b/interface/grpc/client/service_test.go similarity index 100% rename from api/client/service_test.go rename to interface/grpc/client/service_test.go diff --git a/api/client/task.go b/interface/grpc/client/task.go similarity index 100% rename from api/client/task.go rename to interface/grpc/client/task.go diff --git a/api/client/task_test.go b/interface/grpc/client/task_test.go similarity index 100% rename from api/client/task_test.go rename to interface/grpc/client/task_test.go diff --git a/api/client/types.go b/interface/grpc/client/types.go similarity index 100% rename from api/client/types.go rename to interface/grpc/client/types.go diff --git a/api/client/wokflow.go b/interface/grpc/client/wokflow.go similarity index 100% rename from api/client/wokflow.go rename to interface/grpc/client/wokflow.go diff --git a/api/client/workflow_test.go b/interface/grpc/client/workflow_test.go similarity index 100% rename from api/client/workflow_test.go rename to interface/grpc/client/workflow_test.go diff --git a/api/core/api.pb.go b/interface/grpc/core/api.pb.go similarity index 100% rename from api/core/api.pb.go rename to interface/grpc/core/api.pb.go diff --git a/api/core/api.proto b/interface/grpc/core/api.proto similarity index 100% rename from api/core/api.proto rename to interface/grpc/core/api.proto diff --git a/api/core/core_test.go b/interface/grpc/core/core_test.go similarity index 72% rename from api/core/core_test.go rename to interface/grpc/core/core_test.go index 5ea2ce99d..6ec7311a3 100644 --- a/api/core/core_test.go +++ b/interface/grpc/core/core_test.go @@ -3,9 +3,9 @@ package core import ( "testing" + "github.com/mesg-foundation/core/api" "github.com/mesg-foundation/core/container" "github.com/mesg-foundation/core/container/dockertest" - "github.com/mesg-foundation/core/mesg" "github.com/stretchr/testify/require" ) @@ -13,10 +13,10 @@ func newServer(t *testing.T) *Server { container, err := container.New() require.Nil(t, err) - m, err := mesg.New(mesg.ContainerOption(container)) + a, err := api.New(api.ContainerOption(container)) require.Nil(t, err) - server, err := NewServer(MESGOption(m)) + server, err := NewServer(APIOption(a)) require.Nil(t, err) return server @@ -28,10 +28,10 @@ func newServerAndDockerTest(t *testing.T) (*Server, *dockertest.Testing) { container, err := container.New(container.ClientOption(dt.Client())) require.Nil(t, err) - m, err := mesg.New(mesg.ContainerOption(container)) + a, err := api.New(api.ContainerOption(container)) require.Nil(t, err) - server, err := NewServer(MESGOption(m)) + server, err := NewServer(APIOption(a)) require.Nil(t, err) return server, dt diff --git a/api/core/delete.go b/interface/grpc/core/delete.go similarity index 100% rename from api/core/delete.go rename to interface/grpc/core/delete.go diff --git a/api/core/delete_test.go b/interface/grpc/core/delete_test.go similarity index 100% rename from api/core/delete_test.go rename to interface/grpc/core/delete_test.go diff --git a/api/core/deploy.go b/interface/grpc/core/deploy.go similarity index 90% rename from api/core/deploy.go rename to interface/grpc/core/deploy.go index a69d32d25..33544b450 100644 --- a/api/core/deploy.go +++ b/interface/grpc/core/deploy.go @@ -1,7 +1,7 @@ package core import ( - "github.com/mesg-foundation/core/mesg" + "github.com/mesg-foundation/core/api" service "github.com/mesg-foundation/core/service" "github.com/mesg-foundation/core/service/importer" ) @@ -24,9 +24,9 @@ func (s *Server) DeployService(stream Core_DeployServiceServer) error { return err } if url != "" { - service, validationError, err = s.mesg.DeployServiceFromURL(url, mesg.DeployServiceStatusOption(statuses)) + service, validationError, err = s.api.DeployServiceFromURL(url, api.DeployServiceStatusOption(statuses)) } else { - service, validationError, err = s.mesg.DeployService(sr, mesg.DeployServiceStatusOption(statuses)) + service, validationError, err = s.api.DeployService(sr, api.DeployServiceStatusOption(statuses)) } if err != nil { diff --git a/api/core/deploy_integration_test.go b/interface/grpc/core/deploy_integration_test.go similarity index 100% rename from api/core/deploy_integration_test.go rename to interface/grpc/core/deploy_integration_test.go diff --git a/api/core/deploy_test.go b/interface/grpc/core/deploy_test.go similarity index 100% rename from api/core/deploy_test.go rename to interface/grpc/core/deploy_test.go diff --git a/api/core/error.go b/interface/grpc/core/error.go similarity index 100% rename from api/core/error.go rename to interface/grpc/core/error.go diff --git a/api/core/error_test.go b/interface/grpc/core/error_test.go similarity index 100% rename from api/core/error_test.go rename to interface/grpc/core/error_test.go diff --git a/api/core/execute.go b/interface/grpc/core/execute.go similarity index 100% rename from api/core/execute.go rename to interface/grpc/core/execute.go diff --git a/api/core/execute_test.go b/interface/grpc/core/execute_test.go similarity index 100% rename from api/core/execute_test.go rename to interface/grpc/core/execute_test.go diff --git a/api/core/get_service.go b/interface/grpc/core/get_service.go similarity index 100% rename from api/core/get_service.go rename to interface/grpc/core/get_service.go diff --git a/api/core/get_service_test.go b/interface/grpc/core/get_service_test.go similarity index 100% rename from api/core/get_service_test.go rename to interface/grpc/core/get_service_test.go diff --git a/api/core/list_services.go b/interface/grpc/core/list_services.go similarity index 100% rename from api/core/list_services.go rename to interface/grpc/core/list_services.go diff --git a/api/core/list_services_test.go b/interface/grpc/core/list_services_test.go similarity index 100% rename from api/core/list_services_test.go rename to interface/grpc/core/list_services_test.go diff --git a/api/core/listen_event.go b/interface/grpc/core/listen_event.go similarity index 100% rename from api/core/listen_event.go rename to interface/grpc/core/listen_event.go diff --git a/api/core/listen_event_test.go b/interface/grpc/core/listen_event_test.go similarity index 100% rename from api/core/listen_event_test.go rename to interface/grpc/core/listen_event_test.go diff --git a/api/core/listen_result.go b/interface/grpc/core/listen_result.go similarity index 100% rename from api/core/listen_result.go rename to interface/grpc/core/listen_result.go diff --git a/api/core/listen_result_test.go b/interface/grpc/core/listen_result_test.go similarity index 100% rename from api/core/listen_result_test.go rename to interface/grpc/core/listen_result_test.go diff --git a/api/core/start.go b/interface/grpc/core/start.go similarity index 100% rename from api/core/start.go rename to interface/grpc/core/start.go diff --git a/api/core/start_test.go b/interface/grpc/core/start_test.go similarity index 100% rename from api/core/start_test.go rename to interface/grpc/core/start_test.go diff --git a/api/core/stop.go b/interface/grpc/core/stop.go similarity index 100% rename from api/core/stop.go rename to interface/grpc/core/stop.go diff --git a/api/core/stop_test.go b/interface/grpc/core/stop_test.go similarity index 100% rename from api/core/stop_test.go rename to interface/grpc/core/stop_test.go diff --git a/api/core/type.go b/interface/grpc/core/type.go similarity index 70% rename from api/core/type.go rename to interface/grpc/core/type.go index 0e6e3901c..e45e7fe3c 100644 --- a/api/core/type.go +++ b/interface/grpc/core/type.go @@ -3,12 +3,12 @@ package core import ( "errors" - "github.com/mesg-foundation/core/mesg" + "github.com/mesg-foundation/core/api" ) // Server is the type to aggregate all the APIs. type Server struct { - mesg *mesg.MESG + api *api.API } // Option is a configuration func for Server. @@ -20,15 +20,15 @@ func NewServer(options ...Option) (*Server, error) { for _, option := range options { option(s) } - if s.mesg == nil { + if s.api == nil { return nil, errors.New("mesg should be provided") } return s, nil } -// MESGOption configures underlying mesg access API. -func MESGOption(mesg *mesg.MESG) Option { +// APIOption sets underlying mesg API. +func APIOption(api *api.API) Option { return func(s *Server) { - s.mesg = mesg + s.api = api } } diff --git a/api/server.go b/interface/grpc/server.go similarity index 87% rename from api/server.go rename to interface/grpc/server.go index d57ae935f..201f021fc 100644 --- a/api/server.go +++ b/interface/grpc/server.go @@ -1,4 +1,4 @@ -package api +package grpc import ( "errors" @@ -7,9 +7,9 @@ import ( "github.com/grpc-ecosystem/go-grpc-middleware" "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - "github.com/mesg-foundation/core/api/core" - "github.com/mesg-foundation/core/api/service" - "github.com/mesg-foundation/core/mesg" + "github.com/mesg-foundation/core/api" + "github.com/mesg-foundation/core/interface/grpc/core" + "github.com/mesg-foundation/core/interface/grpc/service" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/reflection" @@ -66,12 +66,12 @@ func (s *Server) Stop() { // register all server func (s *Server) register() error { - m, err := mesg.New() + a, err := api.New() if err != nil { return err } - coreServer, err := core.NewServer(core.MESGOption(m)) + coreServer, err := core.NewServer(core.APIOption(a)) if err != nil { return err } diff --git a/api/server_test.go b/interface/grpc/server_test.go similarity index 98% rename from api/server_test.go rename to interface/grpc/server_test.go index 7e707513a..32af0e75a 100644 --- a/api/server_test.go +++ b/interface/grpc/server_test.go @@ -1,4 +1,4 @@ -package api +package grpc import ( "testing" diff --git a/api/service/api.pb.go b/interface/grpc/service/api.pb.go similarity index 100% rename from api/service/api.pb.go rename to interface/grpc/service/api.pb.go diff --git a/api/service/api.proto b/interface/grpc/service/api.proto similarity index 100% rename from api/service/api.proto rename to interface/grpc/service/api.proto diff --git a/api/service/emit_event.go b/interface/grpc/service/emit_event.go similarity index 100% rename from api/service/emit_event.go rename to interface/grpc/service/emit_event.go diff --git a/api/service/emit_event_test.go b/interface/grpc/service/emit_event_test.go similarity index 100% rename from api/service/emit_event_test.go rename to interface/grpc/service/emit_event_test.go diff --git a/api/service/error.go b/interface/grpc/service/error.go similarity index 100% rename from api/service/error.go rename to interface/grpc/service/error.go diff --git a/api/service/error_test.go b/interface/grpc/service/error_test.go similarity index 100% rename from api/service/error_test.go rename to interface/grpc/service/error_test.go diff --git a/api/service/listen_task.go b/interface/grpc/service/listen_task.go similarity index 100% rename from api/service/listen_task.go rename to interface/grpc/service/listen_task.go diff --git a/api/service/submit_result.go b/interface/grpc/service/submit_result.go similarity index 100% rename from api/service/submit_result.go rename to interface/grpc/service/submit_result.go diff --git a/api/service/submit_result_test.go b/interface/grpc/service/submit_result_test.go similarity index 100% rename from api/service/submit_result_test.go rename to interface/grpc/service/submit_result_test.go diff --git a/api/service/type.go b/interface/grpc/service/type.go similarity index 100% rename from api/service/type.go rename to interface/grpc/service/type.go From 705338d999da057b23dfa74c16b2e3799b770b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Tue, 21 Aug 2018 00:18:29 +0300 Subject: [PATCH 02/24] move task execution logic from interface/grpc/core to api package * TestGetData and TestGetDataInvalid tests are removed because they are no longer needed. Also similar behavior is tested by TestExecute and TestExecuteWithInvalidJSON in interface/grpc/core/execute_test.go --- api/execute.go | 7 +++ api/execute_executor.go | 66 +++++++++++++++++++++++++++ api/execute_executor_test.go | 61 +++++++++++++++++++++++++ interface/grpc/core/error.go | 10 ----- interface/grpc/core/error_test.go | 12 ----- interface/grpc/core/execute.go | 43 ++---------------- interface/grpc/core/execute_test.go | 69 +++-------------------------- 7 files changed, 145 insertions(+), 123 deletions(-) create mode 100644 api/execute.go create mode 100644 api/execute_executor.go create mode 100644 api/execute_executor_test.go delete mode 100644 interface/grpc/core/error.go delete mode 100644 interface/grpc/core/error_test.go diff --git a/api/execute.go b/api/execute.go new file mode 100644 index 000000000..81900f493 --- /dev/null +++ b/api/execute.go @@ -0,0 +1,7 @@ +package api + +// ExecuteTask executes a task tasKey with inputData and tags for service serviceID. +func (a *API) ExecuteTask(serviceID, taskKey string, inputData map[string]interface{}, + tags []string) (executionID string, err error) { + return newTaskExecutor(a).Execute(serviceID, taskKey, inputData, tags) +} diff --git a/api/execute_executor.go b/api/execute_executor.go new file mode 100644 index 000000000..eb2f97f3e --- /dev/null +++ b/api/execute_executor.go @@ -0,0 +1,66 @@ +package api + +import ( + "fmt" + + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/execution" + "github.com/mesg-foundation/core/service" +) + +// taskExecutor provides functionalies to execute a MESG task. +type taskExecutor struct { + api *API +} + +// newTaskExecutor creates a new taskExecutor with given api. +func newTaskExecutor(api *API) *taskExecutor { + return &taskExecutor{ + api: api, + } +} + +// ExecuteTask executes a task tasKey with inputData and tags for service serviceID. +func (e *taskExecutor) Execute(serviceID, taskKey string, inputData map[string]interface{}, + tags []string) (executionID string, err error) { + s, err := services.Get(serviceID) + if err != nil { + return "", err + } + if err := e.checkServiceStatus(&s); err != nil { + return "", err + } + return e.execute(&s, taskKey, inputData, tags) +} + +// checkServiceStatus checks service status. A task should be executed only if +// task's service is running. +func (e *taskExecutor) checkServiceStatus(s *service.Service) error { + status, err := s.Status() + if err != nil { + return err + } + if status != service.RUNNING { + return &NotRunningServiceError{ServiceID: s.Hash()} + } + return nil +} + +// execute executes task. +func (e *taskExecutor) execute(s *service.Service, key string, inputs map[string]interface{}, tags []string) (executionID string, err error) { + exc, err := execution.Create(s, key, inputs, tags) + if err != nil { + return "", err + } + return exc.ID, exc.Execute() +} + +// NotRunningServiceError is an error returned when the service is not running that +// a task needed to be executed on. +type NotRunningServiceError struct { + ServiceID string +} + +func (e *NotRunningServiceError) Error() string { + return fmt.Sprintf("Service %q is not running", e.ServiceID) +} diff --git a/api/execute_executor_test.go b/api/execute_executor_test.go new file mode 100644 index 000000000..3ecdeaf3d --- /dev/null +++ b/api/execute_executor_test.go @@ -0,0 +1,61 @@ +package api + +import ( + "testing" + + "github.com/mesg-foundation/core/service" + "github.com/stvp/assert" +) + +func TestNotRunningServiceError(t *testing.T) { + e := NotRunningServiceError{ServiceID: "test"} + assert.Equal(t, `Service "test" is not running`, e.Error()) +} + +func TestExecuteFunc(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + executor := newTaskExecutor(a) + s := &service.Service{ + Name: "TestExecuteFunc", + Tasks: map[string]*service.Task{ + "test": {}, + }, + } + id, err := executor.execute(s, "test", map[string]interface{}{}, []string{}) + assert.Nil(t, err) + assert.NotNil(t, id) +} + +func TestExecuteFuncInvalidTaskName(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + executor := newTaskExecutor(a) + srv := &service.Service{} + _, err := executor.execute(srv, "test", map[string]interface{}{}, []string{}) + assert.NotNil(t, err) +} + +func TestCheckServiceNotRunning(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + executor := newTaskExecutor(a) + err := executor.checkServiceStatus(&service.Service{Name: "TestCheckServiceNotRunning"}) + assert.NotNil(t, err) + _, notRunningError := err.(*NotRunningServiceError) + assert.True(t, notRunningError) +} + +func TestCheckService(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + executor := newTaskExecutor(a) + s := service.Service{ + Name: "TestCheckService", + Dependencies: map[string]*service.Dependency{ + "test": { + Image: "nginx", + }, + }, + } + s.Start() + defer s.Stop() + err := executor.checkServiceStatus(&s) + assert.Nil(t, err) +} diff --git a/interface/grpc/core/error.go b/interface/grpc/core/error.go deleted file mode 100644 index d4124909d..000000000 --- a/interface/grpc/core/error.go +++ /dev/null @@ -1,10 +0,0 @@ -package core - -// NotRunningServiceError is an error when a service is not running. -type NotRunningServiceError struct { - ServiceID string -} - -func (e *NotRunningServiceError) Error() string { - return "Service " + e.ServiceID + " is not running" -} diff --git a/interface/grpc/core/error_test.go b/interface/grpc/core/error_test.go deleted file mode 100644 index 468e14a9c..000000000 --- a/interface/grpc/core/error_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package core - -import ( - "testing" - - "github.com/stvp/assert" -) - -func TestNotRunningServiceError(t *testing.T) { - e := NotRunningServiceError{ServiceID: "test"} - assert.Equal(t, "Service test is not running", e.Error()) -} diff --git a/interface/grpc/core/execute.go b/interface/grpc/core/execute.go index 8a06dfd2d..603e7489a 100644 --- a/interface/grpc/core/execute.go +++ b/interface/grpc/core/execute.go @@ -3,52 +3,17 @@ package core import ( "context" "encoding/json" - - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/execution" - "github.com/mesg-foundation/core/service" ) // ExecuteTask executes a task for a given service. func (s *Server) ExecuteTask(ctx context.Context, request *ExecuteTaskRequest) (*ExecuteTaskReply, error) { - srv, err := services.Get(request.ServiceID) - if err != nil { - return nil, err - } - inputs, err := getData(request) - if err != nil { - return nil, err - } - if err := checkServiceStatus(&srv); err != nil { + var inputs map[string]interface{} + if err := json.Unmarshal([]byte(request.InputData), &inputs); err != nil { return nil, err } - executionID, err := execute(&srv, request.TaskKey, inputs, request.ExecutionTags) + + executionID, err := s.api.ExecuteTask(request.ServiceID, request.TaskKey, inputs, request.ExecutionTags) return &ExecuteTaskReply{ ExecutionID: executionID, }, err } - -func checkServiceStatus(srv *service.Service) error { - status, err := srv.Status() - if err != nil { - return err - } - if status != service.RUNNING { - return &NotRunningServiceError{ServiceID: srv.Hash()} - } - return nil -} - -func getData(request *ExecuteTaskRequest) (map[string]interface{}, error) { - var inputs map[string]interface{} - err := json.Unmarshal([]byte(request.InputData), &inputs) - return inputs, err -} - -func execute(srv *service.Service, key string, inputs map[string]interface{}, tags []string) (executionID string, err error) { - exc, err := execution.Create(srv, key, inputs, tags) - if err != nil { - return "", err - } - return exc.ID, exc.Execute() -} diff --git a/interface/grpc/core/execute_test.go b/interface/grpc/core/execute_test.go index a7b5e9698..81ab873ca 100644 --- a/interface/grpc/core/execute_test.go +++ b/interface/grpc/core/execute_test.go @@ -4,18 +4,20 @@ import ( "context" "testing" + "github.com/mesg-foundation/core/api" "github.com/mesg-foundation/core/database/services" "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" - "github.com/stvp/assert" ) var serverexecute = new(Server) func TestExecute(t *testing.T) { - url := "https://github.com/mesg-foundation/service-webhook" - taskKey := "call" - data := `{"url": "https://mesg.tech", "data": {}, "headers": {}}` + var ( + url = "https://github.com/mesg-foundation/service-webhook" + taskKey = "call" + data = `{"url": "https://mesg.tech", "data": {}, "headers": {}}` + ) server := newServer(t) stream := newTestDeployStream(url) @@ -98,9 +100,7 @@ func TestExecuteWithNonRunningService(t *testing.T) { InputData: "{}", }) - require.NotNil(t, err) - _, nonRunning := err.(*NotRunningServiceError) - require.True(t, nonRunning) + require.Equal(t, err, &api.NotRunningServiceError{ServiceID: stream.serviceID}) } func TestExecuteWithNonExistingService(t *testing.T) { @@ -112,58 +112,3 @@ func TestExecuteWithNonExistingService(t *testing.T) { require.NotNil(t, err) } - -func TestExecuteFunc(t *testing.T) { - srv := &service.Service{ - Name: "TestExecuteFunc", - Tasks: map[string]*service.Task{ - "test": {}, - }, - } - id, err := execute(srv, "test", map[string]interface{}{}, []string{}) - assert.Nil(t, err) - assert.NotNil(t, id) -} - -func TestExecuteFuncInvalidTaskName(t *testing.T) { - srv := &service.Service{} - _, err := execute(srv, "test", map[string]interface{}{}, []string{}) - assert.NotNil(t, err) -} - -func TestGetData(t *testing.T) { - inputs, err := getData(&ExecuteTaskRequest{ - InputData: "{\"foo\":\"bar\"}", - }) - assert.Nil(t, err) - assert.Equal(t, "bar", inputs["foo"]) -} - -func TestGetDataInvalid(t *testing.T) { - _, err := getData(&ExecuteTaskRequest{ - InputData: "", - }) - assert.NotNil(t, err) -} - -func TestCheckServiceNotRunning(t *testing.T) { - err := checkServiceStatus(&service.Service{Name: "TestCheckServiceNotRunning"}) - assert.NotNil(t, err) - _, notRunningError := err.(*NotRunningServiceError) - assert.True(t, notRunningError) -} - -func TestCheckService(t *testing.T) { - srv := service.Service{ - Name: "TestCheckService", - Dependencies: map[string]*service.Dependency{ - "test": { - Image: "nginx", - }, - }, - } - srv.Start() - defer srv.Stop() - err := checkServiceStatus(&srv) - assert.Nil(t, err) -} From 2b5d860f390bdfa75f13709eccfbdb3111048afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Wed, 22 Aug 2018 14:36:22 +0300 Subject: [PATCH 03/24] move service delete logic from interface/grpc/core to api package --- api/delete.go | 6 ++++++ api/delete_deleter.go | 25 +++++++++++++++++++++++++ api/execute_executor.go | 3 ++- interface/grpc/core/delete.go | 16 ++-------------- 4 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 api/delete.go create mode 100644 api/delete_deleter.go diff --git a/api/delete.go b/api/delete.go new file mode 100644 index 000000000..b78cad596 --- /dev/null +++ b/api/delete.go @@ -0,0 +1,6 @@ +package api + +// DeleteService stops and deletes service serviceID. +func (a *API) DeleteService(serviceID string) error { + return newServiceDeleter(a).Delete(serviceID) +} diff --git a/api/delete_deleter.go b/api/delete_deleter.go new file mode 100644 index 000000000..fd2665b90 --- /dev/null +++ b/api/delete_deleter.go @@ -0,0 +1,25 @@ +package api + +import "github.com/mesg-foundation/core/database/services" + +type serviceDeleter struct { + api *API +} + +func newServiceDeleter(api *API) *serviceDeleter { + return &serviceDeleter{ + api: api, + } +} + +// Delete stops and deletes service serviceID. +func (d *serviceDeleter) Delete(serviceID string) error { + service, err := services.Get(serviceID) + if err != nil { + return err + } + if err := service.Stop(); err != nil { + return err + } + return services.Delete(serviceID) +} diff --git a/api/execute_executor.go b/api/execute_executor.go index eb2f97f3e..9779ababb 100644 --- a/api/execute_executor.go +++ b/api/execute_executor.go @@ -47,7 +47,8 @@ func (e *taskExecutor) checkServiceStatus(s *service.Service) error { } // execute executes task. -func (e *taskExecutor) execute(s *service.Service, key string, inputs map[string]interface{}, tags []string) (executionID string, err error) { +func (e *taskExecutor) execute(s *service.Service, key string, inputs map[string]interface{}, + tags []string) (executionID string, err error) { exc, err := execution.Create(s, key, inputs, tags) if err != nil { return "", err diff --git a/interface/grpc/core/delete.go b/interface/grpc/core/delete.go index e216dd274..5f2988df0 100644 --- a/interface/grpc/core/delete.go +++ b/interface/grpc/core/delete.go @@ -2,21 +2,9 @@ package core import ( "context" - - "github.com/mesg-foundation/core/database/services" ) -// DeleteService deletes a service in the database and eventually stops the docker of this service. +// DeleteService stops and deletes service serviceID. func (s *Server) DeleteService(ctx context.Context, request *DeleteServiceRequest) (*DeleteServiceReply, error) { - service, err := services.Get(request.ServiceID) - if err != nil { - return nil, err - } - if err := service.Stop(); err != nil { - return nil, err - } - if err := services.Delete(request.ServiceID); err != nil { - return nil, err - } - return &DeleteServiceReply{}, nil + return &DeleteServiceReply{}, s.api.DeleteService(request.ServiceID) } From 1181f3505db0e1a822db432a18b7d16b812d10d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Wed, 22 Aug 2018 14:58:55 +0300 Subject: [PATCH 04/24] move service get logic from interface/grpc/core to api package --- api/get.go | 8 ++++++++ api/get_getter.go | 22 ++++++++++++++++++++++ interface/grpc/core/execute_test.go | 2 +- interface/grpc/core/get_service.go | 10 +++------- 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 api/get.go create mode 100644 api/get_getter.go diff --git a/api/get.go b/api/get.go new file mode 100644 index 000000000..d8b64e7c5 --- /dev/null +++ b/api/get.go @@ -0,0 +1,8 @@ +package api + +import "github.com/mesg-foundation/core/service" + +// GetService returns service serviceID. +func (a *API) GetService(serviceID string) (*service.Service, error) { + return newServiceGetter(a).Get(serviceID) +} diff --git a/api/get_getter.go b/api/get_getter.go new file mode 100644 index 000000000..654938fc6 --- /dev/null +++ b/api/get_getter.go @@ -0,0 +1,22 @@ +package api + +import ( + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/service" +) + +type serviceGetter struct { + api *API +} + +func newServiceGetter(api *API) *serviceGetter { + return &serviceGetter{ + api: api, + } +} + +// Get returns service serviceID. +func (d *serviceGetter) Get(serviceID string) (*service.Service, error) { + service, err := services.Get(serviceID) + return &service, err +} diff --git a/interface/grpc/core/execute_test.go b/interface/grpc/core/execute_test.go index 81ab873ca..5866bc577 100644 --- a/interface/grpc/core/execute_test.go +++ b/interface/grpc/core/execute_test.go @@ -100,7 +100,7 @@ func TestExecuteWithNonRunningService(t *testing.T) { InputData: "{}", }) - require.Equal(t, err, &api.NotRunningServiceError{ServiceID: stream.serviceID}) + require.Equal(t, &api.NotRunningServiceError{ServiceID: stream.serviceID}, err) } func TestExecuteWithNonExistingService(t *testing.T) { diff --git a/interface/grpc/core/get_service.go b/interface/grpc/core/get_service.go index d7d1b756a..4b606f1b9 100644 --- a/interface/grpc/core/get_service.go +++ b/interface/grpc/core/get_service.go @@ -2,14 +2,10 @@ package core import ( "context" - - "github.com/mesg-foundation/core/database/services" ) -// GetService fetches a service from the database and returns it. +// GetService returns service serviceID. func (s *Server) GetService(ctx context.Context, request *GetServiceRequest) (*GetServiceReply, error) { - service, err := services.Get(request.ServiceID) - return &GetServiceReply{ - Service: &service, - }, err + service, err := s.api.GetService(request.ServiceID) + return &GetServiceReply{Service: service}, err } From 10a69aeabcd5e5d1d8c6b5db9fefd3938d650d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Wed, 22 Aug 2018 15:24:22 +0300 Subject: [PATCH 05/24] move service list logic from interface/grpc/core to api package & minor improvements on api package --- api/delete_deleter.go | 2 ++ api/deploy.go | 14 +++----------- api/deploy_deployer.go | 10 ++++++++-- api/execute_executor.go | 2 +- api/get_getter.go | 4 +++- api/list.go | 11 +++++++++++ api/list_lister.go | 27 +++++++++++++++++++++++++++ interface/grpc/core/list_services.go | 6 ++---- 8 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 api/list.go create mode 100644 api/list_lister.go diff --git a/api/delete_deleter.go b/api/delete_deleter.go index fd2665b90..2c9bf462e 100644 --- a/api/delete_deleter.go +++ b/api/delete_deleter.go @@ -2,10 +2,12 @@ package api import "github.com/mesg-foundation/core/database/services" +// serviceDeleter provides functionalities to delete a MESG service. type serviceDeleter struct { api *API } +// newServiceDeleter creates a new serviceDeleter with given. func newServiceDeleter(api *API) *serviceDeleter { return &serviceDeleter{ api: api, diff --git a/api/deploy.go b/api/deploy.go index c0e3f4dbe..32a0839f4 100644 --- a/api/deploy.go +++ b/api/deploy.go @@ -7,7 +7,7 @@ import ( "github.com/mesg-foundation/core/service/importer" ) -// DeployServiceOption is a configuration func for Deploy methods. +// DeployServiceOption is a configuration func for deploying services. type DeployServiceOption func(*serviceDeployer) // DeployServiceStatusOption receives chan statuses to send deploy statuses. @@ -19,11 +19,7 @@ func DeployServiceStatusOption(statuses chan DeployStatus) DeployServiceOption { // DeployService deploys a service from a gzipped tarball. func (a *API) DeployService(r io.Reader, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { - deployer := newServiceDeployer(a) - for _, option := range options { - option(deployer) - } - return deployer.FromGzippedTar(r) + return newServiceDeployer(a, options...).FromGzippedTar(r) } // DeployServiceFromURL deploys a service living at a Git host. @@ -31,9 +27,5 @@ func (a *API) DeployService(r io.Reader, options ...DeployServiceOption) (*servi // - https://github.com/mesg-foundation/service-ethereum // - https://github.com/mesg-foundation/service-ethereum#branchName func (a *API) DeployServiceFromURL(url string, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { - deployer := newServiceDeployer(a) - for _, option := range options { - option(deployer) - } - return deployer.FromGitURL(url) + return newServiceDeployer(a, options...).FromGitURL(url) } diff --git a/api/deploy_deployer.go b/api/deploy_deployer.go index cbb91c66d..633ce8a6b 100644 --- a/api/deploy_deployer.go +++ b/api/deploy_deployer.go @@ -17,6 +17,7 @@ import ( "gopkg.in/src-d/go-git.v4/plumbing" ) +// serviceDeployer provides functionalities to deploy a MESG service. type serviceDeployer struct { Statuses chan DeployStatus @@ -40,10 +41,15 @@ type DeployStatus struct { Type StatusType } -func newServiceDeployer(api *API) *serviceDeployer { - return &serviceDeployer{ +// newServiceDeployer creates a new serviceDeployer with given api and options. +func newServiceDeployer(api *API, options ...DeployServiceOption) *serviceDeployer { + d := &serviceDeployer{ api: api, } + for _, option := range options { + option(d) + } + return d } // FromGitURL deploys a service hosted at a Git url. diff --git a/api/execute_executor.go b/api/execute_executor.go index 9779ababb..8605f39e1 100644 --- a/api/execute_executor.go +++ b/api/execute_executor.go @@ -8,7 +8,7 @@ import ( "github.com/mesg-foundation/core/service" ) -// taskExecutor provides functionalies to execute a MESG task. +// taskExecutor provides functionalities to execute a MESG task. type taskExecutor struct { api *API } diff --git a/api/get_getter.go b/api/get_getter.go index 654938fc6..c03ee1b4f 100644 --- a/api/get_getter.go +++ b/api/get_getter.go @@ -5,10 +5,12 @@ import ( "github.com/mesg-foundation/core/service" ) +// serviceGetter provides functionalities to get a MESG service. type serviceGetter struct { api *API } +// newServiceGetter creates a new serviceGetter with given api. func newServiceGetter(api *API) *serviceGetter { return &serviceGetter{ api: api, @@ -16,7 +18,7 @@ func newServiceGetter(api *API) *serviceGetter { } // Get returns service serviceID. -func (d *serviceGetter) Get(serviceID string) (*service.Service, error) { +func (g *serviceGetter) Get(serviceID string) (*service.Service, error) { service, err := services.Get(serviceID) return &service, err } diff --git a/api/list.go b/api/list.go new file mode 100644 index 000000000..e39070d09 --- /dev/null +++ b/api/list.go @@ -0,0 +1,11 @@ +package api + +import "github.com/mesg-foundation/core/service" + +// ListServicesFilter is a filter func for listing services. +type ListServicesFilter func(*serviceLister) + +// ListServices returns services matches with filters. +func (a *API) ListServices(filters ...ListServicesFilter) ([]*service.Service, error) { + return newServiceLister(a, filters...).List() +} diff --git a/api/list_lister.go b/api/list_lister.go new file mode 100644 index 000000000..0aafa97d3 --- /dev/null +++ b/api/list_lister.go @@ -0,0 +1,27 @@ +package api + +import ( + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/service" +) + +// serviceLister provides functionalities to list MESG services. +type serviceLister struct { + api *API +} + +// newServiceLister creates a new serviceLister with given api and filters. +func newServiceLister(api *API, filters ...ListServicesFilter) *serviceLister { + l := &serviceLister{ + api: api, + } + for _, filter := range filters { + filter(l) + } + return l +} + +// Lists services. +func (l *serviceLister) List() ([]*service.Service, error) { + return services.All() +} diff --git a/interface/grpc/core/list_services.go b/interface/grpc/core/list_services.go index 40d6b8643..457b847fe 100644 --- a/interface/grpc/core/list_services.go +++ b/interface/grpc/core/list_services.go @@ -2,13 +2,11 @@ package core import ( "context" - - "github.com/mesg-foundation/core/database/services" ) -// ListServices returns all services from the database. +// ListServices lists services. func (s *Server) ListServices(ctx context.Context, request *ListServicesRequest) (*ListServicesReply, error) { - services, err := services.All() + services, err := s.api.ListServices() return &ListServicesReply{ Services: services, }, err From 5e262da2b8c856c3dd8ae53c3efab5f2de9ef0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Wed, 22 Aug 2018 16:37:15 +0300 Subject: [PATCH 06/24] move event listen logic from interface/grpc/core to api package --- api/deploy_deployer.go | 1 + api/listen_event.go | 7 ++ api/listen_event_listener.go | 90 ++++++++++++++++++++++++ api/listen_event_listener_test.go | 35 +++++++++ interface/grpc/core/listen_event.go | 58 +++++---------- interface/grpc/core/listen_event_test.go | 39 ---------- 6 files changed, 151 insertions(+), 79 deletions(-) create mode 100644 api/listen_event.go create mode 100644 api/listen_event_listener.go create mode 100644 api/listen_event_listener_test.go delete mode 100644 interface/grpc/core/listen_event_test.go diff --git a/api/deploy_deployer.go b/api/deploy_deployer.go index 633ce8a6b..0f20f4f8a 100644 --- a/api/deploy_deployer.go +++ b/api/deploy_deployer.go @@ -19,6 +19,7 @@ import ( // serviceDeployer provides functionalities to deploy a MESG service. type serviceDeployer struct { + // Statuses receives status messages produced during deployment. Statuses chan DeployStatus api *API diff --git a/api/listen_event.go b/api/listen_event.go new file mode 100644 index 000000000..8b1b911af --- /dev/null +++ b/api/listen_event.go @@ -0,0 +1,7 @@ +package api + +// ListenEvent listens events matches with eventFilter on serviceID. +func (a *API) ListenEvent(serviceID, eventFilter string) (*EventListener, error) { + l := newEventListener(a) + return l, l.listen(serviceID, eventFilter) +} diff --git a/api/listen_event_listener.go b/api/listen_event_listener.go new file mode 100644 index 000000000..fa55b5ce9 --- /dev/null +++ b/api/listen_event_listener.go @@ -0,0 +1,90 @@ +package api + +import ( + "fmt" + + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/event" + "github.com/mesg-foundation/core/pubsub" + "github.com/mesg-foundation/core/service" + "github.com/mesg-foundation/core/utils/array" +) + +// EventListener provides functionalities to listen MESG events. +type EventListener struct { + // Events receives matching events. + Events chan *event.Event + + // Err filled when event subscription finished with a failure. + Err chan error + + // cancel stops listening for new events. + cancel chan struct{} + + api *API +} + +// newEventListener creates a new EventListener with given api. +func newEventListener(api *API) *EventListener { + return &EventListener{ + Events: make(chan *event.Event, 0), + Err: make(chan error, 1), + cancel: make(chan struct{}, 0), + api: api, + } +} + +// Close stops listening for events. +func (e *EventListener) Close() error { + close(e.cancel) + return nil +} + +// listen listens events matches with eventFilter on serviceID. +func (e *EventListener) listen(serviceID, eventFilter string) error { + service, err := services.Get(serviceID) + if err != nil { + return err + } + if err := e.validateEventKey(&service, eventFilter); err != nil { + return err + } + go e.listenLoop(&service, eventFilter) + return nil +} + +func (e *EventListener) listenLoop(service *service.Service, eventFilter string) { + channel := service.EventSubscriptionChannel() + subscription := pubsub.Subscribe(channel) + defer pubsub.Unsubscribe(channel, subscription) + + for { + select { + case <-e.cancel: + return + + // TODO use e.Err when subscription fails. + // currently we don't need this but when pubsub refactored, we'll + // need to pass an error to Err chan. + case data := <-subscription: + event := data.(*event.Event) + if e.isSubscribedEvent(eventFilter, event) { + e.Events <- event + } + } + } +} + +func (e *EventListener) validateEventKey(service *service.Service, eventKey string) error { + if eventKey == "" || eventKey == "*" { + return nil + } + if _, ok := service.Events[eventKey]; ok { + return nil + } + return fmt.Errorf("Event %q doesn't exist in this service", eventKey) +} + +func (e *EventListener) isSubscribedEvent(eventFilter string, ev *event.Event) bool { + return array.IncludedIn([]string{"", "*", ev.Key}, eventFilter) +} diff --git a/api/listen_event_listener_test.go b/api/listen_event_listener_test.go new file mode 100644 index 000000000..75d04b76c --- /dev/null +++ b/api/listen_event_listener_test.go @@ -0,0 +1,35 @@ +package api + +import ( + "testing" + + "github.com/mesg-foundation/core/event" + "github.com/mesg-foundation/core/service" + "github.com/stretchr/testify/require" +) + +func TestValidateEventKey(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newEventListener(a) + + s := &service.Service{ + Events: map[string]*service.Event{ + "test": {}, + }, + } + require.Nil(t, ln.validateEventKey(s, "")) + require.Nil(t, ln.validateEventKey(s, "*")) + require.Nil(t, ln.validateEventKey(s, "test")) + require.NotNil(t, ln.validateEventKey(s, "xxx")) +} + +func TestIsSubscribedEvent(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newEventListener(a) + + e := &event.Event{Key: "test"} + require.True(t, ln.isSubscribedEvent("", e)) + require.True(t, ln.isSubscribedEvent("*", e)) + require.True(t, ln.isSubscribedEvent("test", e)) + require.False(t, ln.isSubscribedEvent("xxx", e)) +} diff --git a/interface/grpc/core/listen_event.go b/interface/grpc/core/listen_event.go index 253da2c6a..5bbcbbfa8 100644 --- a/interface/grpc/core/listen_event.go +++ b/interface/grpc/core/listen_event.go @@ -2,59 +2,37 @@ package core import ( "encoding/json" - "fmt" - - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/event" - "github.com/mesg-foundation/core/pubsub" - service "github.com/mesg-foundation/core/service" - "github.com/mesg-foundation/core/utils/array" ) -// ListenEvent listens for an event from a specific service. +// ListenEvent listens events matches with eventFilter on serviceID. func (s *Server) ListenEvent(request *ListenEventRequest, stream Core_ListenEventServer) error { - service, err := services.Get(request.ServiceID) + ln, err := s.api.ListenEvent(request.ServiceID, request.EventFilter) if err != nil { return err } - if err := validateEventKey(&service, request.EventFilter); err != nil { - return err - } + defer ln.Close() ctx := stream.Context() - channel := service.EventSubscriptionChannel() - subscription := pubsub.Subscribe(channel) - defer pubsub.Unsubscribe(channel, subscription) - for { select { case <-ctx.Done(): return ctx.Err() - case data := <-subscription: - event := data.(*event.Event) - if isSubscribedEvent(request, event) { - eventData, _ := json.Marshal(event.Data) - if err := stream.Send(&EventData{ - EventKey: event.Key, - EventData: string(eventData), - }); err != nil { - return err - } + + case err := <-ln.Err: + return err + + case ev := <-ln.Events: + evData, err := json.Marshal(ev.Data) + if err != nil { + return err } - } - } -} -func validateEventKey(service *service.Service, eventKey string) error { - if eventKey == "" || eventKey == "*" { - return nil - } - if _, ok := service.Events[eventKey]; ok { - return nil + if err := stream.Send(&EventData{ + EventKey: ev.Key, + EventData: string(evData), + }); err != nil { + return err + } + } } - return fmt.Errorf("Event %q doesn't exist in this service", eventKey) -} - -func isSubscribedEvent(request *ListenEventRequest, e *event.Event) bool { - return array.IncludedIn([]string{"", "*", e.Key}, request.EventFilter) } diff --git a/interface/grpc/core/listen_event_test.go b/interface/grpc/core/listen_event_test.go deleted file mode 100644 index 712b61ff0..000000000 --- a/interface/grpc/core/listen_event_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package core - -import ( - "testing" - - "github.com/mesg-foundation/core/event" - "github.com/mesg-foundation/core/service" - "github.com/stretchr/testify/require" -) - -func TestValidateEventKey(t *testing.T) { - s := &service.Service{ - Events: map[string]*service.Event{ - "test": {}, - }, - } - require.Nil(t, validateEventKey(s, "")) - require.Nil(t, validateEventKey(s, "*")) - require.Nil(t, validateEventKey(s, "test")) - require.NotNil(t, validateEventKey(s, "xxx")) -} - -func TestIsSubscribedEvent(t *testing.T) { - e := &event.Event{Key: "test"} - r := &ListenEventRequest{} - require.True(t, isSubscribedEvent(r, e)) - - r = &ListenEventRequest{EventFilter: ""} - require.True(t, isSubscribedEvent(r, e)) - - r = &ListenEventRequest{EventFilter: "*"} - require.True(t, isSubscribedEvent(r, e)) - - r = &ListenEventRequest{EventFilter: "test"} - require.True(t, isSubscribedEvent(r, e)) - - r = &ListenEventRequest{EventFilter: "xxx"} - require.False(t, isSubscribedEvent(r, e)) -} From 1ecb5c6417d0542b53b1c2e3fd7829193aa10edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Wed, 22 Aug 2018 19:36:00 +0300 Subject: [PATCH 07/24] move result listen logic from interface/grpc/core to api package & make api.ListenEvent() to take filter funcs --- api/listen_event.go | 16 +- api/listen_event_listener.go | 41 ++--- api/listen_event_listener_test.go | 32 +++- api/listen_result.go | 31 ++++ api/listen_result_listener.go | 140 ++++++++++++++++++ .../listen_result_listener_test.go | 139 +++++++++++------ interface/grpc/core/listen_event.go | 4 +- interface/grpc/core/listen_result.go | 102 +++---------- 8 files changed, 352 insertions(+), 153 deletions(-) create mode 100644 api/listen_result.go create mode 100644 api/listen_result_listener.go rename interface/grpc/core/listen_result_test.go => api/listen_result_listener_test.go (55%) diff --git a/api/listen_event.go b/api/listen_event.go index 8b1b911af..2a0df651d 100644 --- a/api/listen_event.go +++ b/api/listen_event.go @@ -1,7 +1,17 @@ package api +// ListenEventFilter is a filter func for filtering events. +type ListenEventFilter func(*EventListener) + +// ListenEventKeyFilter returns an eventKey filter. +func ListenEventKeyFilter(eventKey string) ListenEventFilter { + return func(ln *EventListener) { + ln.eventKey = eventKey + } +} + // ListenEvent listens events matches with eventFilter on serviceID. -func (a *API) ListenEvent(serviceID, eventFilter string) (*EventListener, error) { - l := newEventListener(a) - return l, l.listen(serviceID, eventFilter) +func (a *API) ListenEvent(serviceID string, filters ...ListenEventFilter) (*EventListener, error) { + l := newEventListener(a, filters...) + return l, l.listen(serviceID) } diff --git a/api/listen_event_listener.go b/api/listen_event_listener.go index fa55b5ce9..64ec89483 100644 --- a/api/listen_event_listener.go +++ b/api/listen_event_listener.go @@ -21,46 +21,53 @@ type EventListener struct { // cancel stops listening for new events. cancel chan struct{} + // filters. + eventKey string + api *API } // newEventListener creates a new EventListener with given api. -func newEventListener(api *API) *EventListener { - return &EventListener{ +func newEventListener(api *API, filters ...ListenEventFilter) *EventListener { + ln := &EventListener{ Events: make(chan *event.Event, 0), Err: make(chan error, 1), cancel: make(chan struct{}, 0), api: api, } + for _, filter := range filters { + filter(ln) + } + return ln } // Close stops listening for events. -func (e *EventListener) Close() error { - close(e.cancel) +func (l *EventListener) Close() error { + close(l.cancel) return nil } // listen listens events matches with eventFilter on serviceID. -func (e *EventListener) listen(serviceID, eventFilter string) error { +func (l *EventListener) listen(serviceID string) error { service, err := services.Get(serviceID) if err != nil { return err } - if err := e.validateEventKey(&service, eventFilter); err != nil { + if err := l.validateEventKey(&service); err != nil { return err } - go e.listenLoop(&service, eventFilter) + go l.listenLoop(&service) return nil } -func (e *EventListener) listenLoop(service *service.Service, eventFilter string) { +func (l *EventListener) listenLoop(service *service.Service) { channel := service.EventSubscriptionChannel() subscription := pubsub.Subscribe(channel) defer pubsub.Unsubscribe(channel, subscription) for { select { - case <-e.cancel: + case <-l.cancel: return // TODO use e.Err when subscription fails. @@ -68,23 +75,23 @@ func (e *EventListener) listenLoop(service *service.Service, eventFilter string) // need to pass an error to Err chan. case data := <-subscription: event := data.(*event.Event) - if e.isSubscribedEvent(eventFilter, event) { - e.Events <- event + if l.isSubscribedEvent(event) { + l.Events <- event } } } } -func (e *EventListener) validateEventKey(service *service.Service, eventKey string) error { - if eventKey == "" || eventKey == "*" { +func (l *EventListener) validateEventKey(service *service.Service) error { + if l.eventKey == "" || l.eventKey == "*" { return nil } - if _, ok := service.Events[eventKey]; ok { + if _, ok := service.Events[l.eventKey]; ok { return nil } - return fmt.Errorf("Event %q doesn't exist in this service", eventKey) + return fmt.Errorf("Event %q doesn't exist in this service", l.eventKey) } -func (e *EventListener) isSubscribedEvent(eventFilter string, ev *event.Event) bool { - return array.IncludedIn([]string{"", "*", ev.Key}, eventFilter) +func (l *EventListener) isSubscribedEvent(e *event.Event) bool { + return array.IncludedIn([]string{"", "*", e.Key}, l.eventKey) } diff --git a/api/listen_event_listener_test.go b/api/listen_event_listener_test.go index 75d04b76c..a62cf9b5e 100644 --- a/api/listen_event_listener_test.go +++ b/api/listen_event_listener_test.go @@ -17,10 +17,18 @@ func TestValidateEventKey(t *testing.T) { "test": {}, }, } - require.Nil(t, ln.validateEventKey(s, "")) - require.Nil(t, ln.validateEventKey(s, "*")) - require.Nil(t, ln.validateEventKey(s, "test")) - require.NotNil(t, ln.validateEventKey(s, "xxx")) + + ln.eventKey = "" + require.Nil(t, ln.validateEventKey(s)) + + ln.eventKey = "*" + require.Nil(t, ln.validateEventKey(s)) + + ln.eventKey = "test" + require.Nil(t, ln.validateEventKey(s)) + + ln.eventKey = "xxx" + require.NotNil(t, ln.validateEventKey(s)) } func TestIsSubscribedEvent(t *testing.T) { @@ -28,8 +36,16 @@ func TestIsSubscribedEvent(t *testing.T) { ln := newEventListener(a) e := &event.Event{Key: "test"} - require.True(t, ln.isSubscribedEvent("", e)) - require.True(t, ln.isSubscribedEvent("*", e)) - require.True(t, ln.isSubscribedEvent("test", e)) - require.False(t, ln.isSubscribedEvent("xxx", e)) + + ln.eventKey = "" + require.True(t, ln.isSubscribedEvent(e)) + + ln.eventKey = "*" + require.True(t, ln.isSubscribedEvent(e)) + + ln.eventKey = "test" + require.True(t, ln.isSubscribedEvent(e)) + + ln.eventKey = "xxx" + require.False(t, ln.isSubscribedEvent(e)) } diff --git a/api/listen_result.go b/api/listen_result.go new file mode 100644 index 000000000..58c340398 --- /dev/null +++ b/api/listen_result.go @@ -0,0 +1,31 @@ +package api + +// ListenResultFilter is a filter func for filtering results. +type ListenResultFilter func(*ResultListener) + +// ListenResultTaskFilter returns a taskKey filter. +func ListenResultTaskFilter(taskKey string) ListenResultFilter { + return func(ln *ResultListener) { + ln.taskKey = taskKey + } +} + +// ListenResultOutputFilter returns a outputKey filter. +func ListenResultOutputFilter(outputKey string) ListenResultFilter { + return func(ln *ResultListener) { + ln.outputKey = outputKey + } +} + +// ListenResultTagFilters returns a tags filter. +func ListenResultTagFilters(tags []string) ListenResultFilter { + return func(ln *ResultListener) { + ln.tagFilters = tags + } +} + +// ListenResult listens results matches with fiters on serviceID. +func (a *API) ListenResult(serviceID string, filters ...ListenResultFilter) (*ResultListener, error) { + l := newResultListener(a, filters...) + return l, l.listen(serviceID) +} diff --git a/api/listen_result_listener.go b/api/listen_result_listener.go new file mode 100644 index 000000000..6e3aa0c62 --- /dev/null +++ b/api/listen_result_listener.go @@ -0,0 +1,140 @@ +package api + +import ( + "fmt" + + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/execution" + "github.com/mesg-foundation/core/pubsub" + "github.com/mesg-foundation/core/service" + "github.com/mesg-foundation/core/utils/array" +) + +// ResultListener provides functionalities to listen MESG results. +type ResultListener struct { + // Executions receives matching executions for results. + Executions chan *execution.Execution + + // Err filled when result subscription finished with a failure. + Err chan error + + // cancel stops listening for new results. + cancel chan struct{} + + // filters. + taskKey string + outputKey string + tagFilters []string + + api *API +} + +// newResultListener creates a new ResultListener with given api. +func newResultListener(api *API, filters ...ListenResultFilter) *ResultListener { + ln := &ResultListener{ + Executions: make(chan *execution.Execution, 0), + Err: make(chan error, 1), + cancel: make(chan struct{}, 0), + api: api, + } + for _, filter := range filters { + filter(ln) + } + return ln +} + +// Close stops listening for results. +func (l *ResultListener) Close() error { + close(l.cancel) + return nil +} + +// listen listens results matches with filters on serviceID. +func (l *ResultListener) listen(serviceID string) error { + service, err := services.Get(serviceID) + if err != nil { + return err + } + if err := l.validateTask(&service); err != nil { + return err + } + go l.listenLoop(&service) + return nil +} + +func (l *ResultListener) listenLoop(service *service.Service) { + channel := service.ResultSubscriptionChannel() + subscription := pubsub.Subscribe(channel) + defer pubsub.Unsubscribe(channel, subscription) + + for { + select { + case <-l.cancel: + return + + // TODO use e.Err when subscription fails. + // currently we don't need this but when pubsub refactored, we'll + // need to pass an error to Err chan. + case data := <-subscription: + execution := data.(*execution.Execution) + if l.isSubscribed(execution) { + l.Executions <- execution + } + } + } +} + +func (l *ResultListener) validateTask(service *service.Service) error { + if err := l.validateTaskKey(service); err != nil { + return err + } + return l.validateOutputKey(service) +} + +func (l *ResultListener) validateTaskKey(service *service.Service) error { + if l.taskKey == "" || l.taskKey == "*" { + return nil + } + if _, ok := service.Tasks[l.taskKey]; ok { + return nil + } + return fmt.Errorf("Task %q doesn't exist in this service", l.taskKey) +} + +func (l *ResultListener) validateOutputKey(service *service.Service) error { + if l.outputKey == "" || l.outputKey == "*" { + return nil + } + task, ok := service.Tasks[l.taskKey] + if !ok { + return fmt.Errorf("Task %q doesn't exist in this service", l.taskKey) + } + _, ok = task.Outputs[l.outputKey] + if !ok { + return fmt.Errorf("Output %q doesn't exist in the task %q of this service", l.outputKey, l.taskKey) + } + return nil +} + +func (l *ResultListener) isSubscribed(e *execution.Execution) bool { + return l.isSubscribedToTags(e) && + l.isSubscribedToTask(e) && + l.isSubscribedToOutput(e) +} + +func (l *ResultListener) isSubscribedToTask(e *execution.Execution) bool { + return array.IncludedIn([]string{"", "*", e.Task}, l.taskKey) +} + +func (l *ResultListener) isSubscribedToOutput(e *execution.Execution) bool { + return array.IncludedIn([]string{"", "*", e.Output}, l.outputKey) +} + +func (l *ResultListener) isSubscribedToTags(e *execution.Execution) bool { + for _, tag := range l.tagFilters { + if !array.IncludedIn(e.Tags, tag) { + return false + } + } + return true +} diff --git a/interface/grpc/core/listen_result_test.go b/api/listen_result_listener_test.go similarity index 55% rename from interface/grpc/core/listen_result_test.go rename to api/listen_result_listener_test.go index a30c89c18..fbd3e2f62 100644 --- a/interface/grpc/core/listen_result_test.go +++ b/api/listen_result_listener_test.go @@ -1,4 +1,4 @@ -package core +package api import ( "testing" @@ -9,18 +9,32 @@ import ( ) func TestValidateTaskKey(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newResultListener(a) + s := &service.Service{ Tasks: map[string]*service.Task{ "test": {}, }, } - require.Nil(t, validateTaskKey(s, "")) - require.Nil(t, validateTaskKey(s, "*")) - require.Nil(t, validateTaskKey(s, "test")) - require.NotNil(t, validateTaskKey(s, "xxx")) + + ln.taskKey = "" + require.Nil(t, ln.validateTaskKey(s)) + + ln.taskKey = "*" + require.Nil(t, ln.validateTaskKey(s)) + + ln.taskKey = "test" + require.Nil(t, ln.validateTaskKey(s)) + + ln.taskKey = "xxx" + require.NotNil(t, ln.validateTaskKey(s)) } func TestValidateOutputKey(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newResultListener(a) + s := &service.Service{ Tasks: map[string]*service.Task{ "test": { @@ -30,63 +44,92 @@ func TestValidateOutputKey(t *testing.T) { }, }, } - require.Nil(t, validateOutputKey(s, "test", "")) - require.Nil(t, validateOutputKey(s, "test", "*")) - require.Nil(t, validateOutputKey(s, "test", "outputx")) - require.NotNil(t, validateOutputKey(s, "test", "xxx")) - require.Nil(t, validateOutputKey(s, "xxx", "")) - require.Nil(t, validateOutputKey(s, "xxx", "*")) - require.NotNil(t, validateOutputKey(s, "xxx", "outputX")) - require.NotNil(t, validateOutputKey(s, "xxx", "xxx")) + + ln.taskKey = "test" + ln.outputKey = "" + require.Nil(t, ln.validateOutputKey(s)) + + ln.taskKey = "test" + ln.outputKey = "*" + require.Nil(t, ln.validateOutputKey(s)) + + ln.taskKey = "test" + ln.outputKey = "outputx" + require.Nil(t, ln.validateOutputKey(s)) + + ln.taskKey = "test" + ln.outputKey = "xxx" + require.NotNil(t, ln.validateOutputKey(s)) + + ln.taskKey = "xxx" + ln.outputKey = "" + require.Nil(t, ln.validateOutputKey(s)) + + ln.taskKey = "xxx" + ln.outputKey = "*" + require.Nil(t, ln.validateOutputKey(s)) + + ln.taskKey = "xxx" + ln.outputKey = "outputX" + require.NotNil(t, ln.validateOutputKey(s)) + + ln.taskKey = "xxx" + ln.outputKey = "xxx" + require.NotNil(t, ln.validateOutputKey(s)) } func TestIsSubscribedToTask(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newResultListener(a) + x := &execution.Execution{Task: "task"} - r := &ListenResultRequest{} - require.True(t, isSubscribedToTask(r, x)) - r = &ListenResultRequest{TaskFilter: ""} - require.True(t, isSubscribedToTask(r, x)) + ln.taskKey = "" + require.True(t, ln.isSubscribedToTask(x)) - r = &ListenResultRequest{TaskFilter: "*"} - require.True(t, isSubscribedToTask(r, x)) + ln.taskKey = "*" + require.True(t, ln.isSubscribedToTask(x)) - r = &ListenResultRequest{TaskFilter: "task"} - require.True(t, isSubscribedToTask(r, x)) + ln.taskKey = "task" + require.True(t, ln.isSubscribedToTask(x)) - r = &ListenResultRequest{TaskFilter: "xxx"} - require.False(t, isSubscribedToTask(r, x)) + ln.taskKey = "xxx" + require.False(t, ln.isSubscribedToTask(x)) } func TestIsSubscribedToOutput(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newResultListener(a) + x := &execution.Execution{Output: "output"} - r := &ListenResultRequest{} - require.True(t, isSubscribedToOutput(r, x)) - r = &ListenResultRequest{OutputFilter: ""} - require.True(t, isSubscribedToOutput(r, x)) + ln.outputKey = "" + require.True(t, ln.isSubscribedToOutput(x)) - r = &ListenResultRequest{OutputFilter: "*"} - require.True(t, isSubscribedToOutput(r, x)) + ln.outputKey = "*" + require.True(t, ln.isSubscribedToOutput(x)) - r = &ListenResultRequest{OutputFilter: "output"} - require.True(t, isSubscribedToOutput(r, x)) + ln.outputKey = "output" + require.True(t, ln.isSubscribedToOutput(x)) - r = &ListenResultRequest{OutputFilter: "xxx"} - require.False(t, isSubscribedToOutput(r, x)) + ln.outputKey = "xxx" + require.False(t, ln.isSubscribedToOutput(x)) } func TestIsSubscribedToTags(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newResultListener(a) + type result struct { execution *execution.Execution valid bool } tests := []struct { - request *ListenResultRequest + tags []string results []result }{ { - &ListenResultRequest{}, + []string{}, []result{ {&execution.Execution{}, true}, {&execution.Execution{Tags: []string{"foo"}}, true}, @@ -95,7 +138,7 @@ func TestIsSubscribedToTags(t *testing.T) { }, }, { - &ListenResultRequest{TagFilters: []string{"foo"}}, + []string{"foo"}, []result{ {&execution.Execution{}, false}, {&execution.Execution{Tags: []string{"foo"}}, true}, @@ -104,7 +147,7 @@ func TestIsSubscribedToTags(t *testing.T) { }, }, { - &ListenResultRequest{TagFilters: []string{"foo", "bar"}}, + []string{"foo", "bar"}, []result{ {&execution.Execution{}, false}, {&execution.Execution{Tags: []string{"foo"}}, false}, @@ -115,35 +158,40 @@ func TestIsSubscribedToTags(t *testing.T) { } for _, test := range tests { for _, r := range test.results { - require.Equal(t, r.valid, isSubscribedToTags(test.request, r.execution)) + ln.tagFilters = test.tags + require.Equal(t, r.valid, ln.isSubscribedToTags(r.execution)) } } } func TestIsSubscribed(t *testing.T) { + a, _ := newAPIAndDockerTest(t) + ln := newResultListener(a) + type test struct { - r ListenResultRequest - e execution.Execution + taskFilter, outputFilter string + tagFilters []string + e execution.Execution } subscribeToOutput := func(x *test) *test { return x } notSubscribeToOutput := func(x *test) *test { - x.r.OutputFilter = "foo" + x.outputFilter = "foo" return x } subscribeToTask := func(x *test) *test { return x } notSubscribeToTask := func(x *test) *test { - x.r.TaskFilter = "foo" + x.taskFilter = "foo" return x } subscribeToTags := func(x *test) *test { return x } notSubscribeToTags := func(x *test) *test { - x.r.TagFilters = []string{"foo"} + x.tagFilters = []string{"foo"} return x } tests := []struct { @@ -161,6 +209,9 @@ func TestIsSubscribed(t *testing.T) { {subscribeToTags(subscribeToTask(subscribeToOutput(&test{}))), true, "[tags, task, output]"}, } for _, test := range tests { - require.Equal(t, test.valid, isSubscribed(&test.t.r, &test.t.e), test.msg) + ln.taskKey = test.t.taskFilter + ln.outputKey = test.t.outputFilter + ln.tagFilters = test.t.tagFilters + require.Equal(t, test.valid, ln.isSubscribed(&test.t.e), test.msg) } } diff --git a/interface/grpc/core/listen_event.go b/interface/grpc/core/listen_event.go index 5bbcbbfa8..e9d2cb6b4 100644 --- a/interface/grpc/core/listen_event.go +++ b/interface/grpc/core/listen_event.go @@ -2,11 +2,13 @@ package core import ( "encoding/json" + + "github.com/mesg-foundation/core/api" ) // ListenEvent listens events matches with eventFilter on serviceID. func (s *Server) ListenEvent(request *ListenEventRequest, stream Core_ListenEventServer) error { - ln, err := s.api.ListenEvent(request.ServiceID, request.EventFilter) + ln, err := s.api.ListenEvent(request.ServiceID, api.ListenEventKeyFilter(request.EventFilter)) if err != nil { return err } diff --git a/interface/grpc/core/listen_result.go b/interface/grpc/core/listen_result.go index 19af61b7e..0cdb3d3e8 100644 --- a/interface/grpc/core/listen_result.go +++ b/interface/grpc/core/listen_result.go @@ -2,103 +2,45 @@ package core import ( "encoding/json" - "fmt" - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/execution" - "github.com/mesg-foundation/core/pubsub" - service "github.com/mesg-foundation/core/service" - "github.com/mesg-foundation/core/utils/array" + "github.com/mesg-foundation/core/api" ) // ListenResult listens for results from a services. func (s *Server) ListenResult(request *ListenResultRequest, stream Core_ListenResultServer) error { - service, err := services.Get(request.ServiceID) + ln, err := s.api.ListenResult(request.ServiceID, + api.ListenResultTaskFilter(request.TaskFilter), + api.ListenResultOutputFilter(request.OutputFilter), + api.ListenResultTagFilters(request.TagFilters)) if err != nil { return err } - if err := validateTask(&service, request); err != nil { - return err - } + defer ln.Close() ctx := stream.Context() - channel := service.ResultSubscriptionChannel() - subscription := pubsub.Subscribe(channel) - defer pubsub.Unsubscribe(channel, subscription) - for { select { case <-ctx.Done(): return ctx.Err() - case data := <-subscription: - execution := data.(*execution.Execution) - if isSubscribed(request, execution) { - outputs, _ := json.Marshal(execution.OutputData) - if err := stream.Send(&ResultData{ - ExecutionID: execution.ID, - TaskKey: execution.Task, - OutputKey: execution.Output, - OutputData: string(outputs), - ExecutionTags: execution.Tags, - }); err != nil { - return err - } - } - } - } -} - -func validateTask(service *service.Service, request *ListenResultRequest) error { - if err := validateTaskKey(service, request.TaskFilter); err != nil { - return err - } - return validateOutputKey(service, request.TaskFilter, request.OutputFilter) -} - -func validateTaskKey(service *service.Service, taskKey string) error { - if taskKey == "" || taskKey == "*" { - return nil - } - if _, ok := service.Tasks[taskKey]; ok { - return nil - } - return fmt.Errorf("Task %q doesn't exist in this service", taskKey) -} -func validateOutputKey(service *service.Service, taskKey string, outputFilter string) error { - if outputFilter == "" || outputFilter == "*" { - return nil - } - task, ok := service.Tasks[taskKey] - if !ok { - return fmt.Errorf("Task %q doesn't exist in this service", taskKey) - } - _, ok = task.Outputs[outputFilter] - if !ok { - return fmt.Errorf("Output %q doesn't exist in the task %q of this service", outputFilter, taskKey) - } - return nil -} + case err := <-ln.Err: + return err -func isSubscribed(request *ListenResultRequest, e *execution.Execution) bool { - return isSubscribedToTags(request, e) && - isSubscribedToTask(request, e) && - isSubscribedToOutput(request, e) -} - -func isSubscribedToTask(request *ListenResultRequest, e *execution.Execution) bool { - return array.IncludedIn([]string{"", "*", e.Task}, request.TaskFilter) -} - -func isSubscribedToOutput(request *ListenResultRequest, e *execution.Execution) bool { - return array.IncludedIn([]string{"", "*", e.Output}, request.OutputFilter) -} + case execution := <-ln.Executions: + outputs, err := json.Marshal(execution.OutputData) + if err != nil { + return err + } -func isSubscribedToTags(request *ListenResultRequest, e *execution.Execution) bool { - for _, tag := range request.TagFilters { - if !array.IncludedIn(e.Tags, tag) { - return false + if err := stream.Send(&ResultData{ + ExecutionID: execution.ID, + TaskKey: execution.Task, + OutputKey: execution.Output, + OutputData: string(outputs), + ExecutionTags: execution.Tags, + }); err != nil { + return err + } } } - return true } From 0442316f21678b8bf4e28564f13b4fb9f0d6d276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 09:20:32 +0300 Subject: [PATCH 08/24] move service start logic from interface/grpc/core to api package & improve api package comments --- api/listen_event_listener.go | 2 +- api/listen_result.go | 2 +- api/listen_result_listener.go | 2 +- api/start.go | 6 ++++++ api/start_starter.go | 27 +++++++++++++++++++++++++++ interface/grpc/core/start.go | 11 ++--------- 6 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 api/start.go create mode 100644 api/start_starter.go diff --git a/api/listen_event_listener.go b/api/listen_event_listener.go index 64ec89483..e00f8e376 100644 --- a/api/listen_event_listener.go +++ b/api/listen_event_listener.go @@ -27,7 +27,7 @@ type EventListener struct { api *API } -// newEventListener creates a new EventListener with given api. +// newEventListener creates a new EventListener with given api and filters. func newEventListener(api *API, filters ...ListenEventFilter) *EventListener { ln := &EventListener{ Events: make(chan *event.Event, 0), diff --git a/api/listen_result.go b/api/listen_result.go index 58c340398..7095711c4 100644 --- a/api/listen_result.go +++ b/api/listen_result.go @@ -10,7 +10,7 @@ func ListenResultTaskFilter(taskKey string) ListenResultFilter { } } -// ListenResultOutputFilter returns a outputKey filter. +// ListenResultOutputFilter returns an outputKey filter. func ListenResultOutputFilter(outputKey string) ListenResultFilter { return func(ln *ResultListener) { ln.outputKey = outputKey diff --git a/api/listen_result_listener.go b/api/listen_result_listener.go index 6e3aa0c62..22bb50887 100644 --- a/api/listen_result_listener.go +++ b/api/listen_result_listener.go @@ -29,7 +29,7 @@ type ResultListener struct { api *API } -// newResultListener creates a new ResultListener with given api. +// newResultListener creates a new ResultListener with given api and filters. func newResultListener(api *API, filters ...ListenResultFilter) *ResultListener { ln := &ResultListener{ Executions: make(chan *execution.Execution, 0), diff --git a/api/start.go b/api/start.go new file mode 100644 index 000000000..c83b40730 --- /dev/null +++ b/api/start.go @@ -0,0 +1,6 @@ +package api + +// StartService starts service serviceID. +func (a *API) StartService(serviceID string) error { + return newServiceStarter(a).Start(serviceID) +} diff --git a/api/start_starter.go b/api/start_starter.go new file mode 100644 index 000000000..f05193588 --- /dev/null +++ b/api/start_starter.go @@ -0,0 +1,27 @@ +package api + +import ( + "github.com/mesg-foundation/core/database/services" +) + +// serviceStarter provides functionalities to start a MESG service. +type serviceStarter struct { + api *API +} + +// newServiceStarter creates a new serviceStarter with given api. +func newServiceStarter(api *API) *serviceStarter { + return &serviceStarter{ + api: api, + } +} + +// Start starts service serviceID. +func (s *serviceStarter) Start(serviceID string) error { + service, err := services.Get(serviceID) + if err != nil { + return err + } + _, err = service.Start() + return err +} diff --git a/interface/grpc/core/start.go b/interface/grpc/core/start.go index 12b9c5d06..52b52f58a 100644 --- a/interface/grpc/core/start.go +++ b/interface/grpc/core/start.go @@ -2,16 +2,9 @@ package core import ( "context" - - "github.com/mesg-foundation/core/database/services" ) -// StartService fetches a service from the database and starts it. +// StartService starts a service. func (s *Server) StartService(ctx context.Context, request *StartServiceRequest) (*StartServiceReply, error) { - service, err := services.Get(request.ServiceID) - if err != nil { - return nil, err - } - _, err = service.Start() - return &StartServiceReply{}, err + return &StartServiceReply{}, s.api.StartService(request.ServiceID) } From e839bd93889052f89257a7e087bebdf959f996cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 10:02:34 +0300 Subject: [PATCH 09/24] move service stop logic from interface/grpc/core to api package --- api/stop.go | 6 ++++++ api/stop_stopper.go | 26 ++++++++++++++++++++++++++ interface/grpc/core/stop.go | 10 ++-------- 3 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 api/stop.go create mode 100644 api/stop_stopper.go diff --git a/api/stop.go b/api/stop.go new file mode 100644 index 000000000..5da5d31d0 --- /dev/null +++ b/api/stop.go @@ -0,0 +1,6 @@ +package api + +// StopService stops service serviceID. +func (a *API) StopService(serviceID string) error { + return newServiceStopper(a).Stop(serviceID) +} diff --git a/api/stop_stopper.go b/api/stop_stopper.go new file mode 100644 index 000000000..3bda8031c --- /dev/null +++ b/api/stop_stopper.go @@ -0,0 +1,26 @@ +package api + +import ( + "github.com/mesg-foundation/core/database/services" +) + +// serviceStopper provides functionalities to start a MESG service. +type serviceStopper struct { + api *API +} + +// newServiceStopper creates a new serviceStopper with given api. +func newServiceStopper(api *API) *serviceStopper { + return &serviceStopper{ + api: api, + } +} + +// Stop stops service serviceID. +func (s *serviceStopper) Stop(serviceID string) error { + service, err := services.Get(serviceID) + if err != nil { + return err + } + return service.Stop() +} diff --git a/interface/grpc/core/stop.go b/interface/grpc/core/stop.go index 561b0088d..081666893 100644 --- a/interface/grpc/core/stop.go +++ b/interface/grpc/core/stop.go @@ -2,15 +2,9 @@ package core import ( "context" - - "github.com/mesg-foundation/core/database/services" ) -// StopService fetches a service from the database and stops it. +// StopService stops a service. func (s *Server) StopService(ctx context.Context, request *StopServiceRequest) (*StopServiceReply, error) { - service, err := services.Get(request.ServiceID) - if err != nil { - return nil, err - } - return &StopServiceReply{}, service.Stop() + return &StopServiceReply{}, s.api.StopService(request.ServiceID) } From cba99ba6d6fc2cef8c0a01e132e8eee19771e96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 10:31:58 +0300 Subject: [PATCH 10/24] move event emit logic from interface/grpc/service to api package & make interface/grpc/service newable --- api/emit_event.go | 6 +++++ api/emit_event_emitter.go | 32 +++++++++++++++++++++++ interface/grpc/core/type.go | 2 +- interface/grpc/server.go | 7 ++++- interface/grpc/service/emit_event.go | 17 ++---------- interface/grpc/service/emit_event_test.go | 17 +++++++----- interface/grpc/service/service_test.go | 18 +++++++++++++ interface/grpc/service/type.go | 32 ++++++++++++++++++++++- 8 files changed, 106 insertions(+), 25 deletions(-) create mode 100644 api/emit_event.go create mode 100644 api/emit_event_emitter.go create mode 100644 interface/grpc/service/service_test.go diff --git a/api/emit_event.go b/api/emit_event.go new file mode 100644 index 000000000..875bd3c88 --- /dev/null +++ b/api/emit_event.go @@ -0,0 +1,6 @@ +package api + +// EmitEvent emits a MESG event eventKey with eventData for service token. +func (a *API) EmitEvent(token, eventKey string, eventData map[string]interface{}) error { + return newEventEmitter(a).Emit(token, eventKey, eventData) +} diff --git a/api/emit_event_emitter.go b/api/emit_event_emitter.go new file mode 100644 index 000000000..84666bf8f --- /dev/null +++ b/api/emit_event_emitter.go @@ -0,0 +1,32 @@ +package api + +import ( + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/event" +) + +// eventEmitter provides functionalities to emit a MESG event. +type eventEmitter struct { + api *API +} + +// newEventEmitter creates a new eventEmitter with given api. +func newEventEmitter(api *API) *eventEmitter { + return &eventEmitter{ + api: api, + } +} + +// Emit emits a MESG event eventKey with eventData for service token. +func (e *eventEmitter) Emit(token, eventKey string, eventData map[string]interface{}) error { + service, err := services.Get(token) + if err != nil { + return err + } + event, err := event.Create(&service, eventKey, eventData) + if err != nil { + return err + } + event.Publish() + return nil +} diff --git a/interface/grpc/core/type.go b/interface/grpc/core/type.go index e45e7fe3c..8c02b24d0 100644 --- a/interface/grpc/core/type.go +++ b/interface/grpc/core/type.go @@ -21,7 +21,7 @@ func NewServer(options ...Option) (*Server, error) { option(s) } if s.api == nil { - return nil, errors.New("mesg should be provided") + return nil, errors.New("api should be provided") } return s, nil } diff --git a/interface/grpc/server.go b/interface/grpc/server.go index 201f021fc..cdd6a8f42 100644 --- a/interface/grpc/server.go +++ b/interface/grpc/server.go @@ -76,7 +76,12 @@ func (s *Server) register() error { return err } - service.RegisterServiceServer(s.instance, &service.Server{}) + serviceServer, err := service.NewServer(service.APIOption(a)) + if err != nil { + return err + } + + service.RegisterServiceServer(s.instance, serviceServer) core.RegisterCoreServer(s.instance, coreServer) reflection.Register(s.instance) diff --git a/interface/grpc/service/emit_event.go b/interface/grpc/service/emit_event.go index c164a4d25..19d99ae6e 100644 --- a/interface/grpc/service/emit_event.go +++ b/interface/grpc/service/emit_event.go @@ -3,26 +3,13 @@ package service import ( "context" "encoding/json" - - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/event" ) // EmitEvent permits to send and event to anyone who subscribed to it. func (s *Server) EmitEvent(context context.Context, request *EmitEventRequest) (*EmitEventReply, error) { - service, err := services.Get(request.Token) - if err != nil { - return nil, err - } var data map[string]interface{} - err = json.Unmarshal([]byte(request.EventData), &data) - if err != nil { - return nil, err - } - event, err := event.Create(&service, request.EventKey, data) - if err != nil { + if err := json.Unmarshal([]byte(request.EventData), &data); err != nil { return nil, err } - event.Publish() - return &EmitEventReply{}, nil + return &EmitEventReply{}, s.api.EmitEvent(request.Token, request.EventKey, data) } diff --git a/interface/grpc/service/emit_event_test.go b/interface/grpc/service/emit_event_test.go index 022304ffb..d3b19ab58 100644 --- a/interface/grpc/service/emit_event_test.go +++ b/interface/grpc/service/emit_event_test.go @@ -10,9 +10,8 @@ import ( "github.com/stretchr/testify/require" ) -var serveremit = new(Server) - func TestEmit(t *testing.T) { + server := newServer(t) service := service.Service{ Name: "TestEmit", Events: map[string]*service.Event{ @@ -30,7 +29,7 @@ func TestEmit(t *testing.T) { subscription := pubsub.Subscribe(service.EventSubscriptionChannel()) - go serveremit.EmitEvent(context.Background(), &EmitEventRequest{ + go server.EmitEvent(context.Background(), &EmitEventRequest{ Token: service.Hash(), EventKey: "test", EventData: "{}", @@ -41,11 +40,12 @@ func TestEmit(t *testing.T) { } func TestEmitNoData(t *testing.T) { + server := newServer(t) service := service.Service{} services.Save(&service) service.Id = "" // TODO(ilgooz) remove this when Service type created by hand. defer services.Delete(service.Id) - _, err := serveremit.EmitEvent(context.Background(), &EmitEventRequest{ + _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ Token: service.Hash(), EventKey: "test", }) @@ -53,11 +53,12 @@ func TestEmitNoData(t *testing.T) { } func TestEmitWrongData(t *testing.T) { + server := newServer(t) service := service.Service{} services.Save(&service) service.Id = "" // TODO(ilgooz) remove this when Service type created by hand. defer services.Delete(service.Id) - _, err := serveremit.EmitEvent(context.Background(), &EmitEventRequest{ + _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ Token: service.Hash(), EventKey: "test", EventData: "", @@ -66,11 +67,12 @@ func TestEmitWrongData(t *testing.T) { } func TestEmitWrongEvent(t *testing.T) { + server := newServer(t) srv := service.Service{Name: "TestEmitWrongEvent"} services.Save(&srv) srv.Id = "" // TODO(ilgooz) remove this when Service type created by hand. defer services.Delete(srv.Id) - _, err := serveremit.EmitEvent(context.Background(), &EmitEventRequest{ + _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ Token: srv.Hash(), EventKey: "test", EventData: "{}", @@ -81,8 +83,9 @@ func TestEmitWrongEvent(t *testing.T) { } func TestServiceNotExists(t *testing.T) { + server := newServer(t) service := service.Service{Name: "TestServiceNotExists"} - _, err := serveremit.EmitEvent(context.Background(), &EmitEventRequest{ + _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ Token: service.Hash(), EventKey: "test", EventData: "{}", diff --git a/interface/grpc/service/service_test.go b/interface/grpc/service/service_test.go new file mode 100644 index 000000000..5f6766aa1 --- /dev/null +++ b/interface/grpc/service/service_test.go @@ -0,0 +1,18 @@ +package service + +import ( + "testing" + + "github.com/mesg-foundation/core/api" + "github.com/stretchr/testify/require" +) + +func newServer(t *testing.T) *Server { + a, err := api.New() + require.Nil(t, err) + + server, err := NewServer(APIOption(a)) + require.Nil(t, err) + + return server +} diff --git a/interface/grpc/service/type.go b/interface/grpc/service/type.go index c5d5ad039..92c9270d6 100644 --- a/interface/grpc/service/type.go +++ b/interface/grpc/service/type.go @@ -1,4 +1,34 @@ package service +import ( + "errors" + + "github.com/mesg-foundation/core/api" +) + // Server binds all api functions. -type Server struct{} +type Server struct { + api *api.API +} + +// Option is a configuration func for Server. +type Option func(*Server) + +// NewServer creates a new Server with given options. +func NewServer(options ...Option) (*Server, error) { + s := &Server{} + for _, option := range options { + option(s) + } + if s.api == nil { + return nil, errors.New("api should be provided") + } + return s, nil +} + +// APIOption sets underlying mesg API. +func APIOption(api *api.API) Option { + return func(s *Server) { + s.api = api + } +} From 844b060b2d131fd1d8b98d400c4293482a549245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 10:44:33 +0300 Subject: [PATCH 11/24] move task listen logic from interface/grpc/service to api package --- api/listen_task.go | 7 +++ api/listen_task_listener.go | 68 +++++++++++++++++++++++++++ interface/grpc/service/listen_task.go | 24 +++++----- 3 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 api/listen_task.go create mode 100644 api/listen_task_listener.go diff --git a/api/listen_task.go b/api/listen_task.go new file mode 100644 index 000000000..875e1d36f --- /dev/null +++ b/api/listen_task.go @@ -0,0 +1,7 @@ +package api + +// ListenTask listens tasks on service token. +func (a *API) ListenTask(token string) (*TaskListener, error) { + l := newTaskListener(a) + return l, l.listen(token) +} diff --git a/api/listen_task_listener.go b/api/listen_task_listener.go new file mode 100644 index 000000000..432e94215 --- /dev/null +++ b/api/listen_task_listener.go @@ -0,0 +1,68 @@ +package api + +import ( + "github.com/mesg-foundation/core/database/services" + "github.com/mesg-foundation/core/execution" + "github.com/mesg-foundation/core/pubsub" + "github.com/mesg-foundation/core/service" +) + +// TaskListener provides functionalities to listen MESG tasks. +type TaskListener struct { + // Executions receives matching executions for tasks. + Executions chan *execution.Execution + + // Err filled when task subscription finished with a failure. + Err chan error + + // cancel stops listening for tasks. + cancel chan struct{} + + api *API +} + +// newTaskListener creates a new TaskListener with given api. +func newTaskListener(api *API) *TaskListener { + return &TaskListener{ + Executions: make(chan *execution.Execution, 0), + Err: make(chan error, 1), + cancel: make(chan struct{}, 0), + api: api, + } +} + +// Close stops listening for tasks. +func (l *TaskListener) Close() error { + close(l.cancel) + return nil +} + +// listen listens tasks matches with service token. +func (l *TaskListener) listen(token string) error { + service, err := services.Get(token) + if err != nil { + return err + } + go l.listenLoop(&service) + return nil +} + +func (l *TaskListener) listenLoop(service *service.Service) { + channel := service.TaskSubscriptionChannel() + subscription := pubsub.Subscribe(channel) + defer pubsub.Unsubscribe(channel, subscription) + + for { + select { + case <-l.cancel: + return + + // TODO use e.Err when subscription fails. + // currently we don't need this but when pubsub refactored, we'll + // need to pass an error to Err chan. + case data := <-subscription: + execution := data.(*execution.Execution) + l.Executions <- execution + } + } +} diff --git a/interface/grpc/service/listen_task.go b/interface/grpc/service/listen_task.go index 62d49d484..2ae47bc72 100644 --- a/interface/grpc/service/listen_task.go +++ b/interface/grpc/service/listen_task.go @@ -2,31 +2,31 @@ package service import ( "encoding/json" - - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/execution" - "github.com/mesg-foundation/core/pubsub" ) // ListenTask creates a stream that will send data for every task to execute. func (s *Server) ListenTask(request *ListenTaskRequest, stream Service_ListenTaskServer) error { - service, err := services.Get(request.Token) + ln, err := s.api.ListenTask(request.Token) if err != nil { return err } + defer ln.Close() ctx := stream.Context() - channel := service.TaskSubscriptionChannel() - subscription := pubsub.Subscribe(channel) - defer pubsub.Unsubscribe(channel, subscription) - for { select { case <-ctx.Done(): return ctx.Err() - case data := <-subscription: - execution := data.(*execution.Execution) - inputs, _ := json.Marshal(execution.Inputs) + + case err := <-ln.Err: + return err + + case execution := <-ln.Executions: + inputs, err := json.Marshal(execution.Inputs) + if err != nil { + return err + } + if err := stream.Send(&TaskData{ ExecutionID: execution.ID, TaskKey: execution.Task, From 09cd6f2bbb6f6dedca73f4e3a3e69d485f01c401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 11:27:08 +0300 Subject: [PATCH 12/24] move result submit logic from interface/grpc/service to api package --- api/submit_result.go | 6 +++ api/submit_result_submitter.go | 39 +++++++++++++++++++ .../submit_result_submitter_test.go | 4 +- interface/grpc/service/error.go | 18 --------- interface/grpc/service/submit_result.go | 15 +------ interface/grpc/service/submit_result_test.go | 22 +++++------ 6 files changed, 60 insertions(+), 44 deletions(-) create mode 100644 api/submit_result.go create mode 100644 api/submit_result_submitter.go rename interface/grpc/service/error_test.go => api/submit_result_submitter_test.go (66%) delete mode 100644 interface/grpc/service/error.go diff --git a/api/submit_result.go b/api/submit_result.go new file mode 100644 index 000000000..e34eb7a75 --- /dev/null +++ b/api/submit_result.go @@ -0,0 +1,6 @@ +package api + +// SubmitResult submits results for executionID. +func (a *API) SubmitResult(executionID, outputKey string, outputData map[string]interface{}) error { + return newResultSubmitter(a).Submit(executionID, outputKey, outputData) +} diff --git a/api/submit_result_submitter.go b/api/submit_result_submitter.go new file mode 100644 index 000000000..4230c6055 --- /dev/null +++ b/api/submit_result_submitter.go @@ -0,0 +1,39 @@ +package api + +import ( + "fmt" + + "github.com/mesg-foundation/core/execution" +) + +// resultSubmitter provides functionalities to submit a MESG task result. +type resultSubmitter struct { + api *API +} + +// newResultSubmitter creates a new resultSubmitter with given api. +func newResultSubmitter(api *API) *resultSubmitter { + return &resultSubmitter{ + api: api, + } +} + +// Submit submits results for executionID. +func (s *resultSubmitter) Submit(executionID, outputKey string, outputData map[string]interface{}) error { + execution := execution.InProgress(executionID) + if execution == nil { + return &MissingExecutionError{ + ID: executionID, + } + } + return execution.Complete(outputKey, outputData) +} + +// MissingExecutionError is returned when corresponding execution doesn't exists. +type MissingExecutionError struct { + ID string +} + +func (e *MissingExecutionError) Error() string { + return fmt.Sprintf("Execution %q doesn't exists", e.ID) +} diff --git a/interface/grpc/service/error_test.go b/api/submit_result_submitter_test.go similarity index 66% rename from interface/grpc/service/error_test.go rename to api/submit_result_submitter_test.go index 524ca9ab5..0fd04ab10 100644 --- a/interface/grpc/service/error_test.go +++ b/api/submit_result_submitter_test.go @@ -1,4 +1,4 @@ -package service +package api import ( "testing" @@ -8,5 +8,5 @@ import ( func TestMissingExecutionError(t *testing.T) { e := MissingExecutionError{ID: "test"} - require.Equal(t, "Execution test doesn't exists", e.Error()) + require.Equal(t, `Execution "test" doesn't exists`, e.Error()) } diff --git a/interface/grpc/service/error.go b/interface/grpc/service/error.go deleted file mode 100644 index be1d7d055..000000000 --- a/interface/grpc/service/error.go +++ /dev/null @@ -1,18 +0,0 @@ -package service - -import ( - "strings" -) - -// MissingExecutionError is an error when an execution doesn't exists. -type MissingExecutionError struct { - ID string -} - -func (e *MissingExecutionError) Error() string { - return strings.Join([]string{ - "Execution", - e.ID, - "doesn't exists", - }, " ") -} diff --git a/interface/grpc/service/submit_result.go b/interface/grpc/service/submit_result.go index 4b80b67fb..de7908022 100644 --- a/interface/grpc/service/submit_result.go +++ b/interface/grpc/service/submit_result.go @@ -3,24 +3,13 @@ package service import ( "context" "encoding/json" - - "github.com/mesg-foundation/core/execution" ) -// SubmitResult subbmits results of an execution. +// SubmitResult submits results of an execution. func (s *Server) SubmitResult(context context.Context, request *SubmitResultRequest) (*SubmitResultReply, error) { - execution := execution.InProgress(request.ExecutionID) - if execution == nil { - return nil, &MissingExecutionError{ - ID: request.ExecutionID, - } - } var data map[string]interface{} if err := json.Unmarshal([]byte(request.OutputData), &data); err != nil { return nil, err } - if err := execution.Complete(request.OutputKey, data); err != nil { - return nil, err - } - return &SubmitResultReply{}, nil + return &SubmitResultReply{}, s.api.SubmitResult(request.ExecutionID, request.OutputKey, data) } diff --git a/interface/grpc/service/submit_result_test.go b/interface/grpc/service/submit_result_test.go index 3f4073a55..c96bedc04 100644 --- a/interface/grpc/service/submit_result_test.go +++ b/interface/grpc/service/submit_result_test.go @@ -4,13 +4,12 @@ import ( "context" "testing" + "github.com/mesg-foundation/core/api" "github.com/mesg-foundation/core/execution" "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -var serversubmit = new(Server) - func execute(name string) *execution.Execution { var inputs map[string]interface{} e, _ := execution.Create(&service.Service{ @@ -28,8 +27,9 @@ func execute(name string) *execution.Execution { } func TestSubmit(t *testing.T) { + server := newServer(t) execution := execute("TestSubmit") - reply, err := serversubmit.SubmitResult(context.Background(), &SubmitResultRequest{ + reply, err := server.SubmitResult(context.Background(), &SubmitResultRequest{ ExecutionID: execution.ID, OutputKey: "output", OutputData: "{}", @@ -40,8 +40,9 @@ func TestSubmit(t *testing.T) { } func TestSubmitWithInvalidJSON(t *testing.T) { + server := newServer(t) execution := execute("TestSubmitWithInvalidJSON") - _, err := serversubmit.SubmitResult(context.Background(), &SubmitResultRequest{ + _, err := server.SubmitResult(context.Background(), &SubmitResultRequest{ ExecutionID: execution.ID, OutputKey: "output", OutputData: "", @@ -51,13 +52,12 @@ func TestSubmitWithInvalidJSON(t *testing.T) { } func TestSubmitWithInvalidID(t *testing.T) { - _, err := serversubmit.SubmitResult(context.Background(), &SubmitResultRequest{ - ExecutionID: "xxxx", + server := newServer(t) + executionID := "xxxx" + _, err := server.SubmitResult(context.Background(), &SubmitResultRequest{ + ExecutionID: executionID, OutputKey: "output", - OutputData: "", + OutputData: "{}", }) - require.NotNil(t, err) - x, missingExecutionError := err.(*MissingExecutionError) - require.True(t, missingExecutionError) - require.Equal(t, "xxxx", x.ID) + require.Equal(t, &api.MissingExecutionError{ID: executionID}, err) } From acb71ceeb35701cc26ba4927ba7b6325225d3550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 17:18:28 +0300 Subject: [PATCH 13/24] [folder-structure-refactor-fix] update import paths and mesg name as api in needed places --- interface/grpc/client/client.go | 2 +- interface/grpc/client/service.go | 2 +- interface/grpc/client/task.go | 2 +- interface/grpc/client/task_test.go | 2 +- interface/grpc/client/types.go | 2 +- interface/grpc/client/wokflow.go | 2 +- interface/grpc/client/workflow_test.go | 2 +- interface/grpc/core/deploy.go | 8 ++++---- interface/grpc/core/deploy_test.go | 16 ++++++++-------- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/interface/grpc/client/client.go b/interface/grpc/client/client.go index e61faae53..d548fe7b7 100644 --- a/interface/grpc/client/client.go +++ b/interface/grpc/client/client.go @@ -3,8 +3,8 @@ package client import ( "sync" - "github.com/mesg-foundation/core/api/core" "github.com/mesg-foundation/core/config" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/spf13/viper" "google.golang.org/grpc" ) diff --git a/interface/grpc/client/service.go b/interface/grpc/client/service.go index e30e6ef88..be88aa117 100644 --- a/interface/grpc/client/service.go +++ b/interface/grpc/client/service.go @@ -3,7 +3,7 @@ package client import ( "context" - "github.com/mesg-foundation/core/api/core" + "github.com/mesg-foundation/core/interface/grpc/core" ) func (wf *Workflow) services() (services []string) { diff --git a/interface/grpc/client/task.go b/interface/grpc/client/task.go index bff44a287..e57d14a5c 100644 --- a/interface/grpc/client/task.go +++ b/interface/grpc/client/task.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" - "github.com/mesg-foundation/core/api/core" + "github.com/mesg-foundation/core/interface/grpc/core" ) func (task *Task) processEvent(wf *Workflow, data *core.EventData) (err error) { diff --git a/interface/grpc/client/task_test.go b/interface/grpc/client/task_test.go index 33018bdd0..24531b9fb 100644 --- a/interface/grpc/client/task_test.go +++ b/interface/grpc/client/task_test.go @@ -3,7 +3,7 @@ package client import ( "testing" - "github.com/mesg-foundation/core/api/core" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/stretchr/testify/require" ) diff --git a/interface/grpc/client/types.go b/interface/grpc/client/types.go index 37beb853a..62dc80a75 100644 --- a/interface/grpc/client/types.go +++ b/interface/grpc/client/types.go @@ -1,6 +1,6 @@ package client -import "github.com/mesg-foundation/core/api/core" +import "github.com/mesg-foundation/core/interface/grpc/core" // Workflow is a struct that contains all the details of // a workflow. A workflow contains an event source and diff --git a/interface/grpc/client/wokflow.go b/interface/grpc/client/wokflow.go index 05dce44f7..7ef93089a 100644 --- a/interface/grpc/client/wokflow.go +++ b/interface/grpc/client/wokflow.go @@ -5,7 +5,7 @@ import ( "errors" "strings" - "github.com/mesg-foundation/core/api/core" + "github.com/mesg-foundation/core/interface/grpc/core" ) // Start is the function to start the workflow diff --git a/interface/grpc/client/workflow_test.go b/interface/grpc/client/workflow_test.go index ae999f98a..7f5f5f844 100644 --- a/interface/grpc/client/workflow_test.go +++ b/interface/grpc/client/workflow_test.go @@ -3,7 +3,7 @@ package client import ( "testing" - "github.com/mesg-foundation/core/api/core" + "github.com/mesg-foundation/core/interface/grpc/core" "github.com/stretchr/testify/require" ) diff --git a/interface/grpc/core/deploy.go b/interface/grpc/core/deploy.go index 33544b450..dc9b9276c 100644 --- a/interface/grpc/core/deploy.go +++ b/interface/grpc/core/deploy.go @@ -9,7 +9,7 @@ import ( // DeployService deploys a service from Git URL or service.tar.gz file. It'll send status // events during the process and finish with sending service id or validation error. func (s *Server) DeployService(stream Core_DeployServiceServer) error { - statuses := make(chan mesg.DeployStatus, 0) + statuses := make(chan api.DeployStatus, 0) go sendDeployStatus(statuses, stream) var ( @@ -43,13 +43,13 @@ func (s *Server) DeployService(stream Core_DeployServiceServer) error { }) } -func sendDeployStatus(statuses chan mesg.DeployStatus, stream Core_DeployServiceServer) { +func sendDeployStatus(statuses chan api.DeployStatus, stream Core_DeployServiceServer) { for status := range statuses { var typ DeployServiceReply_Status_Type switch status.Type { - case mesg.RUNNING: + case api.RUNNING: typ = DeployServiceReply_Status_RUNNING - case mesg.DONE: + case api.DONE: typ = DeployServiceReply_Status_DONE } diff --git a/interface/grpc/core/deploy_test.go b/interface/grpc/core/deploy_test.go index fca5dc3ff..cb68503ea 100644 --- a/interface/grpc/core/deploy_test.go +++ b/interface/grpc/core/deploy_test.go @@ -8,7 +8,7 @@ import ( "github.com/cnf/structhash" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/mesg" + "github.com/mesg-foundation/core/api" "github.com/stretchr/testify/require" grpc "google.golang.org/grpc" ) @@ -23,9 +23,9 @@ func TestDeployService(t *testing.T) { require.Nil(t, server.DeployService(stream)) require.Equal(t, 1, structhash.Version(stream.serviceID)) - require.Contains(t, stream.statuses, mesg.DeployStatus{ + require.Contains(t, stream.statuses, api.DeployStatus{ Message: fmt.Sprintf("%s Completed.", aurora.Green("✔")), - Type: mesg.DONE, + Type: api.DONE, }) } @@ -34,7 +34,7 @@ type testDeployStream struct { url string // Git repo url. err error serviceID string - statuses []mesg.DeployStatus + statuses []api.DeployStatus grpc.ServerStream } @@ -47,14 +47,14 @@ func (s *testDeployStream) Send(m *DeployServiceReply) error { status := m.GetStatus() if status != nil { - var typ mesg.StatusType + var typ api.StatusType switch status.Type { case DeployServiceReply_Status_RUNNING: - typ = mesg.RUNNING + typ = api.RUNNING case DeployServiceReply_Status_DONE: - typ = mesg.DONE + typ = api.DONE } - s.statuses = append(s.statuses, mesg.DeployStatus{ + s.statuses = append(s.statuses, api.DeployStatus{ Message: status.Message, Type: typ, }) From 6c5adb200042f4462ee2d4f143f875519234ceae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 19:02:15 +0300 Subject: [PATCH 14/24] update proto paths in scripts/build-proto.sh --- scripts/build-proto.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build-proto.sh b/scripts/build-proto.sh index bf4b646de..cb86da257 100755 --- a/scripts/build-proto.sh +++ b/scripts/build-proto.sh @@ -11,5 +11,5 @@ DATA_DOCS="--doc_out=$CORE/docs/api/ --doc_opt=$CORE/docs/data.template" GRPC="--go_out=plugins=grpc:./" protoc $GRPC $DATA_DOCS,service-type.md --proto_path=./ $PROJECT/service/service.proto -protoc $GRPC $API_DOCS,core.md --proto_path=./ $PROJECT/api/core/api.proto -protoc $GRPC $API_DOCS,service.md --proto_path=./ $PROJECT/api/service/api.proto +protoc $GRPC $API_DOCS,core.md --proto_path=./ $PROJECT/interface/grpc/core/api.proto +protoc $GRPC $API_DOCS,service.md --proto_path=./ $PROJECT/interface/grpc/service/api.proto From 9eef3b91dcb9cd39a0c5b90b525d9d173328b582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Thu, 23 Aug 2018 21:51:21 +0300 Subject: [PATCH 15/24] cosmetic & comment updates on api package --- api/deploy.go | 6 ++- api/deploy_test.go | 89 +++++++++++++++++++++++++-------------------- api/stop_stopper.go | 2 +- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/api/deploy.go b/api/deploy.go index 32a0839f4..8cd6c34f4 100644 --- a/api/deploy.go +++ b/api/deploy.go @@ -18,7 +18,8 @@ func DeployServiceStatusOption(statuses chan DeployStatus) DeployServiceOption { } // DeployService deploys a service from a gzipped tarball. -func (a *API) DeployService(r io.Reader, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { +func (a *API) DeployService(r io.Reader, options ...DeployServiceOption) (*service.Service, + *importer.ValidationError, error) { return newServiceDeployer(a, options...).FromGzippedTar(r) } @@ -26,6 +27,7 @@ func (a *API) DeployService(r io.Reader, options ...DeployServiceOption) (*servi // Supported URL types: // - https://github.com/mesg-foundation/service-ethereum // - https://github.com/mesg-foundation/service-ethereum#branchName -func (a *API) DeployServiceFromURL(url string, options ...DeployServiceOption) (*service.Service, *importer.ValidationError, error) { +func (a *API) DeployServiceFromURL(url string, options ...DeployServiceOption) (*service.Service, + *importer.ValidationError, error) { return newServiceDeployer(a, options...).FromGitURL(url) } diff --git a/api/deploy_test.go b/api/deploy_test.go index b1346cc73..d93097714 100644 --- a/api/deploy_test.go +++ b/api/deploy_test.go @@ -38,25 +38,30 @@ func TestDeployService(t *testing.T) { require.Equal(t, 1, structhash.Version(service.Id)) }() - status := <-statuses - require.Equal(t, RUNNING, status.Type) - require.Equal(t, "Sending service context to core daemon...", status.Message) - - status = <-statuses - require.Equal(t, DONE, status.Type) - require.Equal(t, fmt.Sprintf("%s Service context sent to core daemon with success.", aurora.Green("✔")), status.Message) - - status = <-statuses - require.Equal(t, RUNNING, status.Type) - require.Equal(t, "Building Docker image...", status.Message) - - status = <-statuses - require.Equal(t, DONE, status.Type) - require.Equal(t, fmt.Sprintf("%s Image built with success.", aurora.Green("✔")), status.Message) - - status = <-statuses - require.Equal(t, DONE, status.Type) - require.Equal(t, fmt.Sprintf("%s Completed.", aurora.Green("✔")), status.Message) + require.Equal(t, DeployStatus{ + Message: "Sending service context to core daemon...", + Type: RUNNING, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: fmt.Sprintf("%s Service context sent to core daemon with success.", aurora.Green("✔")), + Type: DONE, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: "Building Docker image...", + Type: RUNNING, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: fmt.Sprintf("%s Image built with success.", aurora.Green("✔")), + Type: DONE, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: fmt.Sprintf("%s Completed.", aurora.Green("✔")), + Type: DONE, + }, <-statuses) wg.Wait() } @@ -86,7 +91,8 @@ func TestDeployInvalidService(t *testing.T) { }() require.Equal(t, "Sending service context to core daemon...", (<-statuses).Message) - require.Equal(t, fmt.Sprintf("%s Service context sent to core daemon with success.", aurora.Green("✔")), (<-statuses).Message) + require.Equal(t, fmt.Sprintf("%s Service context sent to core daemon with success.", aurora.Green("✔")), + (<-statuses).Message) select { case <-statuses: @@ -115,25 +121,30 @@ func TestDeployServiceFromURL(t *testing.T) { require.Equal(t, 1, structhash.Version(service.Id)) }() - status := <-statuses - require.Equal(t, RUNNING, status.Type) - require.Equal(t, "Downloading service...", status.Message) - - status = <-statuses - require.Equal(t, DONE, status.Type) - require.Equal(t, fmt.Sprintf("%s Service downloaded with success.", aurora.Green("✔")), status.Message) - - status = <-statuses - require.Equal(t, RUNNING, status.Type) - require.Equal(t, "Building Docker image...", status.Message) - - status = <-statuses - require.Equal(t, DONE, status.Type) - require.Equal(t, fmt.Sprintf("%s Image built with success.", aurora.Green("✔")), status.Message) - - status = <-statuses - require.Equal(t, DONE, status.Type) - require.Equal(t, fmt.Sprintf("%s Completed.", aurora.Green("✔")), status.Message) + require.Equal(t, DeployStatus{ + Message: "Downloading service...", + Type: RUNNING, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: fmt.Sprintf("%s Service downloaded with success.", aurora.Green("✔")), + Type: DONE, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: "Building Docker image...", + Type: RUNNING, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: fmt.Sprintf("%s Image built with success.", aurora.Green("✔")), + Type: DONE, + }, <-statuses) + + require.Equal(t, DeployStatus{ + Message: fmt.Sprintf("%s Completed.", aurora.Green("✔")), + Type: DONE, + }, <-statuses) wg.Wait() } diff --git a/api/stop_stopper.go b/api/stop_stopper.go index 3bda8031c..eae104173 100644 --- a/api/stop_stopper.go +++ b/api/stop_stopper.go @@ -4,7 +4,7 @@ import ( "github.com/mesg-foundation/core/database/services" ) -// serviceStopper provides functionalities to start a MESG service. +// serviceStopper provides functionalities to stop a MESG service. type serviceStopper struct { api *API } From ccece83bbd05ecd158b9505d3d4aa91b31036c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Fri, 24 Aug 2018 16:34:43 +0300 Subject: [PATCH 16/24] api: block ListenX functions until listenings started --- api/listen_event_listener.go | 14 ++++++++++---- api/listen_result_listener.go | 6 ++++++ api/listen_task_listener.go | 6 ++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/api/listen_event_listener.go b/api/listen_event_listener.go index e00f8e376..f96c109d7 100644 --- a/api/listen_event_listener.go +++ b/api/listen_event_listener.go @@ -21,6 +21,9 @@ type EventListener struct { // cancel stops listening for new events. cancel chan struct{} + // listening indicates if listening started + listening chan struct{} + // filters. eventKey string @@ -30,10 +33,11 @@ type EventListener struct { // newEventListener creates a new EventListener with given api and filters. func newEventListener(api *API, filters ...ListenEventFilter) *EventListener { ln := &EventListener{ - Events: make(chan *event.Event, 0), - Err: make(chan error, 1), - cancel: make(chan struct{}, 0), - api: api, + Events: make(chan *event.Event, 0), + Err: make(chan error, 1), + cancel: make(chan struct{}, 0), + listening: make(chan struct{}, 0), + api: api, } for _, filter := range filters { filter(ln) @@ -57,6 +61,7 @@ func (l *EventListener) listen(serviceID string) error { return err } go l.listenLoop(&service) + <-l.listening return nil } @@ -64,6 +69,7 @@ func (l *EventListener) listenLoop(service *service.Service) { channel := service.EventSubscriptionChannel() subscription := pubsub.Subscribe(channel) defer pubsub.Unsubscribe(channel, subscription) + close(l.listening) for { select { diff --git a/api/listen_result_listener.go b/api/listen_result_listener.go index 22bb50887..2d08d9e85 100644 --- a/api/listen_result_listener.go +++ b/api/listen_result_listener.go @@ -21,6 +21,9 @@ type ResultListener struct { // cancel stops listening for new results. cancel chan struct{} + // listening indicates if listening started + listening chan struct{} + // filters. taskKey string outputKey string @@ -35,6 +38,7 @@ func newResultListener(api *API, filters ...ListenResultFilter) *ResultListener Executions: make(chan *execution.Execution, 0), Err: make(chan error, 1), cancel: make(chan struct{}, 0), + listening: make(chan struct{}, 0), api: api, } for _, filter := range filters { @@ -59,6 +63,7 @@ func (l *ResultListener) listen(serviceID string) error { return err } go l.listenLoop(&service) + <-l.listening return nil } @@ -66,6 +71,7 @@ func (l *ResultListener) listenLoop(service *service.Service) { channel := service.ResultSubscriptionChannel() subscription := pubsub.Subscribe(channel) defer pubsub.Unsubscribe(channel, subscription) + close(l.listening) for { select { diff --git a/api/listen_task_listener.go b/api/listen_task_listener.go index 432e94215..a7ecd64a1 100644 --- a/api/listen_task_listener.go +++ b/api/listen_task_listener.go @@ -18,6 +18,9 @@ type TaskListener struct { // cancel stops listening for tasks. cancel chan struct{} + // listening indicates if listening started + listening chan struct{} + api *API } @@ -27,6 +30,7 @@ func newTaskListener(api *API) *TaskListener { Executions: make(chan *execution.Execution, 0), Err: make(chan error, 1), cancel: make(chan struct{}, 0), + listening: make(chan struct{}, 0), api: api, } } @@ -44,6 +48,7 @@ func (l *TaskListener) listen(token string) error { return err } go l.listenLoop(&service) + <-l.listening return nil } @@ -51,6 +56,7 @@ func (l *TaskListener) listenLoop(service *service.Service) { channel := service.TaskSubscriptionChannel() subscription := pubsub.Subscribe(channel) defer pubsub.Unsubscribe(channel, subscription) + close(l.listening) for { select { From b95dcb2c276684d3c8120b41d9261ffbb70bf207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Fri, 24 Aug 2018 16:34:49 +0300 Subject: [PATCH 17/24] interface/grpc: refactor tests to use features from api package --- interface/grpc/core/core_test.go | 22 +++- interface/grpc/core/delete_test.go | 26 ++-- .../grpc/core/deploy_integration_test.go | 9 +- interface/grpc/core/execute_test.go | 98 +++++++------- interface/grpc/core/get_service_test.go | 25 ++-- interface/grpc/core/list_services_test.go | 16 ++- .../grpc/core/service-test-event/Dockerfile | 6 + .../grpc/core/service-test-event/index.js | 4 + .../grpc/core/service-test-event/mesg.yml | 7 + .../grpc/core/service-test-event/package.json | 12 ++ .../grpc/core/service-test-task/Dockerfile | 6 + .../grpc/core/service-test-task/index.js | 4 + .../grpc/core/service-test-task/mesg.yml | 14 ++ .../grpc/core/service-test-task/package.json | 12 ++ interface/grpc/core/start_test.go | 34 ++--- interface/grpc/core/stop_test.go | 32 +++-- interface/grpc/service/emit_event_test.go | 123 ++++++++++-------- .../service/service-test-event/Dockerfile | 6 + .../grpc/service/service-test-event/index.js | 4 + .../grpc/service/service-test-event/mesg.yml | 7 + .../service/service-test-event/package.json | 12 ++ .../grpc/service/service-test-task/Dockerfile | 6 + .../grpc/service/service-test-task/index.js | 4 + .../grpc/service/service-test-task/mesg.yml | 14 ++ .../service/service-test-task/package.json | 12 ++ interface/grpc/service/service_test.go | 17 +++ interface/grpc/service/submit_result_test.go | 115 ++++++++++------ 27 files changed, 435 insertions(+), 212 deletions(-) create mode 100755 interface/grpc/core/service-test-event/Dockerfile create mode 100644 interface/grpc/core/service-test-event/index.js create mode 100644 interface/grpc/core/service-test-event/mesg.yml create mode 100644 interface/grpc/core/service-test-event/package.json create mode 100755 interface/grpc/core/service-test-task/Dockerfile create mode 100644 interface/grpc/core/service-test-task/index.js create mode 100644 interface/grpc/core/service-test-task/mesg.yml create mode 100644 interface/grpc/core/service-test-task/package.json create mode 100755 interface/grpc/service/service-test-event/Dockerfile create mode 100644 interface/grpc/service/service-test-event/index.js create mode 100644 interface/grpc/service/service-test-event/mesg.yml create mode 100644 interface/grpc/service/service-test-event/package.json create mode 100755 interface/grpc/service/service-test-task/Dockerfile create mode 100644 interface/grpc/service/service-test-task/index.js create mode 100644 interface/grpc/service/service-test-task/mesg.yml create mode 100644 interface/grpc/service/service-test-task/package.json diff --git a/interface/grpc/core/core_test.go b/interface/grpc/core/core_test.go index 6ec7311a3..f7a2da522 100644 --- a/interface/grpc/core/core_test.go +++ b/interface/grpc/core/core_test.go @@ -1,8 +1,10 @@ package core import ( + "io" "testing" + "github.com/docker/docker/pkg/archive" "github.com/mesg-foundation/core/api" "github.com/mesg-foundation/core/container" "github.com/mesg-foundation/core/container/dockertest" @@ -11,13 +13,13 @@ import ( func newServer(t *testing.T) *Server { container, err := container.New() - require.Nil(t, err) + require.NoError(t, err) a, err := api.New(api.ContainerOption(container)) - require.Nil(t, err) + require.NoError(t, err) server, err := NewServer(APIOption(a)) - require.Nil(t, err) + require.NoError(t, err) return server } @@ -26,13 +28,21 @@ func newServerAndDockerTest(t *testing.T) (*Server, *dockertest.Testing) { dt := dockertest.New() container, err := container.New(container.ClientOption(dt.Client())) - require.Nil(t, err) + require.NoError(t, err) a, err := api.New(api.ContainerOption(container)) - require.Nil(t, err) + require.NoError(t, err) server, err := NewServer(APIOption(a)) - require.Nil(t, err) + require.NoError(t, err) return server, dt } + +func serviceTar(t *testing.T, path string) io.Reader { + reader, err := archive.TarWithOptions(path, &archive.TarOptions{ + Compression: archive.Gzip, + }) + require.NoError(t, err) + return reader +} diff --git a/interface/grpc/core/delete_test.go b/interface/grpc/core/delete_test.go index 9372e439e..e97503004 100644 --- a/interface/grpc/core/delete_test.go +++ b/interface/grpc/core/delete_test.go @@ -4,27 +4,25 @@ import ( "context" "testing" - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -var serverdelete = new(Server) - func TestDeleteService(t *testing.T) { - emptyService := service.Service{} - - url := "https://github.com/mesg-foundation/service-webhook" + var ( + path = "./service-test-task" + server = newServer(t) + ) - server := newServer(t) - stream := newTestDeployStream(url) - server.DeployService(stream) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) - reply, err := serverdelete.DeleteService(context.Background(), &DeleteServiceRequest{ - ServiceID: stream.serviceID, + reply, err := server.DeleteService(context.Background(), &DeleteServiceRequest{ + ServiceID: s.Id, }) require.Nil(t, err) require.NotNil(t, reply) - x, _ := services.Get(stream.serviceID) - require.Equal(t, emptyService, x) + + _, err = server.api.GetService(s.Id) + require.Error(t, err) } diff --git a/interface/grpc/core/deploy_integration_test.go b/interface/grpc/core/deploy_integration_test.go index 8b3dfb444..04a94f57d 100644 --- a/interface/grpc/core/deploy_integration_test.go +++ b/interface/grpc/core/deploy_integration_test.go @@ -8,8 +8,7 @@ import ( "github.com/cnf/structhash" "github.com/logrusorgru/aurora" - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/mesg" + "github.com/mesg-foundation/core/api" "github.com/stretchr/testify/require" ) @@ -20,11 +19,11 @@ func TestIntegrationDeployService(t *testing.T) { stream := newTestDeployStream(url) require.Nil(t, server.DeployService(stream)) - defer services.Delete(stream.serviceID) + defer server.api.DeleteService(stream.serviceID) require.Equal(t, 1, structhash.Version(stream.serviceID)) - require.Contains(t, stream.statuses, mesg.DeployStatus{ + require.Contains(t, stream.statuses, api.DeployStatus{ Message: fmt.Sprintf("%s Completed.", aurora.Green("✔")), - Type: mesg.DONE, + Type: api.DONE, }) } diff --git a/interface/grpc/core/execute_test.go b/interface/grpc/core/execute_test.go index 5866bc577..dff642169 100644 --- a/interface/grpc/core/execute_test.go +++ b/interface/grpc/core/execute_test.go @@ -5,110 +5,104 @@ import ( "testing" "github.com/mesg-foundation/core/api" - "github.com/mesg-foundation/core/database/services" "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -var serverexecute = new(Server) - func TestExecute(t *testing.T) { var ( - url = "https://github.com/mesg-foundation/service-webhook" + path = "./service-test-task" taskKey = "call" data = `{"url": "https://mesg.tech", "data": {}, "headers": {}}` + server = newServer(t) ) - server := newServer(t) - stream := newTestDeployStream(url) - - server.DeployService(stream) - defer services.Delete(stream.serviceID) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - serverexecute.StartService(context.Background(), &StartServiceRequest{ - ServiceID: stream.serviceID, - }) - defer serverexecute.StopService(context.Background(), &StopServiceRequest{ - ServiceID: stream.serviceID, - }) + require.NoError(t, server.api.StartService(s.Id)) + defer server.api.StopService(s.Id) - reply, err := serverexecute.ExecuteTask(context.Background(), &ExecuteTaskRequest{ - ServiceID: stream.serviceID, + reply, err := server.ExecuteTask(context.Background(), &ExecuteTaskRequest{ + ServiceID: s.Id, TaskKey: taskKey, InputData: data, }) - require.Nil(t, err) require.NotEqual(t, "", reply.ExecutionID) } func TestExecuteWithInvalidJSON(t *testing.T) { - url := "https://github.com/mesg-foundation/service-webhook" + var ( + path = "./service-test-task" + server = newServer(t) + ) - server := newServer(t) - stream := newTestDeployStream(url) - server.DeployService(stream) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - _, err := serverexecute.ExecuteTask(context.Background(), &ExecuteTaskRequest{ - ServiceID: stream.serviceID, + _, err = server.ExecuteTask(context.Background(), &ExecuteTaskRequest{ + ServiceID: s.Id, TaskKey: "test", InputData: "", }) require.NotNil(t, err) require.Equal(t, err.Error(), "unexpected end of JSON input") - services.Delete(stream.serviceID) } func TestExecuteWithInvalidTask(t *testing.T) { - url := "https://github.com/mesg-foundation/service-webhook" - - server := newServer(t) - stream := newTestDeployStream(url) + var ( + path = "./service-test-task" + server = newServer(t) + ) - server.DeployService(stream) - defer services.Delete(stream.serviceID) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - serverexecute.StartService(context.Background(), &StartServiceRequest{ - ServiceID: stream.serviceID, - }) - defer serverexecute.StopService(context.Background(), &StopServiceRequest{ - ServiceID: stream.serviceID, - }) + require.NoError(t, server.api.StartService(s.Id)) + defer server.api.StopService(s.Id) - _, err := serverexecute.ExecuteTask(context.Background(), &ExecuteTaskRequest{ - ServiceID: stream.serviceID, + _, err = server.ExecuteTask(context.Background(), &ExecuteTaskRequest{ + ServiceID: s.Id, TaskKey: "error", InputData: "{}", }) - require.Error(t, err) require.IsType(t, (*service.TaskNotFoundError)(nil), err) } func TestExecuteWithNonRunningService(t *testing.T) { - url := "https://github.com/mesg-foundation/service-webhook" - - server := newServer(t) - stream := newTestDeployStream(url) + var ( + path = "./service-test-task" + server = newServer(t) + ) - server.DeployService(stream) - defer services.Delete(stream.serviceID) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - _, err := serverexecute.ExecuteTask(context.Background(), &ExecuteTaskRequest{ - ServiceID: stream.serviceID, + _, err = server.ExecuteTask(context.Background(), &ExecuteTaskRequest{ + ServiceID: s.Id, TaskKey: "test", InputData: "{}", }) - - require.Equal(t, &api.NotRunningServiceError{ServiceID: stream.serviceID}, err) + require.Equal(t, &api.NotRunningServiceError{ServiceID: s.Id}, err) } func TestExecuteWithNonExistingService(t *testing.T) { - _, err := serverexecute.ExecuteTask(context.Background(), &ExecuteTaskRequest{ + server := newServer(t) + + _, err := server.ExecuteTask(context.Background(), &ExecuteTaskRequest{ ServiceID: "service that doesnt exists", TaskKey: "error", InputData: "{}", }) - require.NotNil(t, err) } diff --git a/interface/grpc/core/get_service_test.go b/interface/grpc/core/get_service_test.go index 75813ecde..c2f9266bc 100644 --- a/interface/grpc/core/get_service_test.go +++ b/interface/grpc/core/get_service_test.go @@ -4,23 +4,24 @@ import ( "context" "testing" - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -var servergetservice = new(Server) - func TestGetService(t *testing.T) { - service := &service.Service{ - Name: "TestGetService", - } - services.Save(service) - defer services.Delete(service.Id) - reply, err := servergetservice.GetService(context.Background(), &GetServiceRequest{ - ServiceID: service.Id, + var ( + path = "./service-test-task" + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) + + reply, err := server.GetService(context.Background(), &GetServiceRequest{ + ServiceID: s.Id, }) require.Nil(t, err) require.NotNil(t, reply) - require.Equal(t, reply.Service.Name, "TestGetService") + require.Equal(t, reply.Service.Name, "Task") } diff --git a/interface/grpc/core/list_services_test.go b/interface/grpc/core/list_services_test.go index 8d7609d1f..cca4d862b 100644 --- a/interface/grpc/core/list_services_test.go +++ b/interface/grpc/core/list_services_test.go @@ -4,15 +4,17 @@ import ( "context" "testing" - "github.com/mesg-foundation/core/database/services" "github.com/stretchr/testify/require" ) -var serverlistservices = new(Server) - func TestListServices(t *testing.T) { - servicesFromAPI, err := serverlistservices.ListServices(context.Background(), &ListServicesRequest{}) - servicesFromDB, _ := services.All() - require.Nil(t, err) - require.Equal(t, len(servicesFromAPI.Services), len(servicesFromDB)) + server := newServer(t) + + reply, err := server.ListServices(context.Background(), &ListServicesRequest{}) + require.NoError(t, err) + + services, err := server.api.ListServices() + require.NoError(t, err) + + require.Equal(t, services, reply.Services) } diff --git a/interface/grpc/core/service-test-event/Dockerfile b/interface/grpc/core/service-test-event/Dockerfile new file mode 100755 index 000000000..4989c3ed3 --- /dev/null +++ b/interface/grpc/core/service-test-event/Dockerfile @@ -0,0 +1,6 @@ +FROM node:10.6.0-alpine +WORKDIR /app +COPY ./package* ./ +RUN npm install +COPY . . +CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/interface/grpc/core/service-test-event/index.js b/interface/grpc/core/service-test-event/index.js new file mode 100644 index 000000000..8544ffa04 --- /dev/null +++ b/interface/grpc/core/service-test-event/index.js @@ -0,0 +1,4 @@ +const MESG = require('mesg-js').service(); +const app = require('express')(); + +app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/core/service-test-event/mesg.yml b/interface/grpc/core/service-test-event/mesg.yml new file mode 100644 index 000000000..0a06c9ce4 --- /dev/null +++ b/interface/grpc/core/service-test-event/mesg.yml @@ -0,0 +1,7 @@ +name: Event +description: "A service that only has events definition" +events: + request: + data: + data: + type: Object \ No newline at end of file diff --git a/interface/grpc/core/service-test-event/package.json b/interface/grpc/core/service-test-event/package.json new file mode 100644 index 000000000..3e39611a8 --- /dev/null +++ b/interface/grpc/core/service-test-event/package.json @@ -0,0 +1,12 @@ +{ + "name": "webhook", + "version": "1.0.0", + "description": "Receive HTTP connections and emit events with the data", + "main": "index.js", + "author": "Anthony Estebe ", + "license": "ISC", + "dependencies": { + "express": "^4.16.3", + "mesg-js": "^1.2.1" + } +} diff --git a/interface/grpc/core/service-test-task/Dockerfile b/interface/grpc/core/service-test-task/Dockerfile new file mode 100755 index 000000000..4989c3ed3 --- /dev/null +++ b/interface/grpc/core/service-test-task/Dockerfile @@ -0,0 +1,6 @@ +FROM node:10.6.0-alpine +WORKDIR /app +COPY ./package* ./ +RUN npm install +COPY . . +CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/interface/grpc/core/service-test-task/index.js b/interface/grpc/core/service-test-task/index.js new file mode 100644 index 000000000..8544ffa04 --- /dev/null +++ b/interface/grpc/core/service-test-task/index.js @@ -0,0 +1,4 @@ +const MESG = require('mesg-js').service(); +const app = require('express')(); + +app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/core/service-test-task/mesg.yml b/interface/grpc/core/service-test-task/mesg.yml new file mode 100644 index 000000000..feb6a7a99 --- /dev/null +++ b/interface/grpc/core/service-test-task/mesg.yml @@ -0,0 +1,14 @@ +name: Task +description: "A service that only has tasks definition" +tasks: + call: + inputs: + url: + type: String + data: + type: Object + headers: + type: Object + outputs: + result: + data: {} \ No newline at end of file diff --git a/interface/grpc/core/service-test-task/package.json b/interface/grpc/core/service-test-task/package.json new file mode 100644 index 000000000..3e39611a8 --- /dev/null +++ b/interface/grpc/core/service-test-task/package.json @@ -0,0 +1,12 @@ +{ + "name": "webhook", + "version": "1.0.0", + "description": "Receive HTTP connections and emit events with the data", + "main": "index.js", + "author": "Anthony Estebe ", + "license": "ISC", + "dependencies": { + "express": "^4.16.3", + "mesg-js": "^1.2.1" + } +} diff --git a/interface/grpc/core/start_test.go b/interface/grpc/core/start_test.go index 572b26286..1a44f734a 100644 --- a/interface/grpc/core/start_test.go +++ b/interface/grpc/core/start_test.go @@ -4,28 +4,32 @@ import ( "context" "testing" - "github.com/mesg-foundation/core/database/services" "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -var serverstart = new(Server) - func TestStartService(t *testing.T) { - url := "https://github.com/mesg-foundation/service-webhook" + var ( + // we use a test service without tasks definition here otherwise we need to + // spin up the gRPC server in order to prevent service exit with failer because + // it'll try to listen for tasks. + path = "./service-test-event" + server = newServer(t) + ) - server := newServer(t) - stream := newTestDeployStream(url) - server.DeployService(stream) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - s, _ := services.Get(stream.serviceID) - reply, err := serverstart.StartService(context.Background(), &StartServiceRequest{ - ServiceID: stream.serviceID, + _, err = server.StartService(context.Background(), &StartServiceRequest{ + ServiceID: s.Id, }) - require.Nil(t, err) - status, _ := s.Status() + require.NoError(t, err) + defer server.api.StopService(s.Id) + + s.Id = "" // TODO(ilgooz) remove this when Service type created by hand. + status, err := s.Status() + require.NoError(t, err) require.Equal(t, service.RUNNING, status) - require.NotNil(t, reply) - s.Stop() - services.Delete(stream.serviceID) } diff --git a/interface/grpc/core/stop_test.go b/interface/grpc/core/stop_test.go index b1c6c3457..7d36ecd1f 100644 --- a/interface/grpc/core/stop_test.go +++ b/interface/grpc/core/stop_test.go @@ -4,28 +4,34 @@ import ( "context" "testing" - "github.com/mesg-foundation/core/database/services" "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -var serverstop = new(Server) - func TestStopService(t *testing.T) { - url := "https://github.com/mesg-foundation/service-webhook" + var ( + // we use a test service without tasks definition here otherwise we need to + // spin up the gRPC server in order to prevent service exit with failer because + // it'll try to listen for tasks. + path = "./service-test-event" + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - server := newServer(t) - stream := newTestDeployStream(url) - server.DeployService(stream) + require.NoError(t, server.api.StartService(s.Id)) - s, _ := services.Get(stream.serviceID) - s.Start() - reply, err := serverstop.StopService(context.Background(), &StopServiceRequest{ - ServiceID: stream.serviceID, + reply, err := server.StopService(context.Background(), &StopServiceRequest{ + ServiceID: s.Id, }) - status, _ := s.Status() + + s.Id = "" // TODO(ilgooz) remove this when Service type created by hand. + status, err := s.Status() + require.NoError(t, err) require.Equal(t, service.STOPPED, status) require.Nil(t, err) require.NotNil(t, reply) - services.Delete(stream.serviceID) } diff --git a/interface/grpc/service/emit_event_test.go b/interface/grpc/service/emit_event_test.go index d3b19ab58..df1aee245 100644 --- a/interface/grpc/service/emit_event_test.go +++ b/interface/grpc/service/emit_event_test.go @@ -4,89 +4,110 @@ import ( "context" "testing" - "github.com/mesg-foundation/core/database/services" - "github.com/mesg-foundation/core/pubsub" "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) func TestEmit(t *testing.T) { - server := newServer(t) - service := service.Service{ - Name: "TestEmit", - Events: map[string]*service.Event{ - "test": {}, - }, - Dependencies: map[string]*service.Dependency{ - "test": { - Image: "nginx", - }, - }, - } - services.Save(&service) - service.Id = "" // TODO(ilgooz) remove this when Service type created by hand. - defer services.Delete(service.Id) + var ( + path = "./service-test-event" + eventKey = "request" + eventData = `{"data":{}}` + server = newServer(t) + ) - subscription := pubsub.Subscribe(service.EventSubscriptionChannel()) + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) - go server.EmitEvent(context.Background(), &EmitEventRequest{ - Token: service.Hash(), - EventKey: "test", - EventData: "{}", + ln, err := server.api.ListenEvent(s.Id) + require.NoError(t, err) + defer ln.Close() + + _, err = server.EmitEvent(context.Background(), &EmitEventRequest{ + Token: s.Id, + EventKey: eventKey, + EventData: eventData, }) + require.NoError(t, err) + + select { + case err := <-ln.Err: + t.Error(err) + + case event := <-ln.Events: + require.Equal(t, eventKey, event.Key) + require.Equal(t, eventData, jsonMarshal(t, event.Data)) + } - res := <-subscription - require.NotNil(t, res) } func TestEmitNoData(t *testing.T) { - server := newServer(t) - service := service.Service{} - services.Save(&service) - service.Id = "" // TODO(ilgooz) remove this when Service type created by hand. - defer services.Delete(service.Id) - _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ - Token: service.Hash(), - EventKey: "test", + var ( + path = "./service-test-event" + eventKey = "request" + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) + + _, err = server.EmitEvent(context.Background(), &EmitEventRequest{ + Token: s.Id, + EventKey: eventKey, }) require.Equal(t, err.Error(), "unexpected end of JSON input") } func TestEmitWrongData(t *testing.T) { - server := newServer(t) - service := service.Service{} - services.Save(&service) - service.Id = "" // TODO(ilgooz) remove this when Service type created by hand. - defer services.Delete(service.Id) - _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ - Token: service.Hash(), - EventKey: "test", + var ( + path = "./service-test-event" + eventKey = "request" + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) + + _, err = server.EmitEvent(context.Background(), &EmitEventRequest{ + Token: s.Id, + EventKey: eventKey, EventData: "", }) require.Equal(t, err.Error(), "unexpected end of JSON input") } func TestEmitWrongEvent(t *testing.T) { - server := newServer(t) - srv := service.Service{Name: "TestEmitWrongEvent"} - services.Save(&srv) - srv.Id = "" // TODO(ilgooz) remove this when Service type created by hand. - defer services.Delete(srv.Id) - _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ - Token: srv.Hash(), - EventKey: "test", + var ( + path = "./service-test-event" + eventKey = "test" + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) + + _, err = server.EmitEvent(context.Background(), &EmitEventRequest{ + Token: s.Id, + EventKey: eventKey, EventData: "{}", }) - require.NotNil(t, err) + require.Error(t, err) _, notFound := err.(*service.EventNotFoundError) require.True(t, notFound) } func TestServiceNotExists(t *testing.T) { server := newServer(t) - service := service.Service{Name: "TestServiceNotExists"} _, err := server.EmitEvent(context.Background(), &EmitEventRequest{ - Token: service.Hash(), + Token: "TestServiceNotExists", EventKey: "test", EventData: "{}", }) diff --git a/interface/grpc/service/service-test-event/Dockerfile b/interface/grpc/service/service-test-event/Dockerfile new file mode 100755 index 000000000..4989c3ed3 --- /dev/null +++ b/interface/grpc/service/service-test-event/Dockerfile @@ -0,0 +1,6 @@ +FROM node:10.6.0-alpine +WORKDIR /app +COPY ./package* ./ +RUN npm install +COPY . . +CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/interface/grpc/service/service-test-event/index.js b/interface/grpc/service/service-test-event/index.js new file mode 100644 index 000000000..8544ffa04 --- /dev/null +++ b/interface/grpc/service/service-test-event/index.js @@ -0,0 +1,4 @@ +const MESG = require('mesg-js').service(); +const app = require('express')(); + +app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/service/service-test-event/mesg.yml b/interface/grpc/service/service-test-event/mesg.yml new file mode 100644 index 000000000..0a06c9ce4 --- /dev/null +++ b/interface/grpc/service/service-test-event/mesg.yml @@ -0,0 +1,7 @@ +name: Event +description: "A service that only has events definition" +events: + request: + data: + data: + type: Object \ No newline at end of file diff --git a/interface/grpc/service/service-test-event/package.json b/interface/grpc/service/service-test-event/package.json new file mode 100644 index 000000000..3e39611a8 --- /dev/null +++ b/interface/grpc/service/service-test-event/package.json @@ -0,0 +1,12 @@ +{ + "name": "webhook", + "version": "1.0.0", + "description": "Receive HTTP connections and emit events with the data", + "main": "index.js", + "author": "Anthony Estebe ", + "license": "ISC", + "dependencies": { + "express": "^4.16.3", + "mesg-js": "^1.2.1" + } +} diff --git a/interface/grpc/service/service-test-task/Dockerfile b/interface/grpc/service/service-test-task/Dockerfile new file mode 100755 index 000000000..4989c3ed3 --- /dev/null +++ b/interface/grpc/service/service-test-task/Dockerfile @@ -0,0 +1,6 @@ +FROM node:10.6.0-alpine +WORKDIR /app +COPY ./package* ./ +RUN npm install +COPY . . +CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/interface/grpc/service/service-test-task/index.js b/interface/grpc/service/service-test-task/index.js new file mode 100644 index 000000000..8544ffa04 --- /dev/null +++ b/interface/grpc/service/service-test-task/index.js @@ -0,0 +1,4 @@ +const MESG = require('mesg-js').service(); +const app = require('express')(); + +app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/service/service-test-task/mesg.yml b/interface/grpc/service/service-test-task/mesg.yml new file mode 100644 index 000000000..feb6a7a99 --- /dev/null +++ b/interface/grpc/service/service-test-task/mesg.yml @@ -0,0 +1,14 @@ +name: Task +description: "A service that only has tasks definition" +tasks: + call: + inputs: + url: + type: String + data: + type: Object + headers: + type: Object + outputs: + result: + data: {} \ No newline at end of file diff --git a/interface/grpc/service/service-test-task/package.json b/interface/grpc/service/service-test-task/package.json new file mode 100644 index 000000000..3e39611a8 --- /dev/null +++ b/interface/grpc/service/service-test-task/package.json @@ -0,0 +1,12 @@ +{ + "name": "webhook", + "version": "1.0.0", + "description": "Receive HTTP connections and emit events with the data", + "main": "index.js", + "author": "Anthony Estebe ", + "license": "ISC", + "dependencies": { + "express": "^4.16.3", + "mesg-js": "^1.2.1" + } +} diff --git a/interface/grpc/service/service_test.go b/interface/grpc/service/service_test.go index 5f6766aa1..44629155f 100644 --- a/interface/grpc/service/service_test.go +++ b/interface/grpc/service/service_test.go @@ -1,8 +1,11 @@ package service import ( + "encoding/json" + "io" "testing" + "github.com/docker/docker/pkg/archive" "github.com/mesg-foundation/core/api" "github.com/stretchr/testify/require" ) @@ -16,3 +19,17 @@ func newServer(t *testing.T) *Server { return server } + +func serviceTar(t *testing.T, path string) io.Reader { + reader, err := archive.TarWithOptions(path, &archive.TarOptions{ + Compression: archive.Gzip, + }) + require.NoError(t, err) + return reader +} + +func jsonMarshal(t *testing.T, data interface{}) string { + bytes, err := json.Marshal(data) + require.NoError(t, err) + return string(bytes) +} diff --git a/interface/grpc/service/submit_result_test.go b/interface/grpc/service/submit_result_test.go index c96bedc04..26bd87ba6 100644 --- a/interface/grpc/service/submit_result_test.go +++ b/interface/grpc/service/submit_result_test.go @@ -5,59 +5,100 @@ import ( "testing" "github.com/mesg-foundation/core/api" - "github.com/mesg-foundation/core/execution" - "github.com/mesg-foundation/core/service" "github.com/stretchr/testify/require" ) -func execute(name string) *execution.Execution { - var inputs map[string]interface{} - e, _ := execution.Create(&service.Service{ - Name: name, - Tasks: map[string]*service.Task{ - "test": { - Outputs: map[string]*service.Output{ - "output": {}, - }, - }, - }, - }, "test", inputs, []string{}) - e.Execute() - return e -} +func TestSubmitA(t *testing.T) { + var ( + path = "./service-test-task" + taskKey = "call" + taskData = map[string]interface{}{ + "url": "https://mesg.tech", + "data": map[string]interface{}{}, + "headers": map[string]interface{}{}, + } + outputKey = "result" + outputData = `{"data1":{}}` + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) + + require.NoError(t, server.api.StartService(s.Id)) + defer server.api.StopService(s.Id) + + executionID, err := server.api.ExecuteTask(s.Id, taskKey, taskData, nil) + require.NoError(t, err) -func TestSubmit(t *testing.T) { - server := newServer(t) - execution := execute("TestSubmit") - reply, err := server.SubmitResult(context.Background(), &SubmitResultRequest{ - ExecutionID: execution.ID, - OutputKey: "output", - OutputData: "{}", + ln, err := server.api.ListenResult(s.Id) + require.NoError(t, err) + defer ln.Close() + + _, err = server.SubmitResult(context.Background(), &SubmitResultRequest{ + ExecutionID: executionID, + OutputKey: outputKey, + OutputData: outputData, }) + require.NoError(t, err) - require.Nil(t, err) - require.NotNil(t, reply) + select { + case err := <-ln.Err: + t.Error(err) + + case execution := <-ln.Executions: + require.Equal(t, executionID, execution.ID) + require.Equal(t, outputKey, execution.Output) + require.Equal(t, outputData, jsonMarshal(t, execution.OutputData)) + } } func TestSubmitWithInvalidJSON(t *testing.T) { - server := newServer(t) - execution := execute("TestSubmitWithInvalidJSON") - _, err := server.SubmitResult(context.Background(), &SubmitResultRequest{ - ExecutionID: execution.ID, - OutputKey: "output", + var ( + path = "./service-test-task" + taskKey = "call" + taskData = map[string]interface{}{ + "url": "https://mesg.tech", + "data": map[string]interface{}{}, + "headers": map[string]interface{}{}, + } + outputKey = "result" + server = newServer(t) + ) + + s, validationErr, err := server.api.DeployService(serviceTar(t, path)) + require.Zero(t, validationErr) + require.NoError(t, err) + defer server.api.DeleteService(s.Id) + + require.NoError(t, server.api.StartService(s.Id)) + defer server.api.StopService(s.Id) + + executionID, err := server.api.ExecuteTask(s.Id, taskKey, taskData, nil) + require.NoError(t, err) + + _, err = server.SubmitResult(context.Background(), &SubmitResultRequest{ + ExecutionID: executionID, + OutputKey: outputKey, OutputData: "", }) - - require.NotNil(t, err) + require.Equal(t, err.Error(), "unexpected end of JSON input") } func TestSubmitWithInvalidID(t *testing.T) { - server := newServer(t) - executionID := "xxxx" + var ( + outputKey = "output" + outputData = "{}" + executionID = "1" + server = newServer(t) + ) + _, err := server.SubmitResult(context.Background(), &SubmitResultRequest{ ExecutionID: executionID, - OutputKey: "output", - OutputData: "{}", + OutputKey: outputKey, + OutputData: outputData, }) require.Equal(t, &api.MissingExecutionError{ID: executionID}, err) } From 2546bd5b10403e6636957367516c1f2c5b51248a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Fri, 24 Aug 2018 18:14:44 +0300 Subject: [PATCH 18/24] add comments to dev-core script --- dev-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-core b/dev-core index fcc299f74..aeef7053d 100755 --- a/dev-core +++ b/dev-core @@ -1,9 +1,9 @@ #!/bin/bash - echo "Building mesg/core:local..." docker build -t mesg/core:local --build-arg version="local" . +# chain these to stop execution on failure ./dev-cli stop && \ ./dev-cli start && \ ./dev-cli logs From df406f21d310f9ed59de607581e730c1b3a63346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Fri, 24 Aug 2018 19:35:04 +0300 Subject: [PATCH 19/24] api: improve comments --- interface/grpc/core/start_test.go | 4 ++-- interface/grpc/core/stop_test.go | 4 ++-- interface/grpc/service/submit_result_test.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/grpc/core/start_test.go b/interface/grpc/core/start_test.go index 1a44f734a..395805448 100644 --- a/interface/grpc/core/start_test.go +++ b/interface/grpc/core/start_test.go @@ -11,8 +11,8 @@ import ( func TestStartService(t *testing.T) { var ( // we use a test service without tasks definition here otherwise we need to - // spin up the gRPC server in order to prevent service exit with failer because - // it'll try to listen for tasks. + // spin up the gRPC server in order to prevent service exit with a failure + // because it'll try to listen for tasks. path = "./service-test-event" server = newServer(t) ) diff --git a/interface/grpc/core/stop_test.go b/interface/grpc/core/stop_test.go index 7d36ecd1f..e12b3934a 100644 --- a/interface/grpc/core/stop_test.go +++ b/interface/grpc/core/stop_test.go @@ -11,8 +11,8 @@ import ( func TestStopService(t *testing.T) { var ( // we use a test service without tasks definition here otherwise we need to - // spin up the gRPC server in order to prevent service exit with failer because - // it'll try to listen for tasks. + // spin up the gRPC server in order to prevent service exit with a failure + // because it'll try to listen for tasks. path = "./service-test-event" server = newServer(t) ) diff --git a/interface/grpc/service/submit_result_test.go b/interface/grpc/service/submit_result_test.go index 26bd87ba6..a7d31af6a 100644 --- a/interface/grpc/service/submit_result_test.go +++ b/interface/grpc/service/submit_result_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestSubmitA(t *testing.T) { +func TestSubmit(t *testing.T) { var ( path = "./service-test-task" taskKey = "call" From 7522248a1e32d290bbefc7dd680757b8a01bd72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Fri, 24 Aug 2018 19:49:57 +0300 Subject: [PATCH 20/24] re-organize service-test-x testing services --- api/deploy_test.go | 4 ++-- api/service-test/Dockerfile | 0 api/service-test/mesg.yml | 20 ------------------- interface/grpc/core/delete_test.go | 2 +- interface/grpc/core/execute_test.go | 8 ++++---- interface/grpc/core/get_service_test.go | 2 +- .../grpc/core/service-test-event/index.js | 4 ---- .../grpc/core/service-test-task/index.js | 4 ---- interface/grpc/core/start_test.go | 2 +- interface/grpc/core/stop_test.go | 2 +- interface/grpc/service/emit_event_test.go | 8 ++++---- .../service/service-test-event/Dockerfile | 6 ------ .../grpc/service/service-test-event/index.js | 4 ---- .../grpc/service/service-test-event/mesg.yml | 7 ------- .../service/service-test-event/package.json | 12 ----------- .../grpc/service/service-test-task/Dockerfile | 6 ------ .../grpc/service/service-test-task/index.js | 4 ---- .../grpc/service/service-test-task/mesg.yml | 14 ------------- .../service/service-test-task/package.json | 12 ----------- interface/grpc/service/submit_result_test.go | 4 ++-- .../event}/Dockerfile | 0 service-test/event/index.js | 6 ++++++ .../event}/mesg.yml | 0 .../event}/package.json | 0 .../invalid}/empty | 0 .../task}/Dockerfile | 0 service-test/task/index.js | 6 ++++++ .../task}/mesg.yml | 0 .../task}/package.json | 0 29 files changed, 28 insertions(+), 109 deletions(-) delete mode 100644 api/service-test/Dockerfile delete mode 100644 api/service-test/mesg.yml delete mode 100644 interface/grpc/core/service-test-event/index.js delete mode 100644 interface/grpc/core/service-test-task/index.js delete mode 100755 interface/grpc/service/service-test-event/Dockerfile delete mode 100644 interface/grpc/service/service-test-event/index.js delete mode 100644 interface/grpc/service/service-test-event/mesg.yml delete mode 100644 interface/grpc/service/service-test-event/package.json delete mode 100755 interface/grpc/service/service-test-task/Dockerfile delete mode 100644 interface/grpc/service/service-test-task/index.js delete mode 100644 interface/grpc/service/service-test-task/mesg.yml delete mode 100644 interface/grpc/service/service-test-task/package.json rename {interface/grpc/core/service-test-event => service-test/event}/Dockerfile (100%) create mode 100644 service-test/event/index.js rename {interface/grpc/core/service-test-event => service-test/event}/mesg.yml (100%) rename {interface/grpc/core/service-test-event => service-test/event}/package.json (100%) rename {api/service-test-invalid => service-test/invalid}/empty (100%) rename {interface/grpc/core/service-test-task => service-test/task}/Dockerfile (100%) create mode 100644 service-test/task/index.js rename {interface/grpc/core/service-test-task => service-test/task}/mesg.yml (100%) rename {interface/grpc/core/service-test-task => service-test/task}/package.json (100%) diff --git a/api/deploy_test.go b/api/deploy_test.go index d93097714..65947c37d 100644 --- a/api/deploy_test.go +++ b/api/deploy_test.go @@ -15,7 +15,7 @@ import ( ) func TestDeployService(t *testing.T) { - path := "./service-test" + path := "../service-test/task" a, dt := newAPIAndDockerTest(t) dt.ProvideImageBuild(ioutil.NopCloser(strings.NewReader(`{"stream":"sha256:x"}`)), nil) @@ -67,7 +67,7 @@ func TestDeployService(t *testing.T) { } func TestDeployInvalidService(t *testing.T) { - path := "./service-test-invalid" + path := "../service-test/invalid" a, dt := newAPIAndDockerTest(t) dt.ProvideImageBuild(ioutil.NopCloser(strings.NewReader(`{"stream":"sha256:x"}`)), nil) diff --git a/api/service-test/Dockerfile b/api/service-test/Dockerfile deleted file mode 100644 index e69de29bb..000000000 diff --git a/api/service-test/mesg.yml b/api/service-test/mesg.yml deleted file mode 100644 index 286cd1f1a..000000000 --- a/api/service-test/mesg.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: BlueLogger -description: 'Log your data to std output' -tasks: - log: - inputs: - serviceID: - description: 'service id that log belongs to' - type: String - data: - description: 'data to log' - type: Object - outputs: - success: - data: - ok: - type: Boolean - error: - data: - message: - type: String \ No newline at end of file diff --git a/interface/grpc/core/delete_test.go b/interface/grpc/core/delete_test.go index e97503004..eb2642b71 100644 --- a/interface/grpc/core/delete_test.go +++ b/interface/grpc/core/delete_test.go @@ -9,7 +9,7 @@ import ( func TestDeleteService(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" server = newServer(t) ) diff --git a/interface/grpc/core/execute_test.go b/interface/grpc/core/execute_test.go index dff642169..6191c1ee6 100644 --- a/interface/grpc/core/execute_test.go +++ b/interface/grpc/core/execute_test.go @@ -11,7 +11,7 @@ import ( func TestExecute(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" taskKey = "call" data = `{"url": "https://mesg.tech", "data": {}, "headers": {}}` server = newServer(t) @@ -36,7 +36,7 @@ func TestExecute(t *testing.T) { func TestExecuteWithInvalidJSON(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" server = newServer(t) ) @@ -56,7 +56,7 @@ func TestExecuteWithInvalidJSON(t *testing.T) { func TestExecuteWithInvalidTask(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" server = newServer(t) ) @@ -79,7 +79,7 @@ func TestExecuteWithInvalidTask(t *testing.T) { func TestExecuteWithNonRunningService(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" server = newServer(t) ) diff --git a/interface/grpc/core/get_service_test.go b/interface/grpc/core/get_service_test.go index c2f9266bc..99973c9e1 100644 --- a/interface/grpc/core/get_service_test.go +++ b/interface/grpc/core/get_service_test.go @@ -9,7 +9,7 @@ import ( func TestGetService(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" server = newServer(t) ) diff --git a/interface/grpc/core/service-test-event/index.js b/interface/grpc/core/service-test-event/index.js deleted file mode 100644 index 8544ffa04..000000000 --- a/interface/grpc/core/service-test-event/index.js +++ /dev/null @@ -1,4 +0,0 @@ -const MESG = require('mesg-js').service(); -const app = require('express')(); - -app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/core/service-test-task/index.js b/interface/grpc/core/service-test-task/index.js deleted file mode 100644 index 8544ffa04..000000000 --- a/interface/grpc/core/service-test-task/index.js +++ /dev/null @@ -1,4 +0,0 @@ -const MESG = require('mesg-js').service(); -const app = require('express')(); - -app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/core/start_test.go b/interface/grpc/core/start_test.go index 395805448..3a32da657 100644 --- a/interface/grpc/core/start_test.go +++ b/interface/grpc/core/start_test.go @@ -13,7 +13,7 @@ func TestStartService(t *testing.T) { // we use a test service without tasks definition here otherwise we need to // spin up the gRPC server in order to prevent service exit with a failure // because it'll try to listen for tasks. - path = "./service-test-event" + path = "../../../service-test/event" server = newServer(t) ) diff --git a/interface/grpc/core/stop_test.go b/interface/grpc/core/stop_test.go index e12b3934a..607a643f3 100644 --- a/interface/grpc/core/stop_test.go +++ b/interface/grpc/core/stop_test.go @@ -13,7 +13,7 @@ func TestStopService(t *testing.T) { // we use a test service without tasks definition here otherwise we need to // spin up the gRPC server in order to prevent service exit with a failure // because it'll try to listen for tasks. - path = "./service-test-event" + path = "../../../service-test/event" server = newServer(t) ) diff --git a/interface/grpc/service/emit_event_test.go b/interface/grpc/service/emit_event_test.go index df1aee245..9aa71b635 100644 --- a/interface/grpc/service/emit_event_test.go +++ b/interface/grpc/service/emit_event_test.go @@ -10,7 +10,7 @@ import ( func TestEmit(t *testing.T) { var ( - path = "./service-test-event" + path = "../../../service-test/event" eventKey = "request" eventData = `{"data":{}}` server = newServer(t) @@ -45,7 +45,7 @@ func TestEmit(t *testing.T) { func TestEmitNoData(t *testing.T) { var ( - path = "./service-test-event" + path = "../../../service-test/event" eventKey = "request" server = newServer(t) ) @@ -64,7 +64,7 @@ func TestEmitNoData(t *testing.T) { func TestEmitWrongData(t *testing.T) { var ( - path = "./service-test-event" + path = "../../../service-test/event" eventKey = "request" server = newServer(t) ) @@ -84,7 +84,7 @@ func TestEmitWrongData(t *testing.T) { func TestEmitWrongEvent(t *testing.T) { var ( - path = "./service-test-event" + path = "../../../service-test/event" eventKey = "test" server = newServer(t) ) diff --git a/interface/grpc/service/service-test-event/Dockerfile b/interface/grpc/service/service-test-event/Dockerfile deleted file mode 100755 index 4989c3ed3..000000000 --- a/interface/grpc/service/service-test-event/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM node:10.6.0-alpine -WORKDIR /app -COPY ./package* ./ -RUN npm install -COPY . . -CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/interface/grpc/service/service-test-event/index.js b/interface/grpc/service/service-test-event/index.js deleted file mode 100644 index 8544ffa04..000000000 --- a/interface/grpc/service/service-test-event/index.js +++ /dev/null @@ -1,4 +0,0 @@ -const MESG = require('mesg-js').service(); -const app = require('express')(); - -app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/service/service-test-event/mesg.yml b/interface/grpc/service/service-test-event/mesg.yml deleted file mode 100644 index 0a06c9ce4..000000000 --- a/interface/grpc/service/service-test-event/mesg.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: Event -description: "A service that only has events definition" -events: - request: - data: - data: - type: Object \ No newline at end of file diff --git a/interface/grpc/service/service-test-event/package.json b/interface/grpc/service/service-test-event/package.json deleted file mode 100644 index 3e39611a8..000000000 --- a/interface/grpc/service/service-test-event/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "webhook", - "version": "1.0.0", - "description": "Receive HTTP connections and emit events with the data", - "main": "index.js", - "author": "Anthony Estebe ", - "license": "ISC", - "dependencies": { - "express": "^4.16.3", - "mesg-js": "^1.2.1" - } -} diff --git a/interface/grpc/service/service-test-task/Dockerfile b/interface/grpc/service/service-test-task/Dockerfile deleted file mode 100755 index 4989c3ed3..000000000 --- a/interface/grpc/service/service-test-task/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM node:10.6.0-alpine -WORKDIR /app -COPY ./package* ./ -RUN npm install -COPY . . -CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/interface/grpc/service/service-test-task/index.js b/interface/grpc/service/service-test-task/index.js deleted file mode 100644 index 8544ffa04..000000000 --- a/interface/grpc/service/service-test-task/index.js +++ /dev/null @@ -1,4 +0,0 @@ -const MESG = require('mesg-js').service(); -const app = require('express')(); - -app.listen(3000, () => console.log('Example app listening on port 3000!')); \ No newline at end of file diff --git a/interface/grpc/service/service-test-task/mesg.yml b/interface/grpc/service/service-test-task/mesg.yml deleted file mode 100644 index feb6a7a99..000000000 --- a/interface/grpc/service/service-test-task/mesg.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Task -description: "A service that only has tasks definition" -tasks: - call: - inputs: - url: - type: String - data: - type: Object - headers: - type: Object - outputs: - result: - data: {} \ No newline at end of file diff --git a/interface/grpc/service/service-test-task/package.json b/interface/grpc/service/service-test-task/package.json deleted file mode 100644 index 3e39611a8..000000000 --- a/interface/grpc/service/service-test-task/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "webhook", - "version": "1.0.0", - "description": "Receive HTTP connections and emit events with the data", - "main": "index.js", - "author": "Anthony Estebe ", - "license": "ISC", - "dependencies": { - "express": "^4.16.3", - "mesg-js": "^1.2.1" - } -} diff --git a/interface/grpc/service/submit_result_test.go b/interface/grpc/service/submit_result_test.go index a7d31af6a..6fcb51b56 100644 --- a/interface/grpc/service/submit_result_test.go +++ b/interface/grpc/service/submit_result_test.go @@ -10,7 +10,7 @@ import ( func TestSubmit(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" taskKey = "call" taskData = map[string]interface{}{ "url": "https://mesg.tech", @@ -57,7 +57,7 @@ func TestSubmit(t *testing.T) { func TestSubmitWithInvalidJSON(t *testing.T) { var ( - path = "./service-test-task" + path = "../../../service-test/task" taskKey = "call" taskData = map[string]interface{}{ "url": "https://mesg.tech", diff --git a/interface/grpc/core/service-test-event/Dockerfile b/service-test/event/Dockerfile similarity index 100% rename from interface/grpc/core/service-test-event/Dockerfile rename to service-test/event/Dockerfile diff --git a/service-test/event/index.js b/service-test/event/index.js new file mode 100644 index 000000000..65d3d4bed --- /dev/null +++ b/service-test/event/index.js @@ -0,0 +1,6 @@ +const MESG = require("mesg-js").service(); +const app = require("express")(); + +app.listen(3000, () => { + console.log("Example app listening on port 3000!"); +}); \ No newline at end of file diff --git a/interface/grpc/core/service-test-event/mesg.yml b/service-test/event/mesg.yml similarity index 100% rename from interface/grpc/core/service-test-event/mesg.yml rename to service-test/event/mesg.yml diff --git a/interface/grpc/core/service-test-event/package.json b/service-test/event/package.json similarity index 100% rename from interface/grpc/core/service-test-event/package.json rename to service-test/event/package.json diff --git a/api/service-test-invalid/empty b/service-test/invalid/empty similarity index 100% rename from api/service-test-invalid/empty rename to service-test/invalid/empty diff --git a/interface/grpc/core/service-test-task/Dockerfile b/service-test/task/Dockerfile similarity index 100% rename from interface/grpc/core/service-test-task/Dockerfile rename to service-test/task/Dockerfile diff --git a/service-test/task/index.js b/service-test/task/index.js new file mode 100644 index 000000000..65d3d4bed --- /dev/null +++ b/service-test/task/index.js @@ -0,0 +1,6 @@ +const MESG = require("mesg-js").service(); +const app = require("express")(); + +app.listen(3000, () => { + console.log("Example app listening on port 3000!"); +}); \ No newline at end of file diff --git a/interface/grpc/core/service-test-task/mesg.yml b/service-test/task/mesg.yml similarity index 100% rename from interface/grpc/core/service-test-task/mesg.yml rename to service-test/task/mesg.yml diff --git a/interface/grpc/core/service-test-task/package.json b/service-test/task/package.json similarity index 100% rename from interface/grpc/core/service-test-task/package.json rename to service-test/task/package.json From bdecfaf23a625c9d040d8b3a5685ab4c73c5c71a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lker=20Go=CC=88ktug=CC=86=20O=CC=88ztu=CC=88rk?= Date: Mon, 27 Aug 2018 14:59:43 +0300 Subject: [PATCH 21/24] fix logrus import path --- cmd/service/dev.go | 2 +- core/main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/service/dev.go b/cmd/service/dev.go index ae8c5391f..e653e5a38 100644 --- a/cmd/service/dev.go +++ b/cmd/service/dev.go @@ -5,11 +5,11 @@ import ( "fmt" "os" - "github.com/Sirupsen/logrus" "github.com/logrusorgru/aurora" "github.com/mesg-foundation/core/cmd/utils" "github.com/mesg-foundation/core/interface/grpc/core" "github.com/mesg-foundation/core/x/xsignal" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) diff --git a/core/main.go b/core/main.go index eef872b3b..8c3b2d23c 100644 --- a/core/main.go +++ b/core/main.go @@ -1,12 +1,12 @@ package main import ( - "github.com/Sirupsen/logrus" "github.com/mesg-foundation/core/config" "github.com/mesg-foundation/core/interface/grpc" "github.com/mesg-foundation/core/logger" "github.com/mesg-foundation/core/version" "github.com/mesg-foundation/core/x/xsignal" + "github.com/sirupsen/logrus" "github.com/spf13/viper" ) From 9961a3b87a61caabc4ef2b4931c0fdfd9a629e8a Mon Sep 17 00:00:00 2001 From: Anthony ESTEBE Date: Mon, 27 Aug 2018 23:15:24 +0700 Subject: [PATCH 22/24] ignore test folder from static code analytic tools --- .codacy.yml | 1 + .codeclimate.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.codacy.yml b/.codacy.yml index 57492598f..f707670f2 100644 --- a/.codacy.yml +++ b/.codacy.yml @@ -7,5 +7,6 @@ exclude_paths: - "service/importer/assets/*.go" - "cmd/service/assets/*.go" - "cmd/service/tests/**/*" + - "service-test/**" - "docs/**" - "vendor/**/*" diff --git a/.codeclimate.yml b/.codeclimate.yml index b5a4c3a1f..9b4d95d4f 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -5,6 +5,7 @@ exclude_patterns: - "service/importer/assets/*.go" - "cmd/service/assets/*.go" - "cmd/service/tests/**/*" + - "service-test/**" - "docs/**/*" - "**/vendor/" plugins: From 8a776f01a915936c10397b18259693c672c249b6 Mon Sep 17 00:00:00 2001 From: Nicolas Mahe Date: Tue, 28 Aug 2018 16:42:59 +0700 Subject: [PATCH 23/24] Generate proto --- interface/grpc/core/api.pb.go | 113 ++++++++++++++++--------------- interface/grpc/service/api.pb.go | 52 +++++++------- 2 files changed, 84 insertions(+), 81 deletions(-) diff --git a/interface/grpc/core/api.pb.go b/interface/grpc/core/api.pb.go index 6b808de15..2ada140b2 100644 --- a/interface/grpc/core/api.pb.go +++ b/interface/grpc/core/api.pb.go @@ -1,11 +1,11 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: github.com/mesg-foundation/core/api/core/api.proto +// source: github.com/mesg-foundation/core/interface/grpc/core/api.proto /* Package core is a generated protocol buffer package. It is generated from these files: - github.com/mesg-foundation/core/api/core/api.proto + github.com/mesg-foundation/core/interface/grpc/core/api.proto It has these top-level messages: ListenEventRequest @@ -1338,61 +1338,64 @@ var _Core_serviceDesc = grpc.ServiceDesc{ ClientStreams: true, }, }, - Metadata: "github.com/mesg-foundation/core/api/core/api.proto", + Metadata: "github.com/mesg-foundation/core/interface/grpc/core/api.proto", } -func init() { proto.RegisterFile("github.com/mesg-foundation/core/api/core/api.proto", fileDescriptor0) } +func init() { + proto.RegisterFile("github.com/mesg-foundation/core/interface/grpc/core/api.proto", fileDescriptor0) +} var fileDescriptor0 = []byte{ - // 794 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xdd, 0x4e, 0xdb, 0x48, - 0x14, 0xb6, 0x89, 0x49, 0xe0, 0x24, 0x40, 0x18, 0xfe, 0xb2, 0xd6, 0x2e, 0x8a, 0x66, 0xf7, 0x02, - 0xa1, 0xdd, 0xc0, 0x06, 0xaa, 0x56, 0x55, 0x11, 0x2a, 0x4d, 0x4a, 0x10, 0x55, 0x2a, 0x39, 0xe9, - 0x4d, 0xef, 0x4c, 0x3a, 0x0d, 0x16, 0x26, 0x76, 0x3d, 0xe3, 0xa8, 0xe9, 0x53, 0xf4, 0xae, 0x97, - 0x7d, 0x81, 0xbe, 0x51, 0x5f, 0xa6, 0x9a, 0x1f, 0x3b, 0xe3, 0x38, 0xe5, 0xe7, 0x2a, 0x99, 0xef, - 0x9c, 0xf3, 0xcd, 0x37, 0xdf, 0x9c, 0x39, 0x32, 0x34, 0x87, 0x1e, 0xbb, 0x8e, 0xaf, 0x1a, 0x83, - 0xe0, 0xf6, 0xe0, 0x96, 0xd0, 0xe1, 0x7f, 0x1f, 0x83, 0x78, 0xf4, 0xc1, 0x65, 0x5e, 0x30, 0x3a, - 0x18, 0x04, 0x11, 0x39, 0x70, 0x43, 0x2f, 0xfd, 0xd3, 0x08, 0xa3, 0x80, 0x05, 0xa8, 0xe0, 0x86, - 0x9e, 0xfd, 0xe4, 0xbe, 0x42, 0x4a, 0xa2, 0xb1, 0x37, 0x48, 0x7f, 0x65, 0x2d, 0xee, 0x03, 0x7a, - 0xe3, 0x51, 0x46, 0x46, 0xed, 0x31, 0x19, 0x31, 0x87, 0x7c, 0x8a, 0x09, 0x65, 0xe8, 0x4f, 0x58, - 0x56, 0x69, 0x17, 0xad, 0x9a, 0x59, 0x37, 0xf7, 0x96, 0x9d, 0x29, 0x80, 0xea, 0x50, 0x26, 0x3c, - 0xfb, 0xb5, 0xe7, 0x33, 0x12, 0xd5, 0x16, 0x44, 0x5c, 0x87, 0x70, 0x1b, 0x96, 0x05, 0x5f, 0xcb, - 0x65, 0x2e, 0xb2, 0x61, 0x49, 0xc4, 0x2e, 0xc9, 0x44, 0x71, 0xa5, 0x6b, 0xbe, 0x11, 0x49, 0x12, - 0x15, 0xd1, 0x14, 0xc0, 0xdf, 0x4c, 0xd8, 0x90, 0xea, 0x1c, 0x42, 0x63, 0xff, 0x81, 0xf2, 0x76, - 0x01, 0x98, 0x4b, 0x6f, 0x32, 0xea, 0x34, 0x04, 0x61, 0xa8, 0x04, 0x31, 0x0b, 0xe3, 0x44, 0x7f, - 0x41, 0x64, 0x64, 0x30, 0xc9, 0x31, 0x94, 0x0b, 0x5a, 0xb3, 0xea, 0x05, 0xc9, 0x91, 0x20, 0xf8, - 0x87, 0x09, 0x20, 0x35, 0x89, 0x23, 0x72, 0x47, 0x3e, 0x93, 0x41, 0xcc, 0xdd, 0x4e, 0x25, 0xe9, - 0x10, 0xaa, 0x41, 0x89, 0x4b, 0xe0, 0x1e, 0x48, 0x45, 0xc9, 0x92, 0x1f, 0x46, 0x6e, 0xcd, 0x63, - 0x52, 0xcb, 0x14, 0xe0, 0x42, 0xe4, 0x42, 0x38, 0x64, 0xc9, 0xc3, 0x4c, 0x11, 0xf4, 0x0f, 0xac, - 0xa4, 0xdb, 0xf4, 0xdd, 0x21, 0xad, 0x2d, 0x0a, 0xad, 0x59, 0x10, 0x7f, 0x35, 0x01, 0xb5, 0x05, - 0x42, 0xfa, 0x2e, 0xbd, 0x79, 0x98, 0x8f, 0x77, 0x4a, 0xf6, 0x46, 0x89, 0x26, 0x25, 0x39, 0x05, - 0xf2, 0x92, 0xac, 0x79, 0x92, 0x8e, 0xa1, 0x9a, 0x51, 0x14, 0xfa, 0x93, 0xfb, 0x6d, 0xc4, 0x47, - 0xb0, 0xd1, 0x63, 0x6e, 0xc4, 0x7a, 0x52, 0xe5, 0x83, 0x0e, 0x82, 0x37, 0x60, 0x3d, 0x5b, 0x14, - 0xfa, 0x13, 0xdc, 0x04, 0xd4, 0x63, 0x41, 0xf8, 0x28, 0x22, 0x04, 0xd5, 0x4c, 0x0d, 0xe7, 0xb9, - 0x84, 0xcd, 0x16, 0x09, 0xfd, 0x60, 0x32, 0xc3, 0x84, 0xa0, 0x10, 0x47, 0xbe, 0x74, 0xae, 0x63, - 0x38, 0x7c, 0x81, 0xb6, 0x61, 0x71, 0x70, 0x1d, 0x8f, 0x6e, 0x84, 0x67, 0x95, 0x8e, 0xe1, 0xc8, - 0xe5, 0x59, 0x09, 0x16, 0xc7, 0xae, 0x1f, 0x13, 0xfc, 0x7d, 0x01, 0xd0, 0x0c, 0x1b, 0xf7, 0xe5, - 0x19, 0x14, 0x29, 0x73, 0x59, 0x4c, 0x05, 0x5d, 0xb9, 0xb9, 0xdb, 0xe0, 0x8f, 0x3f, 0x9f, 0xd8, - 0xe8, 0x89, 0xac, 0x8e, 0xe1, 0xa8, 0x7c, 0xb4, 0xab, 0x9f, 0xa7, 0xa0, 0xb4, 0x68, 0x77, 0xbc, - 0x0f, 0x6b, 0x63, 0xd7, 0xf7, 0xe4, 0x9c, 0x68, 0x47, 0x51, 0x10, 0xc9, 0x1e, 0xeb, 0x18, 0xce, - 0x6c, 0xc0, 0xfe, 0x02, 0x45, 0xc9, 0xcf, 0x3b, 0xe3, 0x96, 0x50, 0xea, 0x0e, 0x89, 0xf2, 0x28, - 0x59, 0xa2, 0xa7, 0x60, 0xb1, 0x49, 0x48, 0x84, 0xce, 0xd5, 0xe6, 0xdf, 0x77, 0xeb, 0x6c, 0xf4, - 0x27, 0x21, 0x71, 0x44, 0x01, 0xfe, 0x0b, 0x2c, 0xbe, 0x42, 0x65, 0x28, 0x39, 0xef, 0xba, 0xdd, - 0x8b, 0xee, 0x79, 0xd5, 0x40, 0x4b, 0x60, 0xb5, 0xde, 0x76, 0xdb, 0x55, 0x73, 0xea, 0xd0, 0x31, - 0xb7, 0xdb, 0x27, 0x8c, 0x3c, 0xea, 0xe2, 0x36, 0xb9, 0xad, 0x99, 0x2a, 0x7e, 0x75, 0x5b, 0x72, - 0xba, 0x28, 0x8c, 0x2a, 0x2a, 0xfc, 0x12, 0xd6, 0xb3, 0x30, 0xbf, 0x82, 0x7f, 0x61, 0x49, 0xd1, - 0xd1, 0x9a, 0x59, 0x2f, 0xec, 0x95, 0x9b, 0xd5, 0x46, 0x32, 0x49, 0x13, 0xd2, 0x34, 0x03, 0xff, - 0x0f, 0xeb, 0xe7, 0xe4, 0x71, 0x4d, 0x7a, 0x02, 0x6b, 0x7a, 0x09, 0xdf, 0x73, 0x1f, 0x4a, 0x2a, - 0x2e, 0xd2, 0xe7, 0x6d, 0x99, 0x24, 0x34, 0x7f, 0x5a, 0x60, 0xbd, 0x0a, 0x22, 0x82, 0x9e, 0x43, - 0x59, 0x1b, 0xe8, 0x68, 0x47, 0x5c, 0x41, 0x7e, 0xc4, 0xdb, 0xab, 0x22, 0x90, 0x4e, 0x69, 0x6c, - 0x1c, 0x9a, 0xe8, 0x04, 0x2a, 0xfa, 0xb8, 0x45, 0x35, 0xad, 0x38, 0x33, 0x81, 0xed, 0x35, 0x11, - 0x99, 0x4e, 0x40, 0x51, 0x7e, 0x0a, 0x65, 0xed, 0x49, 0xab, 0xad, 0xf3, 0x63, 0xc7, 0xde, 0xca, - 0x07, 0xf8, 0x75, 0x18, 0xe8, 0x0c, 0x2a, 0xfa, 0x43, 0x55, 0xfb, 0xcf, 0x79, 0xf0, 0xf6, 0xf6, - 0x9c, 0x88, 0xe4, 0x38, 0x85, 0xb2, 0xf6, 0x46, 0x95, 0x88, 0xfc, 0x4b, 0x57, 0x22, 0x72, 0xcf, - 0xd9, 0x40, 0x17, 0xb0, 0x92, 0xe9, 0x58, 0xf4, 0xc7, 0xbc, 0x2e, 0x96, 0x24, 0x3b, 0xbf, 0x69, - 0x70, 0x6c, 0xec, 0x99, 0x87, 0x26, 0x6a, 0x73, 0x2a, 0xad, 0xed, 0x52, 0xaa, 0x7c, 0x03, 0xa7, - 0x54, 0xb9, 0x2e, 0x15, 0xb6, 0xe8, 0x0d, 0xa9, 0x5d, 0xcb, 0x4c, 0xeb, 0x2a, 0x5b, 0x72, 0xdd, - 0x8b, 0x0d, 0xf4, 0x02, 0x60, 0xda, 0x5e, 0x48, 0xe6, 0xe5, 0x5a, 0xd4, 0xde, 0xcc, 0xe1, 0xa2, - 0xfa, 0xac, 0xf8, 0xde, 0xe2, 0xdf, 0x10, 0x57, 0x45, 0xf1, 0xd1, 0x70, 0xf4, 0x2b, 0x00, 0x00, - 0xff, 0xff, 0x62, 0x1f, 0x31, 0xe7, 0xa6, 0x08, 0x00, 0x00, + // 806 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xdb, 0x6e, 0xdb, 0x46, + 0x10, 0x25, 0x2d, 0x5a, 0xb2, 0x47, 0xb2, 0x2d, 0xaf, 0x6f, 0x2a, 0xd1, 0x1a, 0xc2, 0xb6, 0x0f, + 0x86, 0xd1, 0x4a, 0xae, 0xec, 0xa2, 0x45, 0x51, 0xc3, 0xa8, 0x23, 0xc5, 0x32, 0x1c, 0x28, 0x00, + 0xa5, 0xbc, 0xe4, 0x8d, 0x56, 0xd6, 0x32, 0x61, 0x5a, 0x64, 0xb8, 0x4b, 0x21, 0xca, 0x57, 0xe4, + 0x2d, 0x8f, 0xf9, 0x81, 0xfc, 0x51, 0x7e, 0x26, 0xd8, 0x0b, 0xa9, 0xa5, 0xa8, 0xf8, 0xf2, 0x24, + 0xcc, 0x99, 0x99, 0xb3, 0x87, 0x67, 0x67, 0x07, 0x82, 0xd3, 0x91, 0xc7, 0x6e, 0xe3, 0xeb, 0xc6, + 0x30, 0xb8, 0x6f, 0xde, 0x13, 0x3a, 0xfa, 0xe3, 0x26, 0x88, 0xc7, 0xef, 0x5c, 0xe6, 0x05, 0xe3, + 0xe6, 0x30, 0x88, 0x48, 0xd3, 0x1b, 0x33, 0x12, 0xdd, 0xb8, 0x43, 0xd2, 0x1c, 0x45, 0xe1, 0x50, + 0x62, 0x6e, 0xe8, 0x35, 0xc2, 0x28, 0x60, 0x01, 0x2a, 0xb8, 0xa1, 0x67, 0xff, 0xf5, 0x18, 0x07, + 0x25, 0xd1, 0xc4, 0x1b, 0xa6, 0xbf, 0xb2, 0x17, 0x0f, 0x00, 0xbd, 0xf2, 0x28, 0x23, 0xe3, 0xce, + 0x84, 0x8c, 0x99, 0x43, 0xde, 0xc7, 0x84, 0x32, 0xf4, 0x33, 0xac, 0xaa, 0xb2, 0xcb, 0x76, 0xcd, + 0xac, 0x9b, 0x07, 0xab, 0xce, 0x0c, 0x40, 0x75, 0x28, 0x13, 0x5e, 0xfd, 0xd2, 0xf3, 0x19, 0x89, + 0x6a, 0x4b, 0x22, 0xaf, 0x43, 0xb8, 0x03, 0xab, 0x82, 0xaf, 0xed, 0x32, 0x17, 0xd9, 0xb0, 0x22, + 0x72, 0x57, 0x64, 0xaa, 0xb8, 0xd2, 0x98, 0x1f, 0x44, 0x92, 0x42, 0x45, 0x34, 0x03, 0xf0, 0x67, + 0x13, 0xb6, 0xa4, 0x3a, 0x87, 0xd0, 0xd8, 0x7f, 0xa2, 0xbc, 0x7d, 0x00, 0xe6, 0xd2, 0xbb, 0x8c, + 0x3a, 0x0d, 0x41, 0x18, 0x2a, 0x41, 0xcc, 0xc2, 0x38, 0xd1, 0x5f, 0x10, 0x15, 0x19, 0x4c, 0x72, + 0x8c, 0x64, 0x40, 0x6b, 0x56, 0xbd, 0x20, 0x39, 0x12, 0x04, 0x7f, 0x35, 0x01, 0xa4, 0x26, 0xf1, + 0x89, 0xdc, 0x91, 0x0f, 0x64, 0x18, 0x73, 0xb7, 0x53, 0x49, 0x3a, 0x84, 0x6a, 0x50, 0xe2, 0x12, + 0xb8, 0x07, 0x52, 0x51, 0x12, 0xf2, 0x8f, 0x91, 0x47, 0xf3, 0x9c, 0xd4, 0x32, 0x03, 0xb8, 0x10, + 0x19, 0x08, 0x87, 0x2c, 0xf9, 0x31, 0x33, 0x04, 0xfd, 0x06, 0x6b, 0xe9, 0x31, 0x03, 0x77, 0x44, + 0x6b, 0xcb, 0x42, 0x6b, 0x16, 0xc4, 0x9f, 0x4c, 0x40, 0x1d, 0x81, 0x90, 0x81, 0x4b, 0xef, 0x9e, + 0xe6, 0xe3, 0x83, 0x92, 0xbd, 0x71, 0xa2, 0x49, 0x49, 0x4e, 0x81, 0xbc, 0x24, 0x6b, 0x91, 0xa4, + 0x13, 0xa8, 0x66, 0x14, 0x85, 0xfe, 0xf4, 0x71, 0x1b, 0xf1, 0x31, 0x6c, 0xf5, 0x99, 0x1b, 0xb1, + 0xbe, 0x54, 0xf9, 0xa4, 0x0f, 0xc1, 0x5b, 0xb0, 0x99, 0x6d, 0x0a, 0xfd, 0x29, 0x6e, 0x01, 0xea, + 0xb3, 0x20, 0x7c, 0x16, 0x11, 0x82, 0x6a, 0xa6, 0x87, 0xf3, 0x5c, 0xc1, 0x76, 0x9b, 0x84, 0x7e, + 0x30, 0x9d, 0x63, 0x42, 0x50, 0x88, 0x23, 0x5f, 0x3a, 0xd7, 0x35, 0x1c, 0x1e, 0xa0, 0x5d, 0x58, + 0x1e, 0xde, 0xc6, 0xe3, 0x3b, 0xe1, 0x59, 0xa5, 0x6b, 0x38, 0x32, 0x3c, 0x2f, 0xc1, 0xf2, 0xc4, + 0xf5, 0x63, 0x82, 0xbf, 0x2c, 0x01, 0x9a, 0x63, 0xe3, 0xbe, 0xfc, 0x03, 0x45, 0xca, 0x5c, 0x16, + 0x53, 0x41, 0x57, 0x6e, 0xed, 0x37, 0xf8, 0xe3, 0xcf, 0x17, 0x36, 0xfa, 0xa2, 0xaa, 0x6b, 0x38, + 0xaa, 0x1e, 0xed, 0xeb, 0xdf, 0x53, 0x50, 0x5a, 0xb4, 0x3b, 0x3e, 0x84, 0x8d, 0x89, 0xeb, 0x7b, + 0x72, 0x4f, 0x74, 0xa2, 0x28, 0x88, 0xe4, 0x8c, 0x75, 0x0d, 0x67, 0x3e, 0x61, 0x7f, 0x84, 0xa2, + 0xe4, 0xe7, 0x93, 0x71, 0x4f, 0x28, 0x75, 0x47, 0x44, 0x79, 0x94, 0x84, 0xe8, 0x6f, 0xb0, 0xd8, + 0x34, 0x24, 0x42, 0xe7, 0x7a, 0xeb, 0xd7, 0x87, 0x75, 0x36, 0x06, 0xd3, 0x90, 0x38, 0xa2, 0x01, + 0xff, 0x02, 0x16, 0x8f, 0x50, 0x19, 0x4a, 0xce, 0x9b, 0x5e, 0xef, 0xb2, 0x77, 0x51, 0x35, 0xd0, + 0x0a, 0x58, 0xed, 0xd7, 0xbd, 0x4e, 0xd5, 0x9c, 0x39, 0x74, 0xc2, 0xed, 0xf6, 0x09, 0x23, 0xcf, + 0xba, 0xb8, 0x6d, 0x6e, 0x6b, 0xa6, 0x8b, 0x5f, 0xdd, 0x8e, 0xdc, 0x2e, 0x0a, 0xa3, 0x8a, 0x0a, + 0xff, 0x0f, 0x9b, 0x59, 0x98, 0x5f, 0xc1, 0xef, 0xb0, 0xa2, 0xe8, 0x68, 0xcd, 0xac, 0x17, 0x0e, + 0xca, 0xad, 0x6a, 0x23, 0xd9, 0xa4, 0x09, 0x69, 0x5a, 0x81, 0xff, 0x84, 0xcd, 0x0b, 0xf2, 0xbc, + 0x21, 0x3d, 0x85, 0x0d, 0xbd, 0x85, 0x9f, 0x79, 0x08, 0x25, 0x95, 0x17, 0xe5, 0x8b, 0x8e, 0x4c, + 0x0a, 0x5a, 0xdf, 0x2c, 0xb0, 0x5e, 0x04, 0x11, 0x41, 0xff, 0x42, 0x59, 0x5b, 0xe8, 0x68, 0x4f, + 0x5c, 0x41, 0x7e, 0xc5, 0xdb, 0xeb, 0x22, 0x91, 0x6e, 0x69, 0x6c, 0x1c, 0x99, 0xe8, 0x14, 0x2a, + 0xfa, 0xba, 0x45, 0x35, 0xad, 0x39, 0xb3, 0x81, 0xed, 0x0d, 0x91, 0x99, 0x6d, 0x40, 0xd1, 0x7e, + 0x06, 0x65, 0xed, 0x49, 0xab, 0xa3, 0xf3, 0x6b, 0xc7, 0xde, 0xc9, 0x27, 0xf8, 0x75, 0x18, 0xe8, + 0x1c, 0x2a, 0xfa, 0x43, 0x55, 0xe7, 0x2f, 0x78, 0xf0, 0xf6, 0xee, 0x82, 0x8c, 0xe4, 0x38, 0x83, + 0xb2, 0xf6, 0x46, 0x95, 0x88, 0xfc, 0x4b, 0x57, 0x22, 0x72, 0xcf, 0xd9, 0x40, 0x97, 0xb0, 0x96, + 0x99, 0x58, 0xf4, 0xd3, 0xa2, 0x29, 0x96, 0x24, 0x7b, 0x3f, 0x18, 0x70, 0x6c, 0x1c, 0x98, 0x47, + 0x26, 0xea, 0x70, 0x2a, 0x6d, 0xec, 0x52, 0xaa, 0xfc, 0x00, 0xa7, 0x54, 0xb9, 0x29, 0x15, 0xb6, + 0xe8, 0x03, 0xa9, 0x5d, 0xcb, 0xdc, 0xe8, 0x2a, 0x5b, 0x72, 0xd3, 0x8b, 0x0d, 0xf4, 0x1f, 0xc0, + 0x6c, 0xbc, 0x90, 0xac, 0xcb, 0x8d, 0xa8, 0xbd, 0x9d, 0xc3, 0x45, 0xf7, 0x79, 0xf1, 0xad, 0xc5, + 0xff, 0x43, 0x5c, 0x17, 0xc5, 0x9f, 0x86, 0xe3, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x45, + 0xd6, 0xf6, 0xb1, 0x08, 0x00, 0x00, } diff --git a/interface/grpc/service/api.pb.go b/interface/grpc/service/api.pb.go index db05900f1..65eb15d83 100644 --- a/interface/grpc/service/api.pb.go +++ b/interface/grpc/service/api.pb.go @@ -1,11 +1,11 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: github.com/mesg-foundation/core/api/service/api.proto +// source: github.com/mesg-foundation/core/interface/grpc/service/api.proto /* Package service is a generated protocol buffer package. It is generated from these files: - github.com/mesg-foundation/core/api/service/api.proto + github.com/mesg-foundation/core/interface/grpc/service/api.proto It has these top-level messages: EmitEventRequest @@ -392,35 +392,35 @@ var _Service_serviceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "github.com/mesg-foundation/core/api/service/api.proto", + Metadata: "github.com/mesg-foundation/core/interface/grpc/service/api.proto", } func init() { - proto.RegisterFile("github.com/mesg-foundation/core/api/service/api.proto", fileDescriptor0) + proto.RegisterFile("github.com/mesg-foundation/core/interface/grpc/service/api.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 343 bytes of a gzipped FileDescriptorProto + // 352 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xc1, 0x4f, 0xea, 0x40, - 0x10, 0xc6, 0xe9, 0x23, 0xef, 0x41, 0xe7, 0xbd, 0x67, 0x60, 0x51, 0xd2, 0x34, 0xc4, 0x90, 0x3d, - 0xe9, 0x41, 0x6a, 0x34, 0xc6, 0x78, 0x25, 0x70, 0x30, 0x7a, 0x02, 0x4f, 0xde, 0xb6, 0x65, 0xc4, - 0x0d, 0xb4, 0xbb, 0xb2, 0xbb, 0x44, 0xfe, 0x3c, 0xff, 0x33, 0xb3, 0x0b, 0xb4, 0x05, 0x89, 0xde, - 0x76, 0xbe, 0xf9, 0xd2, 0x6f, 0xfa, 0x9b, 0x81, 0x9b, 0x29, 0xd7, 0xaf, 0x26, 0xee, 0x25, 0x22, - 0x8d, 0x52, 0x54, 0xd3, 0x8b, 0x17, 0x61, 0xb2, 0x09, 0xd3, 0x5c, 0x64, 0x51, 0x22, 0x16, 0x18, - 0x31, 0xc9, 0x23, 0x85, 0x8b, 0x25, 0x4f, 0xdc, 0xbb, 0x27, 0x17, 0x42, 0x0b, 0x52, 0x65, 0x92, - 0xd3, 0x18, 0x1a, 0xc3, 0x94, 0xeb, 0xe1, 0x12, 0x33, 0x3d, 0xc2, 0x37, 0x83, 0x4a, 0x93, 0x63, - 0xf8, 0xad, 0xc5, 0x0c, 0xb3, 0xc0, 0xeb, 0x7a, 0x67, 0xfe, 0x68, 0x5d, 0x90, 0x10, 0xea, 0x68, - 0x5d, 0x0f, 0xb8, 0x0a, 0x7e, 0xb9, 0x46, 0x5e, 0x93, 0x0e, 0xf8, 0xee, 0x3d, 0x60, 0x9a, 0x05, - 0x55, 0xd7, 0x2c, 0x04, 0xda, 0x80, 0xa3, 0x52, 0x86, 0x9c, 0xaf, 0xe8, 0x39, 0x34, 0x1f, 0xb9, - 0xd2, 0x98, 0x3d, 0x31, 0x35, 0xfb, 0x36, 0x96, 0x4e, 0xa0, 0x6e, 0x4d, 0xf6, 0x43, 0xa4, 0x0b, - 0x7f, 0xf1, 0x1d, 0x13, 0x63, 0xff, 0xec, 0x7e, 0xb0, 0xf1, 0x95, 0x25, 0x12, 0x40, 0x4d, 0x33, - 0x35, 0x2b, 0x66, 0xdc, 0x96, 0x76, 0x44, 0x9e, 0x49, 0xb3, 0x33, 0x62, 0x2e, 0x50, 0x03, 0xad, - 0xb1, 0x89, 0x53, 0xae, 0x47, 0xa8, 0xcc, 0x3c, 0x27, 0xf1, 0x73, 0x60, 0x07, 0x7c, 0x61, 0xb4, - 0x34, 0x25, 0x2c, 0x85, 0x40, 0x4e, 0x01, 0xd6, 0x45, 0x29, 0xb5, 0xa4, 0xd0, 0x16, 0x34, 0x77, - 0x63, 0xe5, 0x7c, 0x75, 0xf5, 0xe1, 0x41, 0x6d, 0xbc, 0xde, 0x16, 0xb9, 0x03, 0x3f, 0x47, 0x47, - 0x4e, 0x7a, 0x76, 0x79, 0xfb, 0xeb, 0x0a, 0x5b, 0xfb, 0xb2, 0x25, 0x5c, 0x21, 0xb7, 0x00, 0x05, - 0x63, 0xd2, 0x76, 0xa6, 0x2f, 0xd0, 0xc3, 0xff, 0x4e, 0xdf, 0x12, 0xa6, 0x95, 0x4b, 0x8f, 0xf4, - 0xe1, 0x5f, 0x79, 0x28, 0x12, 0x38, 0xcb, 0x01, 0x3c, 0x61, 0xfb, 0x40, 0xc7, 0x85, 0xf7, 0xfd, - 0xe7, 0xda, 0xe6, 0xe0, 0xe2, 0x3f, 0xee, 0xda, 0xae, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xbb, - 0xa1, 0x83, 0xd0, 0xa6, 0x02, 0x00, 0x00, + 0x10, 0xc6, 0xe9, 0x23, 0xef, 0x41, 0xe7, 0xa9, 0x81, 0x45, 0x49, 0xd3, 0x10, 0x43, 0x7a, 0xd2, + 0x83, 0xd4, 0xe8, 0xc1, 0x78, 0x33, 0x04, 0x0e, 0x46, 0x4f, 0xe0, 0xc9, 0xdb, 0xb6, 0x0c, 0xb8, + 0x81, 0x76, 0xd7, 0xee, 0x2e, 0x91, 0x3f, 0xcf, 0xff, 0xcc, 0xec, 0x02, 0x6d, 0x41, 0xa2, 0xb7, + 0xce, 0x37, 0x5f, 0xfa, 0xcd, 0xfe, 0x66, 0xe0, 0x61, 0xc6, 0xd4, 0x9b, 0x8e, 0x7a, 0x31, 0x4f, + 0xc2, 0x04, 0xe5, 0xec, 0x6a, 0xca, 0x75, 0x3a, 0xa1, 0x8a, 0xf1, 0x34, 0x8c, 0x79, 0x86, 0x21, + 0x4b, 0x15, 0x66, 0x53, 0x1a, 0x63, 0x38, 0xcb, 0x44, 0x1c, 0x4a, 0xcc, 0x96, 0x2c, 0xc6, 0x90, + 0x0a, 0xd6, 0x13, 0x19, 0x57, 0x9c, 0x54, 0xa9, 0x60, 0x41, 0x04, 0x8d, 0x61, 0xc2, 0xd4, 0x70, + 0x89, 0xa9, 0x1a, 0xe1, 0xbb, 0x46, 0xa9, 0xc8, 0x29, 0xfc, 0x55, 0x7c, 0x8e, 0xa9, 0xe7, 0x74, + 0x9d, 0x0b, 0x77, 0xb4, 0x2e, 0x88, 0x0f, 0x75, 0x34, 0xae, 0x27, 0x5c, 0x79, 0x7f, 0x6c, 0x23, + 0xaf, 0x49, 0x07, 0x5c, 0xfb, 0x3d, 0xa0, 0x8a, 0x7a, 0x55, 0xdb, 0x2c, 0x84, 0xa0, 0x01, 0x27, + 0xa5, 0x0c, 0xb1, 0x58, 0x05, 0x97, 0xd0, 0x7c, 0x66, 0x52, 0x61, 0xfa, 0x42, 0xe5, 0xfc, 0xc7, + 0xd8, 0x60, 0x02, 0x75, 0x63, 0x32, 0x3f, 0x22, 0x5d, 0xf8, 0x8f, 0x1f, 0x18, 0x6b, 0xf3, 0xc8, + 0xc7, 0xc1, 0xc6, 0x57, 0x96, 0x88, 0x07, 0x35, 0x45, 0xe5, 0xbc, 0x98, 0x71, 0x5b, 0x9a, 0x11, + 0x59, 0x2a, 0xf4, 0xce, 0x88, 0xb9, 0x10, 0x68, 0x68, 0x8d, 0x75, 0x94, 0x30, 0x35, 0x42, 0xa9, + 0x17, 0x39, 0x89, 0xdf, 0x03, 0x3b, 0xe0, 0x72, 0xad, 0x84, 0x2e, 0x61, 0x29, 0x04, 0x72, 0x0e, + 0xb0, 0x2e, 0x4a, 0xa9, 0x25, 0x25, 0x68, 0x41, 0x73, 0x37, 0x56, 0x2c, 0x56, 0x37, 0x9f, 0x0e, + 0xd4, 0xc6, 0xeb, 0x6d, 0x91, 0x7b, 0x70, 0x73, 0x74, 0xe4, 0xac, 0x67, 0x96, 0xb7, 0xbf, 0x2e, + 0xbf, 0xb5, 0x2f, 0x1b, 0xc2, 0x15, 0x72, 0x07, 0x50, 0x30, 0x26, 0x6d, 0x6b, 0xfa, 0x06, 0xdd, + 0x3f, 0xb6, 0xfa, 0x96, 0x70, 0x50, 0xb9, 0x76, 0x48, 0x1f, 0x8e, 0xca, 0x43, 0x11, 0xcf, 0x5a, + 0x0e, 0xe0, 0xf1, 0xdb, 0x07, 0x3a, 0x36, 0xbc, 0xef, 0xbe, 0xd6, 0x36, 0x07, 0x17, 0xfd, 0xb3, + 0xd7, 0x76, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x00, 0x7c, 0x69, 0xb1, 0x02, 0x00, 0x00, } From 7d7111bac94394caa2e5b49537bf9e123d91919c Mon Sep 17 00:00:00 2001 From: Nicolas Mahe Date: Tue, 28 Aug 2018 16:43:18 +0700 Subject: [PATCH 24/24] Fix path to cli in script build-cli --- scripts/build-cli.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build-cli.sh b/scripts/build-cli.sh index 3b3d66529..3f67fbd76 100755 --- a/scripts/build-cli.sh +++ b/scripts/build-cli.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -e go get ./... go get github.com/karalabe/xgo @@ -7,5 +7,5 @@ xgo --targets=darwin/386,darwin/amd64,linux/386,linux/amd64,windows/386,windows/ -ldflags="-X 'github.com/mesg-foundation/core/version.Version=$1'" \ -out mesg-core \ -dest ./bin \ - ./cli + ./interface/cli sudo chmod +x ./bin/*