mirror of
https://github.com/replicatedhq/troubleshoot.git
synced 2026-04-15 07:16:34 +00:00
133 lines
3.0 KiB
Go
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
|
|
}
|