K8s list deployments (#921)
* Outline of ListDeployments method * Added implementation of DeploymentList
This commit is contained in:
parent
0e3550229b
commit
6f28852e1b
@ -103,7 +103,7 @@ func (r *Request) Body(in interface{}) *Request {
|
|||||||
// Params isused to set paramters on a request
|
// Params isused to set paramters on a request
|
||||||
func (r *Request) Params(p *Params) *Request {
|
func (r *Request) Params(p *Params) *Request {
|
||||||
for k, v := range p.LabelSelector {
|
for k, v := range p.LabelSelector {
|
||||||
r.params.Add("labelSelectors", k+"="+v)
|
r.params.Add("labelSelector", k+"="+v)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
@ -90,7 +90,7 @@ func detectNamespace() (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateDeployment
|
// UpdateDeployment patches kubernetes deployment with metadata provided in body
|
||||||
func (c *client) UpdateDeployment(name string, body interface{}) error {
|
func (c *client) UpdateDeployment(name string, body interface{}) error {
|
||||||
return api.NewRequest(c.opts).
|
return api.NewRequest(c.opts).
|
||||||
Patch().
|
Patch().
|
||||||
@ -100,3 +100,16 @@ func (c *client) UpdateDeployment(name string, body interface{}) error {
|
|||||||
Do().
|
Do().
|
||||||
Error()
|
Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListDeployments lists all kubernetes deployments with given labels
|
||||||
|
func (c *client) ListDeployments(labels map[string]string) (*DeploymentList, error) {
|
||||||
|
var deployments DeploymentList
|
||||||
|
err := api.NewRequest(c.opts).
|
||||||
|
Get().
|
||||||
|
Resource("deployments").
|
||||||
|
Params(&api.Params{LabelSelector: labels}).
|
||||||
|
Do().
|
||||||
|
Into(&deployments)
|
||||||
|
|
||||||
|
return &deployments, err
|
||||||
|
}
|
||||||
|
@ -4,9 +4,30 @@ package client
|
|||||||
type Kubernetes interface {
|
type Kubernetes interface {
|
||||||
// UpdateDeployment patches deployment annotations with new metadata
|
// UpdateDeployment patches deployment annotations with new metadata
|
||||||
UpdateDeployment(string, interface{}) error
|
UpdateDeployment(string, interface{}) error
|
||||||
|
// ListDeployments lists all micro deployments
|
||||||
|
ListDeployments(labels map[string]string) (*DeploymentList, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata defines api request metadata
|
// Metadata defines api request metadata
|
||||||
type Metadata struct {
|
type Metadata struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Labels map[string]string `json:"labels,omitempty"`
|
||||||
Annotations map[string]string `json:"annotations,omitempty"`
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeploymentList
|
||||||
|
type DeploymentList struct {
|
||||||
|
Items []Deployment `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deployment is Kubernetes deployment
|
||||||
|
type Deployment struct {
|
||||||
|
Metadata *Metadata `json:"metadata"`
|
||||||
|
Status *Status `json:"status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status is Kubernetes deployment status
|
||||||
|
type Status struct {
|
||||||
|
Replicas int `json:"replicas"`
|
||||||
|
AvailableReplicas int `json:"availablereplicas"`
|
||||||
|
}
|
||||||
|
@ -137,14 +137,31 @@ func (k *kubernetes) Update(s *runtime.Service) error {
|
|||||||
|
|
||||||
// List the managed services
|
// List the managed services
|
||||||
func (k *kubernetes) List() ([]*runtime.Service, error) {
|
func (k *kubernetes) List() ([]*runtime.Service, error) {
|
||||||
// TODO: this should list the k8s deployments
|
labels := map[string]string{
|
||||||
// but for now we return in-memory tracked services
|
"micro": "service",
|
||||||
services := make([]*runtime.Service, 0, len(k.services))
|
}
|
||||||
k.RLock()
|
// list all micro core deployments
|
||||||
defer k.RUnlock()
|
deployments, err := k.client.ListDeployments(labels)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
for _, service := range k.services {
|
log.Debugf("Runtime found %d micro deployments with labels %v", len(deployments.Items), labels)
|
||||||
services = append(services, service)
|
|
||||||
|
services := make([]*runtime.Service, 0, len(deployments.Items))
|
||||||
|
|
||||||
|
for _, service := range deployments.Items {
|
||||||
|
buildTime, err := time.Parse(time.RFC3339, service.Metadata.Annotations["build"])
|
||||||
|
if err != nil {
|
||||||
|
log.Debugf("Runtime error parsing build time: %v", 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
|
return services, nil
|
||||||
@ -152,18 +169,26 @@ func (k *kubernetes) List() ([]*runtime.Service, error) {
|
|||||||
|
|
||||||
// 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 * 5)
|
t := time.NewTicker(time.Second * 10)
|
||||||
defer t.Stop()
|
defer t.Stop()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-t.C:
|
case <-t.C:
|
||||||
// TODO: noop for now
|
|
||||||
// check running services
|
// check running services
|
||||||
// * deployments exist
|
services, err := k.List()
|
||||||
// * service is exposed
|
if err != nil {
|
||||||
|
log.Debugf("Runtime failed listing running services: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// TODO: for now we just log the running services
|
||||||
|
// * make sure all core deployments exist
|
||||||
|
// * make sure all core services are exposed
|
||||||
|
for _, service := range services {
|
||||||
|
log.Debugf("Runtime found running service: %v", service)
|
||||||
|
}
|
||||||
case service := <-k.start:
|
case service := <-k.start:
|
||||||
// TODO: following might have to be done
|
// TODO: this is a noop for now
|
||||||
// * create a deployment
|
// * create a deployment
|
||||||
// * expose a service
|
// * expose a service
|
||||||
log.Debugf("Runtime starting service: %s", service.Name)
|
log.Debugf("Runtime starting service: %s", service.Name)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user