* Add Get() and GetOptions. * Removed watcher. Outline of client. YAML templates * Added default service and deployment templates and types * Added API tests and cleaned up errors. * Small refactoring. Template package is no more. * Ripped out existing code in preparation to small rework * Reshuffled the source code to make it organized better * Create service and deployment in kubernetes runtime * Major cleanup and refactoring of Kubernetes runtime * Service now handles low level K8s API calls across both K8s deployment an service API objects * Runtime has a task queue that serves for queueing runtime action requests * General refactoring * No need for Lock in k8s service * Added kubernetes runtime env var to default deployment * Enable running different versions of the same service * Can't delete services through labels * Proto cruft. Added runtime.CreateOptions implementation in proto * Removed proxy service from default env variables * Make service name mandatory param to Get method * Get Delete changes from https://github.com/micro/go-micro/pull/945 * Replaced template files with global variables * Validate service names before sending K8s API request * Refactored Kubernetes API client. Fixed typos. * Added client.Resource to make API resources more explicit in code
		
			
				
	
	
		
			96 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package api
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"errors"
 | |
| 	"io/ioutil"
 | |
| 	"net/http"
 | |
| 
 | |
| 	"github.com/micro/go-micro/util/log"
 | |
| )
 | |
| 
 | |
| // Errors ...
 | |
| var (
 | |
| 	ErrNotFound = errors.New("kubernetes: resource not found")
 | |
| 	ErrDecode   = errors.New("kubernetes: error decoding")
 | |
| 	ErrUnknown  = errors.New("kubernetes: unknown error")
 | |
| )
 | |
| 
 | |
| // Status is an object that is returned when a request
 | |
| // failed or delete succeeded.
 | |
| // type Status struct {
 | |
| // 	Kind    string `json:"kind"`
 | |
| // 	Status  string `json:"status"`
 | |
| // 	Message string `json:"message"`
 | |
| // 	Reason  string `json:"reason"`
 | |
| // 	Code    int    `json:"code"`
 | |
| // }
 | |
| 
 | |
| // Response ...
 | |
| type Response struct {
 | |
| 	res *http.Response
 | |
| 	err error
 | |
| 
 | |
| 	body []byte
 | |
| }
 | |
| 
 | |
| // Error returns an error
 | |
| func (r *Response) Error() error {
 | |
| 	return r.err
 | |
| }
 | |
| 
 | |
| // StatusCode returns status code for response
 | |
| func (r *Response) StatusCode() int {
 | |
| 	return r.res.StatusCode
 | |
| }
 | |
| 
 | |
| // Into decode body into `data`
 | |
| func (r *Response) Into(data interface{}) error {
 | |
| 	if r.err != nil {
 | |
| 		return r.err
 | |
| 	}
 | |
| 
 | |
| 	defer r.res.Body.Close()
 | |
| 	decoder := json.NewDecoder(r.res.Body)
 | |
| 	err := decoder.Decode(&data)
 | |
| 	if err != nil {
 | |
| 		return ErrDecode
 | |
| 	}
 | |
| 
 | |
| 	return r.err
 | |
| }
 | |
| 
 | |
| func newResponse(res *http.Response, err error) *Response {
 | |
| 	r := &Response{
 | |
| 		res: res,
 | |
| 		err: err,
 | |
| 	}
 | |
| 
 | |
| 	if err != nil {
 | |
| 		return r
 | |
| 	}
 | |
| 
 | |
| 	if r.res.StatusCode == http.StatusOK ||
 | |
| 		r.res.StatusCode == http.StatusCreated ||
 | |
| 		r.res.StatusCode == http.StatusNoContent {
 | |
| 		// Non error status code
 | |
| 		return r
 | |
| 	}
 | |
| 
 | |
| 	if r.res.StatusCode == http.StatusNotFound {
 | |
| 		r.err = ErrNotFound
 | |
| 		return r
 | |
| 	}
 | |
| 
 | |
| 	log.Logf("kubernetes: request failed with code %v", r.res.StatusCode)
 | |
| 
 | |
| 	b, err := ioutil.ReadAll(r.res.Body)
 | |
| 	if err == nil {
 | |
| 		log.Log("kubernetes: request failed with body:")
 | |
| 		log.Log(string(b))
 | |
| 	}
 | |
| 	r.err = ErrUnknown
 | |
| 
 | |
| 	return r
 | |
| }
 |