From 38e29c510192f1dd5b20721c53ffe9578e7f66de Mon Sep 17 00:00:00 2001 From: Milos Gajdos <milosgajdos83@gmail.com> Date: Fri, 22 Nov 2019 17:10:00 +0000 Subject: [PATCH] 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> --- runtime/kubernetes/client/client.go | 7 +- runtime/kubernetes/client/kubernetes.go | 21 ++-- runtime/kubernetes/client/templates.go | 6 + runtime/kubernetes/client/types.go | 18 ++- runtime/kubernetes/kubernetes.go | 148 ++++++++++++++++-------- runtime/runtime.go | 2 + runtime/service/handler/handler.go | 22 ++-- runtime/service/proto/runtime.pb.go | 78 ++++++++----- runtime/service/proto/runtime.proto | 2 + runtime/service/service.go | 29 ++--- 10 files changed, 209 insertions(+), 124 deletions(-) diff --git a/runtime/kubernetes/client/client.go b/runtime/kubernetes/client/client.go index bfebad9b..6206ea15 100644 --- a/runtime/kubernetes/client/client.go +++ b/runtime/kubernetes/client/client.go @@ -152,10 +152,5 @@ func (c *client) List(r *Resource) error { "micro": "service", } - return api.NewRequest(c.opts). - Get(). - Resource(r.Kind). - Params(&api.Params{LabelSelector: labels}). - Do(). - Into(r.Value) + return c.Get(r, labels) } diff --git a/runtime/kubernetes/client/kubernetes.go b/runtime/kubernetes/client/kubernetes.go index ab8731b8..0de53b59 100644 --- a/runtime/kubernetes/client/kubernetes.go +++ b/runtime/kubernetes/client/kubernetes.go @@ -50,7 +50,6 @@ func DefaultService(name, version string) *Service { if len(version) > 0 { // API service object name joins name and version over "-" svcName = strings.Join([]string{name, version}, "-") - } Metadata := &Metadata{ @@ -84,26 +83,32 @@ func DefaultDeployment(name, version, source string) *Deployment { "micro": "service", } - // API deployment object name joins name and version over "=" - depName := strings.Join([]string{name, version}, "-") + depName := name + if len(version) > 0 { + // API deployment object name joins name and version over "-" + depName = strings.Join([]string{name, version}, "-") + } Metadata := &Metadata{ Name: depName, Namespace: "default", Version: version, Labels: Labels, + Annotations: map[string]string{ + "source": source, + "owner": "micro", + "group": "micro", + }, } // 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) if err == nil { buildUnixTimeUTC := time.Unix(buildTime, 0) - Metadata.Annotations = map[string]string{ - "build": buildUnixTimeUTC.Format(time.RFC3339), - } + Metadata.Annotations["build"] = buildUnixTimeUTC.Format(time.RFC3339) } else { - log.Debugf("Runtime could not parse build: %v", err) + log.Debugf("could not parse build: %v", err) } // enable go modules by default diff --git a/runtime/kubernetes/client/templates.go b/runtime/kubernetes/client/templates.go index 48ae6efc..8f960051 100644 --- a/runtime/kubernetes/client/templates.go +++ b/runtime/kubernetes/client/templates.go @@ -17,6 +17,12 @@ metadata: {{ $key }}: "{{ $value }}" {{- end }} {{- end }} + annotations: + {{- with .Metadata.Annotations }} + {{- range $key, $value := . }} + {{ $key }}: "{{ $value }}" + {{- end }} + {{- end }} spec: replicas: {{ .Spec.Replicas }} selector: diff --git a/runtime/kubernetes/client/types.go b/runtime/kubernetes/client/types.go index 882b826e..b9bfa4a3 100644 --- a/runtime/kubernetes/client/types.go +++ b/runtime/kubernetes/client/types.go @@ -103,13 +103,21 @@ type DeploymentSpec struct { 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 type DeploymentStatus struct { - Replicas int `json:"replicas,omitempty"` - UpdatedReplicas int `json:"updatedReplicas,omitempty"` - ReadyReplicas int `json:"readyReplicas,omitempty"` - AvailableReplicas int `json:"availableReplicas,omitempty"` - UnavailableReplicas int `json:"unavailableReplicas,omitempty"` + Replicas int `json:"replicas,omitempty"` + UpdatedReplicas int `json:"updatedReplicas,omitempty"` + ReadyReplicas int `json:"readyReplicas,omitempty"` + AvailableReplicas int `json:"availableReplicas,omitempty"` + UnavailableReplicas int `json:"unavailableReplicas,omitempty"` + Conditions []DeploymentCondition `json:"conditions,omitempty"` } // Deployment is Kubernetes deployment diff --git a/runtime/kubernetes/kubernetes.go b/runtime/kubernetes/kubernetes.go index 1939c46a..26956856 100644 --- a/runtime/kubernetes/kubernetes.go +++ b/runtime/kubernetes/kubernetes.go @@ -109,6 +109,90 @@ func (k *kubernetes) Create(s *runtime.Service, opts ...runtime.CreateOption) er 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 func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Service, error) { k.Lock() @@ -119,11 +203,12 @@ func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Ser return nil, errors.New("missing service name") } - // set the default label + // set the default labels labels := map[string]string{ "micro": "service", "name": name, } + var options runtime.GetOptions for _, o := range opts { o(&options) @@ -136,25 +221,21 @@ func (k *kubernetes) Get(name string, opts ...runtime.GetOption) ([]*runtime.Ser log.Debugf("Runtime querying service %s", name) - serviceList := new(client.ServiceList) - r := &client.Resource{ - Kind: "service", - Value: serviceList, - } - if err := k.client.Get(r, labels); err != nil { - return nil, err + return k.getMicroService(labels) +} + +// List the managed services +func (k *kubernetes) List() ([]*runtime.Service, error) { + k.Lock() + defer k.Unlock() + + labels := map[string]string{ + "micro": "service", } - services := make([]*runtime.Service, 0, len(serviceList.Items)) - for _, kservice := range serviceList.Items { - service := &runtime.Service{ - Name: kservice.Metadata.Name, - Version: kservice.Metadata.Version, - } - services = append(services, service) - } + log.Debugf("Runtime listing all micro services") - return services, nil + return k.getMicroService(labels) } // Update the service in place @@ -202,39 +283,6 @@ func (k *kubernetes) Delete(s *runtime.Service) error { 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 func (k *kubernetes) run(events <-chan runtime.Event) { t := time.NewTicker(time.Second * 10) diff --git a/runtime/runtime.go b/runtime/runtime.go index 9b241e02..e323614d 100644 --- a/runtime/runtime.go +++ b/runtime/runtime.go @@ -88,4 +88,6 @@ type Service struct { Exec []string // Version of the service Version string + // Metadata stores metadata + Metadata map[string]string } diff --git a/runtime/service/handler/handler.go b/runtime/service/handler/handler.go index aecef40b..f7694d79 100644 --- a/runtime/service/handler/handler.go +++ b/runtime/service/handler/handler.go @@ -14,21 +14,23 @@ type Runtime struct { func toProto(s *runtime.Service) *pb.Service { return &pb.Service{ - Name: s.Name, - Version: s.Version, - Source: s.Source, - Path: s.Path, - Exec: s.Exec, + Name: s.Name, + Version: s.Version, + Source: s.Source, + Path: s.Path, + Exec: s.Exec, + Metadata: s.Metadata, } } func toService(s *pb.Service) *runtime.Service { return &runtime.Service{ - Name: s.Name, - Version: s.Version, - Source: s.Source, - Path: s.Path, - Exec: s.Exec, + Name: s.Name, + Version: s.Version, + Source: s.Source, + Path: s.Path, + Exec: s.Exec, + Metadata: s.Metadata, } } diff --git a/runtime/service/proto/runtime.pb.go b/runtime/service/proto/runtime.pb.go index 7a9d2bc1..5e7d8938 100644 --- a/runtime/service/proto/runtime.pb.go +++ b/runtime/service/proto/runtime.pb.go @@ -30,10 +30,12 @@ type Service struct { // local path of the source Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"` // command to execute - Exec []string `protobuf:"bytes,5,rep,name=exec,proto3" json:"exec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Exec []string `protobuf:"bytes,5,rep,name=exec,proto3" json:"exec,omitempty"` + // service metadata + 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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Service) Reset() { *m = Service{} } @@ -96,6 +98,13 @@ func (m *Service) GetExec() []string { return nil } +func (m *Service) GetMetadata() map[string]string { + if m != nil { + return m.Metadata + } + return nil +} + type CreateOptions struct { // command to pass in Command []string `protobuf:"bytes,1,rep,name=command,proto3" json:"command,omitempty"` @@ -570,6 +579,7 @@ func (m *ListResponse) GetServices() []*Service { func init() { 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((*CreateRequest)(nil), "go.micro.runtime.CreateRequest") proto.RegisterType((*CreateResponse)(nil), "go.micro.runtime.CreateResponse") @@ -587,32 +597,36 @@ func init() { func init() { proto.RegisterFile("runtime.proto", fileDescriptor_86e2dd377c869464) } var fileDescriptor_86e2dd377c869464 = []byte{ - // 425 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xc9, 0xcb, 0xd3, 0x40, - 0x14, 0xff, 0xda, 0xd4, 0x44, 0x5f, 0x8c, 0x94, 0x39, 0xc8, 0x58, 0x5c, 0xca, 0x1c, 0xc4, 0x53, - 0x0e, 0x2d, 0x0a, 0x9e, 0x8d, 0xf4, 0x62, 0x11, 0x52, 0x04, 0xaf, 0x31, 0x7d, 0x68, 0xc0, 0x64, - 0x62, 0x66, 0x52, 0xbd, 0x79, 0xf2, 0xff, 0x96, 0xd9, 0xba, 0xa4, 0x93, 0xef, 0xd2, 0xdb, 0xbc, - 0xa5, 0xbf, 0xf7, 0x5b, 0x4a, 0x20, 0xe9, 0xfa, 0x46, 0x56, 0x35, 0xa6, 0x6d, 0xc7, 0x25, 0x27, - 0xf3, 0xef, 0x3c, 0xad, 0xab, 0xb2, 0xe3, 0xa9, 0xed, 0xb3, 0xdf, 0x10, 0xed, 0xb0, 0x3b, 0x54, - 0x25, 0x12, 0x02, 0xb3, 0xa6, 0xa8, 0x91, 0x4e, 0x96, 0x93, 0x37, 0x8f, 0x72, 0xfd, 0x26, 0x14, - 0xa2, 0x03, 0x76, 0xa2, 0xe2, 0x0d, 0x9d, 0xea, 0xb6, 0x2b, 0xc9, 0x53, 0x08, 0x05, 0xef, 0xbb, - 0x12, 0x69, 0xa0, 0x07, 0xb6, 0x52, 0x28, 0x6d, 0x21, 0x7f, 0xd0, 0x99, 0x41, 0x51, 0x6f, 0xd5, - 0xc3, 0x3f, 0x58, 0xd2, 0x07, 0xcb, 0x40, 0xf5, 0xd4, 0x9b, 0xed, 0x20, 0xf9, 0xd0, 0x61, 0x21, - 0xf1, 0x73, 0x2b, 0x2b, 0xde, 0x08, 0x75, 0xaa, 0xe4, 0x75, 0x5d, 0x34, 0x7b, 0x3a, 0xd1, 0x7b, - 0xae, 0x24, 0x73, 0x08, 0xb0, 0x39, 0xd0, 0xa9, 0xee, 0xaa, 0xa7, 0x3a, 0xce, 0x7b, 0xd9, 0xf6, - 0xd2, 0x1d, 0x37, 0x15, 0xfb, 0xeb, 0x40, 0x73, 0xfc, 0xd5, 0xa3, 0x90, 0x64, 0x0d, 0x91, 0x30, - 0xf2, 0xb4, 0xac, 0x78, 0xf5, 0x2c, 0x1d, 0x5a, 0x90, 0x5a, 0xfd, 0xb9, 0xdb, 0x24, 0xef, 0x21, - 0xe2, 0x86, 0x94, 0x16, 0x1d, 0xaf, 0x5e, 0x5d, 0xff, 0xe8, 0x82, 0x7b, 0xee, 0xf6, 0xd9, 0x1c, - 0x9e, 0x38, 0x02, 0xa2, 0xe5, 0x8d, 0x40, 0xf6, 0x1a, 0x60, 0x83, 0xf2, 0x4c, 0xa4, 0xdf, 0x4f, - 0xf6, 0x55, 0xef, 0x39, 0xde, 0xbe, 0x2c, 0xde, 0x0d, 0x69, 0x3d, 0xbf, 0xa6, 0x75, 0x3a, 0x75, - 0xe2, 0x94, 0x41, 0xac, 0x91, 0x0d, 0x21, 0xf2, 0x16, 0x1e, 0x5a, 0xa1, 0x42, 0x1b, 0x7d, 0xaf, - 0x27, 0xc7, 0x55, 0x96, 0x41, 0x92, 0xe1, 0x4f, 0xbc, 0xcd, 0x5a, 0xe5, 0x8f, 0x43, 0xb1, 0xfe, - 0x64, 0x90, 0x7c, 0x69, 0xf7, 0xc5, 0xed, 0xb8, 0x0e, 0xc5, 0xe2, 0x26, 0x10, 0x7f, 0xaa, 0x84, - 0x33, 0x94, 0x7d, 0x84, 0xc7, 0xa6, 0xbc, 0xc9, 0x85, 0xd5, 0xbf, 0x00, 0xa2, 0xdc, 0x4c, 0xc9, - 0x16, 0x42, 0x93, 0x35, 0x19, 0xfd, 0x7f, 0xd8, 0xeb, 0x8b, 0xe5, 0xf8, 0x82, 0xa5, 0x7b, 0x47, - 0x32, 0x08, 0x36, 0x28, 0x89, 0x3f, 0x54, 0x07, 0xf4, 0x62, 0x64, 0x7a, 0x44, 0xd9, 0x42, 0x68, - 0x0c, 0xf6, 0x91, 0xba, 0x08, 0xd0, 0x47, 0x6a, 0x90, 0x8d, 0x86, 0x33, 0xbe, 0xfa, 0xe0, 0x2e, - 0x72, 0xf3, 0xc1, 0x0d, 0x22, 0xb9, 0x23, 0x1b, 0x98, 0xa9, 0x14, 0x88, 0x47, 0xc6, 0x59, 0x58, - 0x8b, 0x97, 0x63, 0x63, 0x07, 0xf4, 0x2d, 0xd4, 0xdf, 0xb3, 0xf5, 0xff, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x2f, 0x63, 0x84, 0x1c, 0xe0, 0x04, 0x00, 0x00, + // 485 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xcb, 0x6f, 0x94, 0x40, + 0x18, 0x2f, 0xcb, 0x16, 0xea, 0x87, 0x98, 0xcd, 0xc4, 0x98, 0x71, 0xe3, 0x63, 0xc3, 0x41, 0x7b, + 0xe2, 0xb0, 0x8d, 0xc6, 0xc7, 0xb1, 0x34, 0x7b, 0x71, 0x63, 0x42, 0x63, 0xe2, 0x75, 0x64, 0xbf, + 0x28, 0xb1, 0x30, 0xc8, 0x0c, 0x1b, 0x7b, 0xf2, 0xe4, 0x1f, 0xed, 0xcd, 0xcc, 0x6b, 0xdb, 0xa5, + 0xd0, 0xcb, 0xde, 0xbe, 0x17, 0x3f, 0x7e, 0x0f, 0x02, 0xc4, 0x6d, 0x57, 0xcb, 0xb2, 0xc2, 0xb4, + 0x69, 0xb9, 0xe4, 0x64, 0xf6, 0x9d, 0xa7, 0x55, 0x59, 0xb4, 0x3c, 0xb5, 0xf3, 0xe4, 0x9f, 0x07, + 0xe1, 0x25, 0xb6, 0xdb, 0xb2, 0x40, 0x42, 0x60, 0x5a, 0xb3, 0x0a, 0xa9, 0xb7, 0xf0, 0x4e, 0x1f, + 0xe4, 0xba, 0x26, 0x14, 0xc2, 0x2d, 0xb6, 0xa2, 0xe4, 0x35, 0x9d, 0xe8, 0xb1, 0x6b, 0xc9, 0x13, + 0x08, 0x04, 0xef, 0xda, 0x02, 0xa9, 0xaf, 0x17, 0xb6, 0x53, 0x28, 0x0d, 0x93, 0x3f, 0xe8, 0xd4, + 0xa0, 0xa8, 0x5a, 0xcd, 0xf0, 0x37, 0x16, 0xf4, 0x78, 0xe1, 0xab, 0x99, 0xaa, 0xc9, 0x39, 0x9c, + 0x54, 0x28, 0xd9, 0x86, 0x49, 0x46, 0x83, 0x85, 0x7f, 0x1a, 0x2d, 0x5f, 0xa7, 0x7d, 0x7a, 0xa9, + 0xa5, 0x96, 0xae, 0xed, 0xe5, 0x45, 0x2d, 0xdb, 0xeb, 0x7c, 0xf7, 0xe0, 0xfc, 0x23, 0xc4, 0x7b, + 0x2b, 0x32, 0x03, 0xff, 0x27, 0x5e, 0x5b, 0x09, 0xaa, 0x24, 0x8f, 0xe1, 0x78, 0xcb, 0xae, 0x3a, + 0xb4, 0xfc, 0x4d, 0xf3, 0x61, 0xf2, 0xce, 0x4b, 0x2e, 0x21, 0x3e, 0x6f, 0x91, 0x49, 0xfc, 0xdc, + 0xc8, 0x92, 0xd7, 0x42, 0x89, 0x2d, 0x78, 0x55, 0xb1, 0x7a, 0x43, 0x3d, 0xcd, 0xd4, 0xb5, 0x0a, + 0x16, 0xeb, 0x2d, 0x9d, 0xe8, 0xa9, 0x2a, 0x95, 0x7c, 0xde, 0xc9, 0xa6, 0x93, 0x4e, 0xbe, 0xe9, + 0x92, 0x3f, 0x0e, 0x34, 0xc7, 0x5f, 0x1d, 0x0a, 0x49, 0xce, 0x20, 0x14, 0x46, 0x85, 0x66, 0x15, + 0x2d, 0x9f, 0x8e, 0xca, 0xcc, 0xdd, 0x25, 0x79, 0x0f, 0x21, 0x37, 0xa4, 0x34, 0xed, 0x68, 0xf9, + 0xf2, 0xee, 0x43, 0x7b, 0xdc, 0x73, 0x77, 0x9f, 0xcc, 0xe0, 0x91, 0x23, 0x20, 0x1a, 0x5e, 0x0b, + 0x4c, 0x5e, 0x01, 0xac, 0x50, 0xde, 0x12, 0x39, 0x9c, 0x68, 0xf2, 0x55, 0xdf, 0x39, 0xde, 0x43, + 0x5f, 0xc3, 0xdb, 0x3e, 0xad, 0x67, 0x77, 0x69, 0xdd, 0xbc, 0xea, 0x86, 0x53, 0x06, 0x91, 0x46, + 0x36, 0x84, 0xc8, 0x1b, 0x38, 0xb1, 0x42, 0x85, 0x36, 0xfa, 0x5e, 0x4f, 0x76, 0xa7, 0x49, 0x06, + 0x71, 0x86, 0x57, 0x78, 0x98, 0xb5, 0xca, 0x1f, 0x87, 0x62, 0xfd, 0xc9, 0x20, 0xfe, 0xd2, 0x6c, + 0xd8, 0xe1, 0xb8, 0x0e, 0xc5, 0xe2, 0xc6, 0x10, 0x7d, 0x2a, 0x85, 0x33, 0x34, 0xb9, 0x80, 0x87, + 0xa6, 0x3d, 0xc8, 0x85, 0xe5, 0x5f, 0x1f, 0xc2, 0xdc, 0x6c, 0xc9, 0x1a, 0x02, 0x93, 0x35, 0x19, + 0xfd, 0x3e, 0xec, 0xdb, 0xe7, 0x8b, 0xf1, 0x03, 0x4b, 0xf7, 0x88, 0x64, 0xe0, 0xaf, 0x50, 0x92, + 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, } diff --git a/runtime/service/proto/runtime.proto b/runtime/service/proto/runtime.proto index 6abd1638..44a83df4 100644 --- a/runtime/service/proto/runtime.proto +++ b/runtime/service/proto/runtime.proto @@ -21,6 +21,8 @@ message Service { string path = 4; // command to execute repeated string exec = 5; + // service metadata + map<string,string> metadata = 6; } message CreateOptions { diff --git a/runtime/service/service.go b/runtime/service/service.go index 347086fd..00752989 100644 --- a/runtime/service/service.go +++ b/runtime/service/service.go @@ -57,9 +57,10 @@ func (s *svc) Create(svc *runtime.Service, opts ...runtime.CreateOption) error { // runtime service create request req := &pb.CreateRequest{ Service: &pb.Service{ - Name: svc.Name, - Version: svc.Version, - Source: svc.Source, + Name: svc.Name, + Version: svc.Version, + Source: svc.Source, + Metadata: svc.Metadata, }, Options: &pb.CreateOptions{ 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)) for _, service := range resp.Services { svc := &runtime.Service{ - Name: service.Name, - Version: service.Version, - Source: service.Source, - Path: service.Path, - Exec: service.Exec, + Name: service.Name, + Version: service.Version, + Source: service.Source, + Path: service.Path, + Exec: service.Exec, + Metadata: service.Metadata, } services = append(services, svc) } @@ -155,11 +157,12 @@ func (s *svc) List() ([]*runtime.Service, error) { services := make([]*runtime.Service, 0, len(resp.Services)) for _, service := range resp.Services { svc := &runtime.Service{ - Name: service.Name, - Version: service.Version, - Source: service.Source, - Path: service.Path, - Exec: service.Exec, + Name: service.Name, + Version: service.Version, + Source: service.Source, + Path: service.Path, + Exec: service.Exec, + Metadata: service.Metadata, } services = append(services, svc) }