Files
troubleshoot/pkg/preflight/server.go
2019-07-22 19:20:42 +00:00

133 lines
3.0 KiB
Go

package preflight
import (
"context"
"fmt"
"time"
corev1 "k8s.io/api/core/v1"
kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)
type PreflightServerOptions struct {
ImageName string
PullPolicy string
Name string
Namespace string
OwnerReference metav1.Object
}
func CreatePreflightServer(client client.Client, scheme *runtime.Scheme, options PreflightServerOptions) (*corev1.Pod, *corev1.Service, error) {
name := fmt.Sprintf("%s-%s", options.Name, "preflight")
namespacedName := types.NamespacedName{
Name: name,
Namespace: options.Namespace,
}
found := &corev1.Pod{}
err := client.Get(context.Background(), namespacedName, found)
if err == nil || !kuberneteserrors.IsNotFound(err) {
return nil, nil, err
}
imageName := "replicated/troubleshoot:latest"
imagePullPolicy := corev1.PullAlways
if options.ImageName != "" {
imageName = options.ImageName
}
if options.PullPolicy != "" {
imagePullPolicy = corev1.PullPolicy(options.PullPolicy)
}
podLabels := make(map[string]string)
podLabels["preflight"] = options.Name
podLabels["troubleshoot-role"] = "preflight"
pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: options.Namespace,
Labels: podLabels,
},
TypeMeta: metav1.TypeMeta{
APIVersion: "v1",
Kind: "Pod",
},
Spec: corev1.PodSpec{
RestartPolicy: corev1.RestartPolicyNever,
Containers: []corev1.Container{
{
Image: imageName,
ImagePullPolicy: imagePullPolicy,
Name: "preflight",
Command: []string{"preflight"},
Args: []string{"server"},
Ports: []corev1.ContainerPort{
{
Name: "http",
ContainerPort: 8000,
},
},
},
},
},
}
if scheme != nil {
if err := controllerutil.SetControllerReference(options.OwnerReference, &pod, scheme); err != nil {
return nil, nil, err
}
}
if err := client.Create(context.Background(), &pod); err != nil {
return nil, nil, err
}
service := corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: options.Namespace,
},
TypeMeta: metav1.TypeMeta{
APIVersion: "v1",
Kind: "Service",
},
Spec: corev1.ServiceSpec{
Selector: podLabels,
Type: corev1.ServiceTypeClusterIP,
Ports: []corev1.ServicePort{
{
Name: "http",
Port: 8000,
TargetPort: intstr.FromInt(8000),
},
},
},
}
if scheme != nil {
if err := controllerutil.SetControllerReference(options.OwnerReference, &service, scheme); err != nil {
return nil, nil, err
}
}
if err := client.Create(context.Background(), &service); err != nil {
return nil, nil, err
}
// wait for the server to be ready
// TODO
time.Sleep(time.Second * 5)
return &pod, &service, nil
}