2019-11-20 14:54:42 +00:00
|
|
|
package service
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/micro/go-micro/client"
|
|
|
|
"github.com/micro/go-micro/runtime"
|
|
|
|
pb "github.com/micro/go-micro/runtime/service/proto"
|
|
|
|
)
|
|
|
|
|
|
|
|
type svc struct {
|
|
|
|
sync.RWMutex
|
|
|
|
options runtime.Options
|
|
|
|
runtime pb.RuntimeService
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewRuntime creates new service runtime and returns it
|
|
|
|
func NewRuntime(opts ...runtime.Option) runtime.Runtime {
|
|
|
|
// get default options
|
|
|
|
options := runtime.Options{}
|
|
|
|
|
|
|
|
// apply requested options
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
|
|
|
// create default client
|
|
|
|
cli := client.DefaultClient
|
|
|
|
|
|
|
|
return &svc{
|
|
|
|
options: options,
|
|
|
|
runtime: pb.NewRuntimeService(runtime.DefaultName, cli),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init initializes runtime with given options
|
|
|
|
func (s *svc) Init(opts ...runtime.Option) error {
|
|
|
|
s.Lock()
|
|
|
|
defer s.Unlock()
|
|
|
|
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&s.options)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create registers a service in the runtime
|
|
|
|
func (s *svc) Create(svc *runtime.Service, opts ...runtime.CreateOption) error {
|
|
|
|
options := runtime.CreateOptions{}
|
|
|
|
// apply requested options
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
|
|
|
// runtime service create request
|
|
|
|
req := &pb.CreateRequest{
|
|
|
|
Service: &pb.Service{
|
2019-11-22 17:10:00 +00:00
|
|
|
Name: svc.Name,
|
|
|
|
Version: svc.Version,
|
|
|
|
Source: svc.Source,
|
|
|
|
Metadata: svc.Metadata,
|
2019-11-20 14:54:42 +00:00
|
|
|
},
|
|
|
|
Options: &pb.CreateOptions{
|
|
|
|
Command: options.Command,
|
|
|
|
Env: options.Env,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := s.runtime.Create(context.Background(), req); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-11-25 16:31:14 +00:00
|
|
|
// Read returns the service with the given name from the runtime
|
2019-11-29 11:35:00 +00:00
|
|
|
func (s *svc) Read(opts ...runtime.ReadOption) ([]*runtime.Service, error) {
|
2019-11-25 16:31:14 +00:00
|
|
|
options := runtime.ReadOptions{}
|
2019-11-20 14:54:42 +00:00
|
|
|
// apply requested options
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
|
|
|
// runtime service create request
|
2019-11-25 16:31:14 +00:00
|
|
|
req := &pb.ReadRequest{
|
|
|
|
Options: &pb.ReadOptions{
|
2019-11-29 11:35:00 +00:00
|
|
|
Service: options.Service,
|
2019-11-20 14:54:42 +00:00
|
|
|
Version: options.Version,
|
2019-11-29 11:35:00 +00:00
|
|
|
Type: options.Type,
|
2019-11-20 14:54:42 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2019-11-25 16:31:14 +00:00
|
|
|
resp, err := s.runtime.Read(context.Background(), req)
|
2019-11-20 14:54:42 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
services := make([]*runtime.Service, 0, len(resp.Services))
|
|
|
|
for _, service := range resp.Services {
|
|
|
|
svc := &runtime.Service{
|
2019-11-22 17:10:00 +00:00
|
|
|
Name: service.Name,
|
|
|
|
Version: service.Version,
|
|
|
|
Source: service.Source,
|
|
|
|
Metadata: service.Metadata,
|
2019-11-20 14:54:42 +00:00
|
|
|
}
|
|
|
|
services = append(services, svc)
|
|
|
|
}
|
|
|
|
|
|
|
|
return services, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update updates the running service
|
|
|
|
func (s *svc) Update(svc *runtime.Service) error {
|
|
|
|
// runtime service create request
|
|
|
|
req := &pb.UpdateRequest{
|
|
|
|
Service: &pb.Service{
|
|
|
|
Name: svc.Name,
|
|
|
|
Version: svc.Version,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := s.runtime.Update(context.Background(), req); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete stops and removes the service from the runtime
|
|
|
|
func (s *svc) Delete(svc *runtime.Service) error {
|
|
|
|
// runtime service create request
|
|
|
|
req := &pb.DeleteRequest{
|
|
|
|
Service: &pb.Service{
|
|
|
|
Name: svc.Name,
|
|
|
|
Version: svc.Version,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := s.runtime.Delete(context.Background(), req); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// List lists all services managed by the runtime
|
|
|
|
func (s *svc) List() ([]*runtime.Service, error) {
|
|
|
|
// list all services managed by the runtime
|
|
|
|
resp, err := s.runtime.List(context.Background(), &pb.ListRequest{})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
services := make([]*runtime.Service, 0, len(resp.Services))
|
|
|
|
for _, service := range resp.Services {
|
|
|
|
svc := &runtime.Service{
|
2019-11-22 17:10:00 +00:00
|
|
|
Name: service.Name,
|
|
|
|
Version: service.Version,
|
|
|
|
Source: service.Source,
|
|
|
|
Metadata: service.Metadata,
|
2019-11-20 14:54:42 +00:00
|
|
|
}
|
|
|
|
services = append(services, svc)
|
|
|
|
}
|
|
|
|
|
|
|
|
return services, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start starts the runtime
|
|
|
|
func (s *svc) Start() error {
|
|
|
|
// NOTE: nothing to be done here
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Stop stops the runtime
|
|
|
|
func (s *svc) Stop() error {
|
|
|
|
// NOTE: nothing to be done here
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the runtime service implementation
|
|
|
|
func (s *svc) String() string {
|
|
|
|
return "service"
|
|
|
|
}
|