1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-03-23 20:32:32 +02:00

Svc metadata (#972)

* Added service metadata

* Added metadata to runtime service

* Add Annotations metadata to service metadata

* Add micro/micro as default service owners

* Update runtime/kubernetes/client/kubernetes.go

Change comment

Co-Authored-By: Jake Sanders <i@am.so-aweso.me>
This commit is contained in:
Milos Gajdos 2019-11-22 17:10:00 +00:00 committed by Asim Aslam
parent 8dc3fb964e
commit 38e29c5101
10 changed files with 209 additions and 124 deletions

View File

@ -152,10 +152,5 @@ func (c *client) List(r *Resource) error {
"micro": "service", "micro": "service",
} }
return api.NewRequest(c.opts). return c.Get(r, labels)
Get().
Resource(r.Kind).
Params(&api.Params{LabelSelector: labels}).
Do().
Into(r.Value)
} }

View File

@ -50,7 +50,6 @@ func DefaultService(name, version string) *Service {
if len(version) > 0 { if len(version) > 0 {
// API service object name joins name and version over "-" // API service object name joins name and version over "-"
svcName = strings.Join([]string{name, version}, "-") svcName = strings.Join([]string{name, version}, "-")
} }
Metadata := &Metadata{ Metadata := &Metadata{
@ -84,26 +83,32 @@ func DefaultDeployment(name, version, source string) *Deployment {
"micro": "service", "micro": "service",
} }
// API deployment object name joins name and version over "=" depName := name
depName := strings.Join([]string{name, version}, "-") if len(version) > 0 {
// API deployment object name joins name and version over "-"
depName = strings.Join([]string{name, version}, "-")
}
Metadata := &Metadata{ Metadata := &Metadata{
Name: depName, Name: depName,
Namespace: "default", Namespace: "default",
Version: version, Version: version,
Labels: Labels, Labels: Labels,
Annotations: map[string]string{
"source": source,
"owner": "micro",
"group": "micro",
},
} }
// TODO: we need to figure out this version stuff // TODO: we need to figure out this version stuff
// might be worth adding Build to runtime.Service // might have to add Build to runtime.Service
buildTime, err := strconv.ParseInt(version, 10, 64) buildTime, err := strconv.ParseInt(version, 10, 64)
if err == nil { if err == nil {
buildUnixTimeUTC := time.Unix(buildTime, 0) buildUnixTimeUTC := time.Unix(buildTime, 0)
Metadata.Annotations = map[string]string{ Metadata.Annotations["build"] = buildUnixTimeUTC.Format(time.RFC3339)
"build": buildUnixTimeUTC.Format(time.RFC3339),
}
} else { } else {
log.Debugf("Runtime could not parse build: %v", err) log.Debugf("could not parse build: %v", err)
} }
// enable go modules by default // enable go modules by default

View File

@ -17,6 +17,12 @@ metadata:
{{ $key }}: "{{ $value }}" {{ $key }}: "{{ $value }}"
{{- end }} {{- end }}
{{- end }} {{- end }}
annotations:
{{- with .Metadata.Annotations }}
{{- range $key, $value := . }}
{{ $key }}: "{{ $value }}"
{{- end }}
{{- end }}
spec: spec:
replicas: {{ .Spec.Replicas }} replicas: {{ .Spec.Replicas }}
selector: selector:

View File

@ -103,13 +103,21 @@ type DeploymentSpec struct {
Template *Template `json:"template,omitempty"` Template *Template `json:"template,omitempty"`
} }
// DeploymentCondition describes the state of deployment
type DeploymentCondition struct {
Type string `json:"type"`
Reason string `json:"reason,omitempty"`
Message string `json:"message,omitempty"`
}
// DeploymentStatus is returned when querying deployment // DeploymentStatus is returned when querying deployment
type DeploymentStatus struct { type DeploymentStatus struct {
Replicas int `json:"replicas,omitempty"` Replicas int `json:"replicas,omitempty"`
UpdatedReplicas int `json:"updatedReplicas,omitempty"` UpdatedReplicas int `json:"updatedReplicas,omitempty"`
ReadyReplicas int `json:"readyReplicas,omitempty"` ReadyReplicas int `json:"readyReplicas,omitempty"`
AvailableReplicas int `json:"availableReplicas,omitempty"` AvailableReplicas int `json:"availableReplicas,omitempty"`
UnavailableReplicas int `json:"unavailableReplicas,omitempty"` UnavailableReplicas int `json:"unavailableReplicas,omitempty"`
Conditions []DeploymentCondition `json:"conditions,omitempty"`
} }
// Deployment is Kubernetes deployment // Deployment is Kubernetes deployment

View File

@ -109,6 +109,90 @@ func (k *kubernetes) Create(s *runtime.Service, opts ...runtime.CreateOption) er
return nil return nil
} }
// getMicroService queries kubernetes for micro service
// NOTE: this function is not thread-safe
func (k *kubernetes) getMicroService(labels map[string]string) ([]*runtime.Service, error) {
// get the service status
serviceList := new(client.ServiceList)
r := &client.Resource{
Kind: "service",
Value: serviceList,
}
if err := k.client.Get(r, labels); err != nil {
return nil, err
}
// get the deployment status
depList := new(client.DeploymentList)
d := &client.Resource{
Kind: "deployment",
Value: depList,
}
if err := k.client.Get(d, labels); err != nil {
return nil, err
}
// service map
svcMap := make(map[string]*runtime.Service)
// collect info from kubernetes service
for _, kservice := range serviceList.Items {
name := kservice.Metadata.Labels["name"]
version := kservice.Metadata.Labels["version"]
svcMap[name] = &runtime.Service{
Name: name,
Version: version,
Metadata: make(map[string]string),
}
// copy annotations metadata into service metadata
for k, v := range kservice.Metadata.Annotations {
svcMap[name].Metadata[k] = v
}
}
// collect additional info from kubernetes deployment
for _, kdep := range depList.Items {
name := kdep.Metadata.Labels["name"]
if svc, ok := svcMap[name]; ok {
// set the service source
svc.Source = kdep.Metadata.Annotations["source"]
// copy all annotations metadata into service metadata
for k, v := range kdep.Metadata.Annotations {
svc.Metadata[k] = v
}
// parse out deployment status
if len(kdep.Status.Conditions) > 0 {
status := kdep.Status.Conditions[0].Type
// pick the last known condition type and mark the service status with it
log.Debugf("Runtime setting %s service deployment status: %v", name, status)
svc.Metadata["status"] = status
}
// parse out deployment build
if build, ok := kdep.Metadata.Annotations["build"]; ok {
buildTime, err := time.Parse(time.RFC3339, build)
if err != nil {
log.Debugf("Runtime failed parsing build time for %s: %v", name, err)
continue
}
svc.Metadata["build"] = fmt.Sprintf("%d", buildTime.Unix())
continue
}
// if no build annotation is found, set it to current time
svc.Metadata["build"] = fmt.Sprintf("%d", time.Now().Unix())
}
}
// collect all the services and return
services := make([]*runtime.Service, 0, len(serviceList.Items))
for _, service := range svcMap {
services = append(services, service)
}
return services, nil
}
// Get returns all instances of given service // Get returns all instances of given service
func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Service, error) { func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Service, error) {
k.Lock() k.Lock()
@ -119,11 +203,12 @@ func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Ser
return nil, errors.New("missing service name") return nil, errors.New("missing service name")
} }
// set the default label // set the default labels
labels := map[string]string{ labels := map[string]string{
"micro": "service", "micro": "service",
"name": name, "name": name,
} }
var options runtime.GetOptions var options runtime.GetOptions
for _, o := range opts { for _, o := range opts {
o(&options) o(&options)
@ -136,25 +221,21 @@ func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Ser
log.Debugf("Runtime querying service %s", name) log.Debugf("Runtime querying service %s", name)
serviceList := new(client.ServiceList) return k.getMicroService(labels)
r := &client.Resource{ }
Kind: "service",
Value: serviceList, // List the managed services
} func (k *kubernetes) List() ([]*runtime.Service, error) {
if err := k.client.Get(r, labels); err != nil { k.Lock()
return nil, err defer k.Unlock()
labels := map[string]string{
"micro": "service",
} }
services := make([]*runtime.Service, 0, len(serviceList.Items)) log.Debugf("Runtime listing all micro services")
for _, kservice := range serviceList.Items {
service := &runtime.Service{
Name: kservice.Metadata.Name,
Version: kservice.Metadata.Version,
}
services = append(services, service)
}
return services, nil return k.getMicroService(labels)
} }
// Update the service in place // Update the service in place
@ -202,39 +283,6 @@ func (k *kubernetes) Delete(s *runtime.Service) error {
return nil return nil
} }
// List the managed services
func (k *kubernetes) List() ([]*runtime.Service, error) {
serviceList := new(client.ServiceList)
r := &client.Resource{
Kind: "service",
Value: serviceList,
}
if err := k.client.List(r); err != nil {
return nil, err
}
log.Debugf("Runtime found %d micro services", len(serviceList.Items))
services := make([]*runtime.Service, 0, len(serviceList.Items))
for _, service := range serviceList.Items {
buildTime, err := time.Parse(time.RFC3339, service.Metadata.Annotations["build"])
if err != nil {
log.Debugf("Runtime error parsing build time for %s: %v", service.Metadata.Name, err)
continue
}
// add the service to the list of services
svc := &runtime.Service{
Name: service.Metadata.Name,
Version: fmt.Sprintf("%d", buildTime.Unix()),
}
services = append(services, svc)
}
return services, nil
}
// run runs the runtime management loop // run runs the runtime management loop
func (k *kubernetes) run(events <-chan runtime.Event) { func (k *kubernetes) run(events <-chan runtime.Event) {
t := time.NewTicker(time.Second * 10) t := time.NewTicker(time.Second * 10)

View File

@ -88,4 +88,6 @@ type Service struct {
Exec []string Exec []string
// Version of the service // Version of the service
Version string Version string
// Metadata stores metadata
Metadata map[string]string
} }

View File

@ -14,21 +14,23 @@ type Runtime struct {
func toProto(s *runtime.Service) *pb.Service { func toProto(s *runtime.Service) *pb.Service {
return &pb.Service{ return &pb.Service{
Name: s.Name, Name: s.Name,
Version: s.Version, Version: s.Version,
Source: s.Source, Source: s.Source,
Path: s.Path, Path: s.Path,
Exec: s.Exec, Exec: s.Exec,
Metadata: s.Metadata,
} }
} }
func toService(s *pb.Service) *runtime.Service { func toService(s *pb.Service) *runtime.Service {
return &runtime.Service{ return &runtime.Service{
Name: s.Name, Name: s.Name,
Version: s.Version, Version: s.Version,
Source: s.Source, Source: s.Source,
Path: s.Path, Path: s.Path,
Exec: s.Exec, Exec: s.Exec,
Metadata: s.Metadata,
} }
} }

View File

@ -30,10 +30,12 @@ type Service struct {
// local path of the source // local path of the source
Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"` Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"`
// command to execute // command to execute
Exec []string `protobuf:"bytes,5,rep,name=exec,proto3" json:"exec,omitempty"` Exec []string `protobuf:"bytes,5,rep,name=exec,proto3" json:"exec,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` // service metadata
XXX_unrecognized []byte `json:"-"` Metadata map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_sizecache int32 `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *Service) Reset() { *m = Service{} } func (m *Service) Reset() { *m = Service{} }
@ -96,6 +98,13 @@ func (m *Service) GetExec() []string {
return nil return nil
} }
func (m *Service) GetMetadata() map[string]string {
if m != nil {
return m.Metadata
}
return nil
}
type CreateOptions struct { type CreateOptions struct {
// command to pass in // command to pass in
Command []string `protobuf:"bytes,1,rep,name=command,proto3" json:"command,omitempty"` Command []string `protobuf:"bytes,1,rep,name=command,proto3" json:"command,omitempty"`
@ -570,6 +579,7 @@ func (m *ListResponse) GetServices() []*Service {
func init() { func init() {
proto.RegisterType((*Service)(nil), "go.micro.runtime.Service") proto.RegisterType((*Service)(nil), "go.micro.runtime.Service")
proto.RegisterMapType((map[string]string)(nil), "go.micro.runtime.Service.MetadataEntry")
proto.RegisterType((*CreateOptions)(nil), "go.micro.runtime.CreateOptions") proto.RegisterType((*CreateOptions)(nil), "go.micro.runtime.CreateOptions")
proto.RegisterType((*CreateRequest)(nil), "go.micro.runtime.CreateRequest") proto.RegisterType((*CreateRequest)(nil), "go.micro.runtime.CreateRequest")
proto.RegisterType((*CreateResponse)(nil), "go.micro.runtime.CreateResponse") proto.RegisterType((*CreateResponse)(nil), "go.micro.runtime.CreateResponse")
@ -587,32 +597,36 @@ func init() {
func init() { proto.RegisterFile("runtime.proto", fileDescriptor_86e2dd377c869464) } func init() { proto.RegisterFile("runtime.proto", fileDescriptor_86e2dd377c869464) }
var fileDescriptor_86e2dd377c869464 = []byte{ var fileDescriptor_86e2dd377c869464 = []byte{
// 425 bytes of a gzipped FileDescriptorProto // 485 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xc9, 0xcb, 0xd3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xcb, 0x6f, 0x94, 0x40,
0x14, 0xff, 0xda, 0xd4, 0x44, 0x5f, 0x8c, 0x94, 0x39, 0xc8, 0x58, 0x5c, 0xca, 0x1c, 0xc4, 0x53, 0x18, 0x2f, 0xcb, 0x16, 0xea, 0x87, 0x98, 0xcd, 0xc4, 0x98, 0x71, 0xe3, 0x63, 0xc3, 0x41, 0x7b,
0x0e, 0x2d, 0x0a, 0x9e, 0x8d, 0xf4, 0x62, 0x11, 0x52, 0x04, 0xaf, 0x31, 0x7d, 0x68, 0xc0, 0x64, 0xe2, 0xb0, 0x8d, 0xc6, 0xc7, 0xb1, 0x34, 0x7b, 0x71, 0x63, 0x42, 0x63, 0xe2, 0x75, 0x64, 0xbf,
0x62, 0x66, 0x52, 0xbd, 0x79, 0xf2, 0xff, 0x96, 0xd9, 0xba, 0xa4, 0x93, 0xef, 0xd2, 0xdb, 0xbc, 0x28, 0xb1, 0x30, 0xc8, 0x0c, 0x1b, 0x7b, 0xf2, 0xe4, 0x1f, 0xed, 0xcd, 0xcc, 0x6b, 0xdb, 0xa5,
0xa5, 0xbf, 0xf7, 0x5b, 0x4a, 0x20, 0xe9, 0xfa, 0x46, 0x56, 0x35, 0xa6, 0x6d, 0xc7, 0x25, 0x27, 0xd0, 0xcb, 0xde, 0xbe, 0x17, 0x3f, 0x7e, 0x0f, 0x02, 0xc4, 0x6d, 0x57, 0xcb, 0xb2, 0xc2, 0xb4,
0xf3, 0xef, 0x3c, 0xad, 0xab, 0xb2, 0xe3, 0xa9, 0xed, 0xb3, 0xdf, 0x10, 0xed, 0xb0, 0x3b, 0x54, 0x69, 0xb9, 0xe4, 0x64, 0xf6, 0x9d, 0xa7, 0x55, 0x59, 0xb4, 0x3c, 0xb5, 0xf3, 0xe4, 0x9f, 0x07,
0x25, 0x12, 0x02, 0xb3, 0xa6, 0xa8, 0x91, 0x4e, 0x96, 0x93, 0x37, 0x8f, 0x72, 0xfd, 0x26, 0x14, 0xe1, 0x25, 0xb6, 0xdb, 0xb2, 0x40, 0x42, 0x60, 0x5a, 0xb3, 0x0a, 0xa9, 0xb7, 0xf0, 0x4e, 0x1f,
0xa2, 0x03, 0x76, 0xa2, 0xe2, 0x0d, 0x9d, 0xea, 0xb6, 0x2b, 0xc9, 0x53, 0x08, 0x05, 0xef, 0xbb, 0xe4, 0xba, 0x26, 0x14, 0xc2, 0x2d, 0xb6, 0xa2, 0xe4, 0x35, 0x9d, 0xe8, 0xb1, 0x6b, 0xc9, 0x13,
0x12, 0x69, 0xa0, 0x07, 0xb6, 0x52, 0x28, 0x6d, 0x21, 0x7f, 0xd0, 0x99, 0x41, 0x51, 0x6f, 0xd5, 0x08, 0x04, 0xef, 0xda, 0x02, 0xa9, 0xaf, 0x17, 0xb6, 0x53, 0x28, 0x0d, 0x93, 0x3f, 0xe8, 0xd4,
0xc3, 0x3f, 0x58, 0xd2, 0x07, 0xcb, 0x40, 0xf5, 0xd4, 0x9b, 0xed, 0x20, 0xf9, 0xd0, 0x61, 0x21, 0xa0, 0xa8, 0x5a, 0xcd, 0xf0, 0x37, 0x16, 0xf4, 0x78, 0xe1, 0xab, 0x99, 0xaa, 0xc9, 0x39, 0x9c,
0xf1, 0x73, 0x2b, 0x2b, 0xde, 0x08, 0x75, 0xaa, 0xe4, 0x75, 0x5d, 0x34, 0x7b, 0x3a, 0xd1, 0x7b, 0x54, 0x28, 0xd9, 0x86, 0x49, 0x46, 0x83, 0x85, 0x7f, 0x1a, 0x2d, 0x5f, 0xa7, 0x7d, 0x7a, 0xa9,
0xae, 0x24, 0x73, 0x08, 0xb0, 0x39, 0xd0, 0xa9, 0xee, 0xaa, 0xa7, 0x3a, 0xce, 0x7b, 0xd9, 0xf6, 0xa5, 0x96, 0xae, 0xed, 0xe5, 0x45, 0x2d, 0xdb, 0xeb, 0x7c, 0xf7, 0xe0, 0xfc, 0x23, 0xc4, 0x7b,
0xd2, 0x1d, 0x37, 0x15, 0xfb, 0xeb, 0x40, 0x73, 0xfc, 0xd5, 0xa3, 0x90, 0x64, 0x0d, 0x91, 0x30, 0x2b, 0x32, 0x03, 0xff, 0x27, 0x5e, 0x5b, 0x09, 0xaa, 0x24, 0x8f, 0xe1, 0x78, 0xcb, 0xae, 0x3a,
0xf2, 0xb4, 0xac, 0x78, 0xf5, 0x2c, 0x1d, 0x5a, 0x90, 0x5a, 0xfd, 0xb9, 0xdb, 0x24, 0xef, 0x21, 0xb4, 0xfc, 0x4d, 0xf3, 0x61, 0xf2, 0xce, 0x4b, 0x2e, 0x21, 0x3e, 0x6f, 0x91, 0x49, 0xfc, 0xdc,
0xe2, 0x86, 0x94, 0x16, 0x1d, 0xaf, 0x5e, 0x5d, 0xff, 0xe8, 0x82, 0x7b, 0xee, 0xf6, 0xd9, 0x1c, 0xc8, 0x92, 0xd7, 0x42, 0x89, 0x2d, 0x78, 0x55, 0xb1, 0x7a, 0x43, 0x3d, 0xcd, 0xd4, 0xb5, 0x0a,
0x9e, 0x38, 0x02, 0xa2, 0xe5, 0x8d, 0x40, 0xf6, 0x1a, 0x60, 0x83, 0xf2, 0x4c, 0xa4, 0xdf, 0x4f, 0x16, 0xeb, 0x2d, 0x9d, 0xe8, 0xa9, 0x2a, 0x95, 0x7c, 0xde, 0xc9, 0xa6, 0x93, 0x4e, 0xbe, 0xe9,
0xf6, 0x55, 0xef, 0x39, 0xde, 0xbe, 0x2c, 0xde, 0x0d, 0x69, 0x3d, 0xbf, 0xa6, 0x75, 0x3a, 0x75, 0x92, 0x3f, 0x0e, 0x34, 0xc7, 0x5f, 0x1d, 0x0a, 0x49, 0xce, 0x20, 0x14, 0x46, 0x85, 0x66, 0x15,
0xe2, 0x94, 0x41, 0xac, 0x91, 0x0d, 0x21, 0xf2, 0x16, 0x1e, 0x5a, 0xa1, 0x42, 0x1b, 0x7d, 0xaf, 0x2d, 0x9f, 0x8e, 0xca, 0xcc, 0xdd, 0x25, 0x79, 0x0f, 0x21, 0x37, 0xa4, 0x34, 0xed, 0x68, 0xf9,
0x27, 0xc7, 0x55, 0x96, 0x41, 0x92, 0xe1, 0x4f, 0xbc, 0xcd, 0x5a, 0xe5, 0x8f, 0x43, 0xb1, 0xfe, 0xf2, 0xee, 0x43, 0x7b, 0xdc, 0x73, 0x77, 0x9f, 0xcc, 0xe0, 0x91, 0x23, 0x20, 0x1a, 0x5e, 0x0b,
0x64, 0x90, 0x7c, 0x69, 0xf7, 0xc5, 0xed, 0xb8, 0x0e, 0xc5, 0xe2, 0x26, 0x10, 0x7f, 0xaa, 0x84, 0x4c, 0x5e, 0x01, 0xac, 0x50, 0xde, 0x12, 0x39, 0x9c, 0x68, 0xf2, 0x55, 0xdf, 0x39, 0xde, 0x43,
0x33, 0x94, 0x7d, 0x84, 0xc7, 0xa6, 0xbc, 0xc9, 0x85, 0xd5, 0xbf, 0x00, 0xa2, 0xdc, 0x4c, 0xc9, 0x5f, 0xc3, 0xdb, 0x3e, 0xad, 0x67, 0x77, 0x69, 0xdd, 0xbc, 0xea, 0x86, 0x53, 0x06, 0x91, 0x46,
0x16, 0x42, 0x93, 0x35, 0x19, 0xfd, 0x7f, 0xd8, 0xeb, 0x8b, 0xe5, 0xf8, 0x82, 0xa5, 0x7b, 0x47, 0x36, 0x84, 0xc8, 0x1b, 0x38, 0xb1, 0x42, 0x85, 0x36, 0xfa, 0x5e, 0x4f, 0x76, 0xa7, 0x49, 0x06,
0x32, 0x08, 0x36, 0x28, 0x89, 0x3f, 0x54, 0x07, 0xf4, 0x62, 0x64, 0x7a, 0x44, 0xd9, 0x42, 0x68, 0x71, 0x86, 0x57, 0x78, 0x98, 0xb5, 0xca, 0x1f, 0x87, 0x62, 0xfd, 0xc9, 0x20, 0xfe, 0xd2, 0x6c,
0x0c, 0xf6, 0x91, 0xba, 0x08, 0xd0, 0x47, 0x6a, 0x90, 0x8d, 0x86, 0x33, 0xbe, 0xfa, 0xe0, 0x2e, 0xd8, 0xe1, 0xb8, 0x0e, 0xc5, 0xe2, 0xc6, 0x10, 0x7d, 0x2a, 0x85, 0x33, 0x34, 0xb9, 0x80, 0x87,
0x72, 0xf3, 0xc1, 0x0d, 0x22, 0xb9, 0x23, 0x1b, 0x98, 0xa9, 0x14, 0x88, 0x47, 0xc6, 0x59, 0x58, 0xa6, 0x3d, 0xc8, 0x85, 0xe5, 0x5f, 0x1f, 0xc2, 0xdc, 0x6c, 0xc9, 0x1a, 0x02, 0x93, 0x35, 0x19,
0x8b, 0x97, 0x63, 0x63, 0x07, 0xf4, 0x2d, 0xd4, 0xdf, 0xb3, 0xf5, 0xff, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x3e, 0xec, 0xdb, 0xe7, 0x8b, 0xf1, 0x03, 0x4b, 0xf7, 0x88, 0x64, 0xe0, 0xaf, 0x50, 0x92,
0xff, 0x2f, 0x63, 0x84, 0x1c, 0xe0, 0x04, 0x00, 0x00, 0xe1, 0x50, 0x1d, 0xd0, 0xf3, 0x91, 0xed, 0x0e, 0x65, 0x0d, 0x81, 0x31, 0x78, 0x88, 0xd4, 0x5e,
0x80, 0x43, 0xa4, 0x7a, 0xd9, 0x68, 0x38, 0xe3, 0xeb, 0x10, 0xdc, 0x5e, 0x6e, 0x43, 0x70, 0xbd,
0x48, 0x8e, 0xc8, 0x0a, 0xa6, 0x2a, 0x05, 0x32, 0x20, 0xe3, 0x56, 0x58, 0xf3, 0x17, 0x63, 0x6b,
0x07, 0xf4, 0x2d, 0xd0, 0xbf, 0xd4, 0xb3, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0xce, 0x6e,
0x31, 0x63, 0x05, 0x00, 0x00,
} }

View File

@ -21,6 +21,8 @@ message Service {
string path = 4; string path = 4;
// command to execute // command to execute
repeated string exec = 5; repeated string exec = 5;
// service metadata
map<string,string> metadata = 6;
} }
message CreateOptions { message CreateOptions {

View File

@ -57,9 +57,10 @@ func (s *svc) Create(svc *runtime.Service, opts ...runtime.CreateOption) error {
// runtime service create request // runtime service create request
req := &pb.CreateRequest{ req := &pb.CreateRequest{
Service: &pb.Service{ Service: &pb.Service{
Name: svc.Name, Name: svc.Name,
Version: svc.Version, Version: svc.Version,
Source: svc.Source, Source: svc.Source,
Metadata: svc.Metadata,
}, },
Options: &pb.CreateOptions{ Options: &pb.CreateOptions{
Command: options.Command, Command: options.Command,
@ -98,11 +99,12 @@ func (s *svc) Get(name string, opts ...runtime.GetOption) ([]*runtime.Service, e
services := make([]*runtime.Service, 0, len(resp.Services)) services := make([]*runtime.Service, 0, len(resp.Services))
for _, service := range resp.Services { for _, service := range resp.Services {
svc := &runtime.Service{ svc := &runtime.Service{
Name: service.Name, Name: service.Name,
Version: service.Version, Version: service.Version,
Source: service.Source, Source: service.Source,
Path: service.Path, Path: service.Path,
Exec: service.Exec, Exec: service.Exec,
Metadata: service.Metadata,
} }
services = append(services, svc) services = append(services, svc)
} }
@ -155,11 +157,12 @@ func (s *svc) List() ([]*runtime.Service, error) {
services := make([]*runtime.Service, 0, len(resp.Services)) services := make([]*runtime.Service, 0, len(resp.Services))
for _, service := range resp.Services { for _, service := range resp.Services {
svc := &runtime.Service{ svc := &runtime.Service{
Name: service.Name, Name: service.Name,
Version: service.Version, Version: service.Version,
Source: service.Source, Source: service.Source,
Path: service.Path, Path: service.Path,
Exec: service.Exec, Exec: service.Exec,
Metadata: service.Metadata,
} }
services = append(services, svc) services = append(services, svc)
} }