mirror of
https://github.com/replicatedhq/troubleshoot.git
synced 2026-02-14 10:19:54 +00:00
Preflights and preflightjobs
This commit is contained in:
@@ -390,12 +390,84 @@ spec:
|
||||
type: string
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
analyzerImage:
|
||||
type: string
|
||||
analyzerImagePullPolicy:
|
||||
type: string
|
||||
collectorImage:
|
||||
type: string
|
||||
collectorImagePullPolicy:
|
||||
type: string
|
||||
preflight:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespace:
|
||||
type: string
|
||||
required:
|
||||
- name
|
||||
type: object
|
||||
required:
|
||||
- preflight
|
||||
type: object
|
||||
status:
|
||||
properties:
|
||||
analyzersFailed:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
analyzersRunning:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
analyzersSuccessful:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
collectorsFailed:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
collectorsRunning:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
collectorsSuccessful:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
isAnalyzersComplete:
|
||||
type: boolean
|
||||
isCollectorsComplete:
|
||||
type: boolean
|
||||
isServerReady:
|
||||
type: boolean
|
||||
serverPodName:
|
||||
type: string
|
||||
serverPodNamespace:
|
||||
type: string
|
||||
serverPodPort:
|
||||
type: integer
|
||||
required:
|
||||
- isServerReady
|
||||
- serverPodName
|
||||
- serverPodNamespace
|
||||
- serverPodPort
|
||||
- isCollectorsComplete
|
||||
- collectorsRunning
|
||||
- collectorsSuccessful
|
||||
- collectorsFailed
|
||||
- isAnalyzersComplete
|
||||
- analyzersRunning
|
||||
- analyzersSuccessful
|
||||
- analyzersFailed
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
||||
status:
|
||||
acceptedNames:
|
||||
kind: ""
|
||||
|
||||
@@ -390,6 +390,20 @@ spec:
|
||||
type: string
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
analyzers:
|
||||
items:
|
||||
type: object
|
||||
type: array
|
||||
collectors:
|
||||
items:
|
||||
properties:
|
||||
cluster-info:
|
||||
type: object
|
||||
cluster-resources:
|
||||
type: object
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
status:
|
||||
type: object
|
||||
|
||||
@@ -8,6 +8,21 @@ import (
|
||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Analyze) DeepCopyInto(out *Analyze) {
|
||||
*out = *in
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Analyze.
|
||||
func (in *Analyze) DeepCopy() *Analyze {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Analyze)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Analyzer) DeepCopyInto(out *Analyzer) {
|
||||
*out = *in
|
||||
@@ -450,7 +465,7 @@ func (in *Preflight) DeepCopyInto(out *Preflight) {
|
||||
*out = *in
|
||||
out.TypeMeta = in.TypeMeta
|
||||
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||
out.Spec = in.Spec
|
||||
in.Spec.DeepCopyInto(&out.Spec)
|
||||
out.Status = in.Status
|
||||
}
|
||||
|
||||
@@ -478,7 +493,7 @@ func (in *PreflightJob) DeepCopyInto(out *PreflightJob) {
|
||||
out.TypeMeta = in.TypeMeta
|
||||
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||
out.Spec = in.Spec
|
||||
out.Status = in.Status
|
||||
in.Status.DeepCopyInto(&out.Status)
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightJob.
|
||||
@@ -534,6 +549,7 @@ func (in *PreflightJobList) DeepCopyObject() runtime.Object {
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightJobSpec) DeepCopyInto(out *PreflightJobSpec) {
|
||||
*out = *in
|
||||
out.Preflight = in.Preflight
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightJobSpec.
|
||||
@@ -549,6 +565,36 @@ func (in *PreflightJobSpec) DeepCopy() *PreflightJobSpec {
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightJobStatus) DeepCopyInto(out *PreflightJobStatus) {
|
||||
*out = *in
|
||||
if in.CollectorsRunning != nil {
|
||||
in, out := &in.CollectorsRunning, &out.CollectorsRunning
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.CollectorsSuccessful != nil {
|
||||
in, out := &in.CollectorsSuccessful, &out.CollectorsSuccessful
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.CollectorsFailed != nil {
|
||||
in, out := &in.CollectorsFailed, &out.CollectorsFailed
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AnalyzersRunning != nil {
|
||||
in, out := &in.AnalyzersRunning, &out.AnalyzersRunning
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AnalyzersSuccessful != nil {
|
||||
in, out := &in.AnalyzersSuccessful, &out.AnalyzersSuccessful
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AnakyzersFailed != nil {
|
||||
in, out := &in.AnakyzersFailed, &out.AnakyzersFailed
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightJobStatus.
|
||||
@@ -593,9 +639,46 @@ func (in *PreflightList) DeepCopyObject() runtime.Object {
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightRef) DeepCopyInto(out *PreflightRef) {
|
||||
*out = *in
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightRef.
|
||||
func (in *PreflightRef) DeepCopy() *PreflightRef {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PreflightRef)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightSpec) DeepCopyInto(out *PreflightSpec) {
|
||||
*out = *in
|
||||
if in.Collectors != nil {
|
||||
in, out := &in.Collectors, &out.Collectors
|
||||
*out = make([]*Collect, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Collect)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Analyzers != nil {
|
||||
in, out := &in.Analyzers, &out.Analyzers
|
||||
*out = make([]*Analyze, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Analyze)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightSpec.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
apiVersion: troubleshoot.replicated.com/v1beta1
|
||||
kind: Preflight
|
||||
metadata:
|
||||
labels:
|
||||
controller-tools.k8s.io: "1.0"
|
||||
name: preflight-sample
|
||||
spec:
|
||||
# Add fields here
|
||||
foo: bar
|
||||
collectors:
|
||||
- cluster-info: {}
|
||||
- cluster-resources: {}
|
||||
analyzers: []
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
apiVersion: troubleshoot.replicated.com/v1beta1
|
||||
kind: PreflightJob
|
||||
metadata:
|
||||
labels:
|
||||
controller-tools.k8s.io: "1.0"
|
||||
name: preflightjob-sample
|
||||
spec:
|
||||
# Add fields here
|
||||
foo: bar
|
||||
image: localhost:32000/troubleshoot:alpha
|
||||
imagePullPolicy: Always
|
||||
preflight:
|
||||
name: preflight-sample
|
||||
namespace: default
|
||||
|
||||
4
pkg/apis/troubleshoot/v1beta1/analyzer_shared.go
Normal file
4
pkg/apis/troubleshoot/v1beta1/analyzer_shared.go
Normal file
@@ -0,0 +1,4 @@
|
||||
package v1beta1
|
||||
|
||||
type Analyze struct {
|
||||
}
|
||||
@@ -20,13 +20,10 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
|
||||
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
|
||||
|
||||
// PreflightSpec defines the desired state of Preflight
|
||||
type PreflightSpec struct {
|
||||
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
|
||||
// Important: Run "make" to regenerate code after modifying this file
|
||||
Collectors []*Collect `json:"collectors,omitempty"`
|
||||
Analyzers []*Analyze `json:"analyzers,omitempty"`
|
||||
}
|
||||
|
||||
// PreflightStatus defines the observed state of Preflight
|
||||
|
||||
@@ -20,26 +20,45 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
|
||||
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
|
||||
type PreflightRef struct {
|
||||
Name string `json:"name"`
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
}
|
||||
|
||||
// PreflightJobSpec defines the desired state of PreflightJob
|
||||
type PreflightJobSpec struct {
|
||||
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
|
||||
// Important: Run "make" to regenerate code after modifying this file
|
||||
Preflight PreflightRef `json:"preflight"`
|
||||
|
||||
CollectorImage string `json:"collectorImage,omitempty"`
|
||||
CollectorImagePullPolicy string `json:"collectorImagePullPolicy,omitempty"`
|
||||
|
||||
AnalyzerImage string `json:"analyzerImage,omitempty"`
|
||||
AnalyzerImagePullPolicy string `json:"analyzerImagePullPolicy,omitempty"`
|
||||
}
|
||||
|
||||
// PreflightJobStatus defines the observed state of PreflightJob
|
||||
type PreflightJobStatus struct {
|
||||
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
|
||||
// Important: Run "make" to regenerate code after modifying this file
|
||||
IsServerReady bool `json:"isServerReady"`
|
||||
ServerPodName string `json:"serverPodName"`
|
||||
ServerPodNamespace string `json:"serverPodNamespace"`
|
||||
ServerPodPort int `json:"serverPodPort"`
|
||||
|
||||
IsCollectorsComplete bool `json:"isCollectorsComplete"`
|
||||
CollectorsRunning []string `json:"collectorsRunning"`
|
||||
CollectorsSuccessful []string `json:"collectorsSuccessful"`
|
||||
CollectorsFailed []string `json:"collectorsFailed"`
|
||||
|
||||
IsAnalyzersComplete bool `json:"isAnalyzersComplete"`
|
||||
AnalyzersRunning []string `json:"analyzersRunning"`
|
||||
AnalyzersSuccessful []string `json:"analyzersSuccessful"`
|
||||
AnakyzersFailed []string `json:"analyzersFailed"`
|
||||
}
|
||||
|
||||
// +genclient
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||
|
||||
// PreflightJob is the Schema for the preflightjobs API
|
||||
// +k8s:openapi-gen=true
|
||||
// +kubebuilder:subresource:status
|
||||
type PreflightJob struct {
|
||||
metav1.TypeMeta `json:",inline"`
|
||||
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||
|
||||
@@ -24,6 +24,21 @@ import (
|
||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Analyze) DeepCopyInto(out *Analyze) {
|
||||
*out = *in
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Analyze.
|
||||
func (in *Analyze) DeepCopy() *Analyze {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Analyze)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Analyzer) DeepCopyInto(out *Analyzer) {
|
||||
*out = *in
|
||||
@@ -466,7 +481,7 @@ func (in *Preflight) DeepCopyInto(out *Preflight) {
|
||||
*out = *in
|
||||
out.TypeMeta = in.TypeMeta
|
||||
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||
out.Spec = in.Spec
|
||||
in.Spec.DeepCopyInto(&out.Spec)
|
||||
out.Status = in.Status
|
||||
}
|
||||
|
||||
@@ -494,7 +509,7 @@ func (in *PreflightJob) DeepCopyInto(out *PreflightJob) {
|
||||
out.TypeMeta = in.TypeMeta
|
||||
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||
out.Spec = in.Spec
|
||||
out.Status = in.Status
|
||||
in.Status.DeepCopyInto(&out.Status)
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightJob.
|
||||
@@ -550,6 +565,7 @@ func (in *PreflightJobList) DeepCopyObject() runtime.Object {
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightJobSpec) DeepCopyInto(out *PreflightJobSpec) {
|
||||
*out = *in
|
||||
out.Preflight = in.Preflight
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightJobSpec.
|
||||
@@ -565,6 +581,36 @@ func (in *PreflightJobSpec) DeepCopy() *PreflightJobSpec {
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightJobStatus) DeepCopyInto(out *PreflightJobStatus) {
|
||||
*out = *in
|
||||
if in.CollectorsRunning != nil {
|
||||
in, out := &in.CollectorsRunning, &out.CollectorsRunning
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.CollectorsSuccessful != nil {
|
||||
in, out := &in.CollectorsSuccessful, &out.CollectorsSuccessful
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.CollectorsFailed != nil {
|
||||
in, out := &in.CollectorsFailed, &out.CollectorsFailed
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AnalyzersRunning != nil {
|
||||
in, out := &in.AnalyzersRunning, &out.AnalyzersRunning
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AnalyzersSuccessful != nil {
|
||||
in, out := &in.AnalyzersSuccessful, &out.AnalyzersSuccessful
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
if in.AnakyzersFailed != nil {
|
||||
in, out := &in.AnakyzersFailed, &out.AnakyzersFailed
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightJobStatus.
|
||||
@@ -609,9 +655,46 @@ func (in *PreflightList) DeepCopyObject() runtime.Object {
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightRef) DeepCopyInto(out *PreflightRef) {
|
||||
*out = *in
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightRef.
|
||||
func (in *PreflightRef) DeepCopy() *PreflightRef {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(PreflightRef)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *PreflightSpec) DeepCopyInto(out *PreflightSpec) {
|
||||
*out = *in
|
||||
if in.Collectors != nil {
|
||||
in, out := &in.Collectors, &out.Collectors
|
||||
*out = make([]*Collect, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Collect)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
}
|
||||
if in.Analyzers != nil {
|
||||
in, out := &in.Analyzers, &out.Analyzers
|
||||
*out = make([]*Analyze, len(*in))
|
||||
for i := range *in {
|
||||
if (*in)[i] != nil {
|
||||
in, out := &(*in)[i], &(*out)[i]
|
||||
*out = new(Analyze)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreflightSpec.
|
||||
|
||||
127
pkg/controller/collectorjob/collector_server.go
Normal file
127
pkg/controller/collectorjob/collector_server.go
Normal file
@@ -0,0 +1,127 @@
|
||||
package collectorjob
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/apimachinery/pkg/util/intstr"
|
||||
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||
)
|
||||
|
||||
func (r *ReconcileCollectorJob) createCollectorServer(instance *troubleshootv1beta1.CollectorJob) error {
|
||||
name := fmt.Sprintf("%s-%s", instance.Name, "collector")
|
||||
|
||||
namespacedName := types.NamespacedName{
|
||||
Name: name,
|
||||
Namespace: instance.Namespace,
|
||||
}
|
||||
|
||||
found := &corev1.Pod{}
|
||||
err := r.Get(context.Background(), namespacedName, found)
|
||||
if err == nil || !kuberneteserrors.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
imageName := "replicatedhq/troubleshoot:latest"
|
||||
imagePullPolicy := corev1.PullAlways
|
||||
|
||||
if instance.Spec.Image != "" {
|
||||
imageName = instance.Spec.Image
|
||||
}
|
||||
if instance.Spec.ImagePullPolicy != "" {
|
||||
imagePullPolicy = corev1.PullPolicy(instance.Spec.ImagePullPolicy)
|
||||
}
|
||||
|
||||
podLabels := make(map[string]string)
|
||||
podLabels["collector"] = instance.Name
|
||||
podLabels["troubleshoot-role"] = "collector"
|
||||
|
||||
pod := corev1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: name,
|
||||
Namespace: instance.Namespace,
|
||||
Labels: podLabels,
|
||||
},
|
||||
TypeMeta: metav1.TypeMeta{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
},
|
||||
Spec: corev1.PodSpec{
|
||||
RestartPolicy: corev1.RestartPolicyNever,
|
||||
Containers: []corev1.Container{
|
||||
{
|
||||
Image: imageName,
|
||||
ImagePullPolicy: imagePullPolicy,
|
||||
Name: "collector",
|
||||
Command: []string{"collector"},
|
||||
Args: []string{"server"},
|
||||
Ports: []corev1.ContainerPort{
|
||||
{
|
||||
Name: "http",
|
||||
ContainerPort: 8000,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if err := controllerutil.SetControllerReference(instance, &pod, r.scheme); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := r.Create(context.Background(), &pod); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
service := corev1.Service{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: name,
|
||||
Namespace: instance.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 err := controllerutil.SetControllerReference(instance, &service, r.scheme); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := r.Create(context.Background(), &service); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
instance.Status.ServerPodName = name
|
||||
instance.Status.ServerPodNamespace = instance.Namespace
|
||||
instance.Status.ServerPodPort = 8000
|
||||
instance.Status.IsServerReady = true
|
||||
|
||||
// wait for the server to be ready
|
||||
// TODO
|
||||
time.Sleep(time.Second * 5)
|
||||
|
||||
if err := r.Update(context.Background(), instance); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -37,7 +37,6 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/apimachinery/pkg/util/intstr"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/config"
|
||||
@@ -145,118 +144,6 @@ func (r *ReconcileCollectorJob) Reconcile(request reconcile.Request) (reconcile.
|
||||
return reconcile.Result{}, nil
|
||||
}
|
||||
|
||||
func (r *ReconcileCollectorJob) createCollectorServer(instance *troubleshootv1beta1.CollectorJob) error {
|
||||
name := fmt.Sprintf("%s-%s", instance.Name, "collector")
|
||||
|
||||
namespacedName := types.NamespacedName{
|
||||
Name: name,
|
||||
Namespace: instance.Namespace,
|
||||
}
|
||||
|
||||
found := &corev1.Pod{}
|
||||
err := r.Get(context.Background(), namespacedName, found)
|
||||
if err == nil || !kuberneteserrors.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
imageName := "replicatedhq/troubleshoot:latest"
|
||||
imagePullPolicy := corev1.PullAlways
|
||||
|
||||
if instance.Spec.Image != "" {
|
||||
imageName = instance.Spec.Image
|
||||
}
|
||||
if instance.Spec.ImagePullPolicy != "" {
|
||||
imagePullPolicy = corev1.PullPolicy(instance.Spec.ImagePullPolicy)
|
||||
}
|
||||
|
||||
podLabels := make(map[string]string)
|
||||
podLabels["collector"] = instance.Name
|
||||
podLabels["troubleshoot-role"] = "collector"
|
||||
|
||||
pod := corev1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: name,
|
||||
Namespace: instance.Namespace,
|
||||
Labels: podLabels,
|
||||
},
|
||||
TypeMeta: metav1.TypeMeta{
|
||||
APIVersion: "v1",
|
||||
Kind: "Pod",
|
||||
},
|
||||
Spec: corev1.PodSpec{
|
||||
RestartPolicy: corev1.RestartPolicyNever,
|
||||
Containers: []corev1.Container{
|
||||
{
|
||||
Image: imageName,
|
||||
ImagePullPolicy: imagePullPolicy,
|
||||
Name: "collector",
|
||||
Command: []string{"collector"},
|
||||
Args: []string{"server"},
|
||||
Ports: []corev1.ContainerPort{
|
||||
{
|
||||
Name: "http",
|
||||
ContainerPort: 8000,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if err := controllerutil.SetControllerReference(instance, &pod, r.scheme); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := r.Create(context.Background(), &pod); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
service := corev1.Service{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: name,
|
||||
Namespace: instance.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 err := controllerutil.SetControllerReference(instance, &service, r.scheme); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := r.Create(context.Background(), &service); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
instance.Status.ServerPodName = name
|
||||
instance.Status.ServerPodNamespace = instance.Namespace
|
||||
instance.Status.ServerPodPort = 8000
|
||||
instance.Status.IsServerReady = true
|
||||
|
||||
// wait for the server to be ready
|
||||
// TODO
|
||||
time.Sleep(time.Second * 5)
|
||||
|
||||
if err := r.Update(context.Background(), instance); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *ReconcileCollectorJob) getCollectorSpec(namespace string, name string) (*troubleshootv1beta1.Collector, error) {
|
||||
cfg, err := config.GetConfig()
|
||||
if err != nil {
|
||||
|
||||
5
pkg/controller/preflightjob/analyzers.go
Normal file
5
pkg/controller/preflightjob/analyzers.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package preflightjob
|
||||
|
||||
func (r *ReconcilePreflightJob) reconcileAnalyzers() error {
|
||||
return nil
|
||||
}
|
||||
5
pkg/controller/preflightjob/collectors.go
Normal file
5
pkg/controller/preflightjob/collectors.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package preflightjob
|
||||
|
||||
func (r *ReconcilePreflightJob) reconcileCollectors() error {
|
||||
return nil
|
||||
}
|
||||
119
pkg/controller/preflightjob/preflight_server.go
Normal file
119
pkg/controller/preflightjob/preflight_server.go
Normal file
@@ -0,0 +1,119 @@
|
||||
package preflightjob
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
|
||||
)
|
||||
|
||||
func (r *ReconcilePreflightJob) createPreflightServer(instance *troubleshootv1beta1.PreflightJob) error {
|
||||
name := fmt.Sprintf("%s-%s", instance.Name, "preflight")
|
||||
fmt.Printf("name = %s\n", name)
|
||||
// namespacedName := types.NamespacedName{
|
||||
// Name: name,
|
||||
// Namespace: instance.Namespace,
|
||||
// }
|
||||
|
||||
// found := &corev1.Pod{}
|
||||
// err := r.Get(context.Background(), namespacedName, found)
|
||||
// if err == nil || !kuberneteserrors.IsNotFound(err) {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// imageName := "replicatedhq/troubleshoot:latest"
|
||||
// imagePullPolicy := corev1.PullAlways
|
||||
|
||||
// if instance.Spec.Image != "" {
|
||||
// imageName = instance.Spec.Image
|
||||
// }
|
||||
// if instance.Spec.ImagePullPolicy != "" {
|
||||
// imagePullPolicy = corev1.PullPolicy(instance.Spec.ImagePullPolicy)
|
||||
// }
|
||||
|
||||
// podLabels := make(map[string]string)
|
||||
// podLabels["collector"] = instance.Name
|
||||
// podLabels["troubleshoot-role"] = "collector"
|
||||
|
||||
// pod := corev1.Pod{
|
||||
// ObjectMeta: metav1.ObjectMeta{
|
||||
// Name: name,
|
||||
// Namespace: instance.Namespace,
|
||||
// Labels: podLabels,
|
||||
// },
|
||||
// TypeMeta: metav1.TypeMeta{
|
||||
// APIVersion: "v1",
|
||||
// Kind: "Pod",
|
||||
// },
|
||||
// Spec: corev1.PodSpec{
|
||||
// RestartPolicy: corev1.RestartPolicyNever,
|
||||
// Containers: []corev1.Container{
|
||||
// {
|
||||
// Image: imageName,
|
||||
// ImagePullPolicy: imagePullPolicy,
|
||||
// Name: "collector",
|
||||
// Command: []string{"collector"},
|
||||
// Args: []string{"server"},
|
||||
// Ports: []corev1.ContainerPort{
|
||||
// {
|
||||
// Name: "http",
|
||||
// ContainerPort: 8000,
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// }
|
||||
|
||||
// if err := controllerutil.SetControllerReference(instance, &pod, r.scheme); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// if err := r.Create(context.Background(), &pod); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// service := corev1.Service{
|
||||
// ObjectMeta: metav1.ObjectMeta{
|
||||
// Name: name,
|
||||
// Namespace: instance.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 err := controllerutil.SetControllerReference(instance, &service, r.scheme); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// if err := r.Create(context.Background(), &service); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// instance.Status.ServerPodName = name
|
||||
// instance.Status.ServerPodNamespace = instance.Namespace
|
||||
// instance.Status.ServerPodPort = 8000
|
||||
// instance.Status.IsServerReady = true
|
||||
|
||||
// // wait for the server to be ready
|
||||
// // TODO
|
||||
// time.Sleep(time.Second * 5)
|
||||
|
||||
// if err := r.Update(context.Background(), instance); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -18,18 +18,16 @@ package preflightjob
|
||||
|
||||
import (
|
||||
"context"
|
||||
"reflect"
|
||||
"fmt"
|
||||
|
||||
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/errors"
|
||||
troubleshootclientv1beta1 "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/typed/troubleshoot/v1beta1"
|
||||
kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/config"
|
||||
"sigs.k8s.io/controller-runtime/pkg/controller"
|
||||
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||
"sigs.k8s.io/controller-runtime/pkg/handler"
|
||||
"sigs.k8s.io/controller-runtime/pkg/manager"
|
||||
"sigs.k8s.io/controller-runtime/pkg/reconcile"
|
||||
@@ -39,11 +37,6 @@ import (
|
||||
|
||||
var log = logf.Log.WithName("controller")
|
||||
|
||||
/**
|
||||
* USER ACTION REQUIRED: This is a scaffold file intended for the user to modify with their own Controller
|
||||
* business logic. Delete these comments after modifying this file.*
|
||||
*/
|
||||
|
||||
// Add creates a new PreflightJob Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller
|
||||
// and Start it when the Manager is Started.
|
||||
func Add(mgr manager.Manager) error {
|
||||
@@ -69,16 +62,6 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO(user): Modify this to be the types you create
|
||||
// Uncomment watch a Deployment created by PreflightJob - change this for objects you create
|
||||
err = c.Watch(&source.Kind{Type: &appsv1.Deployment{}}, &handler.EnqueueRequestForOwner{
|
||||
IsController: true,
|
||||
OwnerType: &troubleshootv1beta1.PreflightJob{},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -104,7 +87,7 @@ func (r *ReconcilePreflightJob) Reconcile(request reconcile.Request) (reconcile.
|
||||
instance := &troubleshootv1beta1.PreflightJob{}
|
||||
err := r.Get(context.TODO(), request.NamespacedName, instance)
|
||||
if err != nil {
|
||||
if errors.IsNotFound(err) {
|
||||
if kuberneteserrors.IsNotFound(err) {
|
||||
// Object not found, return. Created objects are automatically garbage collected.
|
||||
// For additional cleanup logic use finalizers.
|
||||
return reconcile.Result{}, nil
|
||||
@@ -113,55 +96,45 @@ func (r *ReconcilePreflightJob) Reconcile(request reconcile.Request) (reconcile.
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
|
||||
// TODO(user): Change this to be the object type created by your controller
|
||||
// Define the desired Deployment object
|
||||
deploy := &appsv1.Deployment{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: instance.Name + "-deployment",
|
||||
Namespace: instance.Namespace,
|
||||
},
|
||||
Spec: appsv1.DeploymentSpec{
|
||||
Selector: &metav1.LabelSelector{
|
||||
MatchLabels: map[string]string{"deployment": instance.Name + "-deployment"},
|
||||
},
|
||||
Template: corev1.PodTemplateSpec{
|
||||
ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"deployment": instance.Name + "-deployment"}},
|
||||
Spec: corev1.PodSpec{
|
||||
Containers: []corev1.Container{
|
||||
{
|
||||
Name: "nginx",
|
||||
Image: "nginx",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
if err := controllerutil.SetControllerReference(instance, deploy, r.scheme); err != nil {
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
|
||||
// TODO(user): Change this for the object type created by your controller
|
||||
// Check if the Deployment already exists
|
||||
found := &appsv1.Deployment{}
|
||||
err = r.Get(context.TODO(), types.NamespacedName{Name: deploy.Name, Namespace: deploy.Namespace}, found)
|
||||
if err != nil && errors.IsNotFound(err) {
|
||||
log.Info("Creating Deployment", "namespace", deploy.Namespace, "name", deploy.Name)
|
||||
err = r.Create(context.TODO(), deploy)
|
||||
return reconcile.Result{}, err
|
||||
} else if err != nil {
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
|
||||
// TODO(user): Change this for the object type created by your controller
|
||||
// Update the found object and write the result back if there are any changes
|
||||
if !reflect.DeepEqual(deploy.Spec, found.Spec) {
|
||||
found.Spec = deploy.Spec
|
||||
log.Info("Updating Deployment", "namespace", deploy.Namespace, "name", deploy.Name)
|
||||
err = r.Update(context.TODO(), found)
|
||||
if err != nil {
|
||||
if !instance.Status.IsServerReady {
|
||||
if err := r.createPreflightServer(instance); err != nil {
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
}
|
||||
|
||||
namespace := instance.Namespace
|
||||
if instance.Spec.Preflight.Namespace != "" {
|
||||
namespace = instance.Spec.Preflight.Namespace
|
||||
}
|
||||
|
||||
preflightSpec, err := r.getPreflightSpec(namespace, instance.Spec.Preflight.Name)
|
||||
if err != nil {
|
||||
return reconcile.Result{}, err
|
||||
}
|
||||
|
||||
fmt.Printf("preflightSpec = %#v\n", preflightSpec)
|
||||
return reconcile.Result{}, nil
|
||||
}
|
||||
|
||||
func (r *ReconcilePreflightJob) getPreflightSpec(namespace string, name string) (*troubleshootv1beta1.Preflight, error) {
|
||||
cfg, err := config.GetConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
preflight, err := troubleshootClient.Preflights(namespace).Get(name, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
if kuberneteserrors.IsNotFound(err) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return preflight, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user