2019-11-15 13:41:40 +00:00
|
|
|
// Package client provides an implementation of a restricted subset of kubernetes API client
|
2019-11-02 13:25:10 +00:00
|
|
|
package client
|
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
import (
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/micro/go-micro/util/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// https://github.com/kubernetes/apimachinery/blob/master/pkg/util/validation/validation.go#L134
|
|
|
|
dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// DefaultImage is default micro image
|
2019-11-19 20:49:01 +00:00
|
|
|
DefaultImage = "micro/go-micro"
|
2019-11-15 13:41:40 +00:00
|
|
|
)
|
|
|
|
|
2019-11-02 13:25:10 +00:00
|
|
|
// Kubernetes client
|
|
|
|
type Kubernetes interface {
|
2019-11-15 13:41:40 +00:00
|
|
|
// Create creates new API resource
|
|
|
|
Create(*Resource) error
|
|
|
|
// Get queries API resrouces
|
|
|
|
Get(*Resource, map[string]string) error
|
|
|
|
// Update patches existing API object
|
|
|
|
Update(*Resource) error
|
|
|
|
// Delete deletes API resource
|
|
|
|
Delete(*Resource) error
|
|
|
|
// List lists API resources
|
|
|
|
List(*Resource) error
|
2019-11-02 13:25:10 +00:00
|
|
|
}
|
|
|
|
|
2019-11-25 16:31:14 +00:00
|
|
|
// NewService returns default micro kubernetes service definition
|
|
|
|
func NewService(name, version string) *Service {
|
|
|
|
log.Tracef("kubernetes default service: name: %s, version: %s", name, version)
|
2019-11-21 17:31:13 +00:00
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
Labels := map[string]string{
|
|
|
|
"name": name,
|
|
|
|
"version": version,
|
|
|
|
"micro": "service",
|
|
|
|
}
|
2019-11-08 14:12:03 +00:00
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
svcName := name
|
|
|
|
if len(version) > 0 {
|
|
|
|
// API service object name joins name and version over "-"
|
|
|
|
svcName = strings.Join([]string{name, version}, "-")
|
|
|
|
}
|
2019-11-07 07:44:57 +00:00
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
Metadata := &Metadata{
|
|
|
|
Name: svcName,
|
|
|
|
Namespace: "default",
|
|
|
|
Version: version,
|
|
|
|
Labels: Labels,
|
|
|
|
}
|
|
|
|
|
|
|
|
Spec := &ServiceSpec{
|
|
|
|
Type: "ClusterIP",
|
|
|
|
Selector: Labels,
|
|
|
|
Ports: []ServicePort{{
|
|
|
|
name + "-port", 9090, "",
|
|
|
|
}},
|
|
|
|
}
|
2019-11-07 07:44:57 +00:00
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
return &Service{
|
|
|
|
Metadata: Metadata,
|
|
|
|
Spec: Spec,
|
|
|
|
}
|
2019-11-07 07:44:57 +00:00
|
|
|
}
|
|
|
|
|
2019-11-25 16:31:14 +00:00
|
|
|
// NewService returns default micro kubernetes deployment definition
|
|
|
|
func NewDeployment(name, version string) *Deployment {
|
|
|
|
log.Tracef("kubernetes default deployment: name: %s, version: %s", name, version)
|
2019-11-21 17:31:13 +00:00
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
Labels := map[string]string{
|
|
|
|
"name": name,
|
|
|
|
"version": version,
|
|
|
|
"micro": "service",
|
|
|
|
}
|
|
|
|
|
2019-11-22 17:10:00 +00:00
|
|
|
depName := name
|
|
|
|
if len(version) > 0 {
|
|
|
|
// API deployment object name joins name and version over "-"
|
|
|
|
depName = strings.Join([]string{name, version}, "-")
|
|
|
|
}
|
2019-11-15 13:41:40 +00:00
|
|
|
|
|
|
|
Metadata := &Metadata{
|
2019-11-25 16:31:14 +00:00
|
|
|
Name: depName,
|
|
|
|
Namespace: "default",
|
|
|
|
Version: version,
|
|
|
|
Labels: Labels,
|
|
|
|
Annotations: map[string]string{},
|
2019-11-15 13:41:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: we need to figure out this version stuff
|
2019-11-22 17:10:00 +00:00
|
|
|
// might have to add Build to runtime.Service
|
2019-11-15 13:41:40 +00:00
|
|
|
buildTime, err := strconv.ParseInt(version, 10, 64)
|
|
|
|
if err == nil {
|
|
|
|
buildUnixTimeUTC := time.Unix(buildTime, 0)
|
2019-11-22 17:10:00 +00:00
|
|
|
Metadata.Annotations["build"] = buildUnixTimeUTC.Format(time.RFC3339)
|
2019-11-15 13:41:40 +00:00
|
|
|
} else {
|
2019-11-25 16:31:14 +00:00
|
|
|
log.Tracef("could not parse build: %v", err)
|
2019-11-15 13:41:40 +00:00
|
|
|
}
|
|
|
|
|
2019-11-21 17:31:13 +00:00
|
|
|
// enable go modules by default
|
|
|
|
env := EnvVar{
|
|
|
|
Name: "GO111MODULE",
|
|
|
|
Value: "on",
|
|
|
|
}
|
|
|
|
|
2019-11-15 13:41:40 +00:00
|
|
|
Spec := &DeploymentSpec{
|
|
|
|
Replicas: 1,
|
|
|
|
Selector: &LabelSelector{
|
|
|
|
MatchLabels: Labels,
|
|
|
|
},
|
|
|
|
Template: &Template{
|
|
|
|
Metadata: Metadata,
|
|
|
|
PodSpec: &PodSpec{
|
|
|
|
Containers: []Container{{
|
|
|
|
Name: name,
|
|
|
|
Image: DefaultImage,
|
2019-11-21 17:31:13 +00:00
|
|
|
Env: []EnvVar{env},
|
2019-11-25 16:31:14 +00:00
|
|
|
Command: []string{"go", "run", "main.go"},
|
2019-11-15 13:41:40 +00:00
|
|
|
Ports: []ContainerPort{{
|
|
|
|
Name: name + "-port",
|
|
|
|
ContainerPort: 8080,
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
return &Deployment{
|
|
|
|
Metadata: Metadata,
|
|
|
|
Spec: Spec,
|
|
|
|
}
|
2019-11-07 07:44:57 +00:00
|
|
|
}
|