Skip to content

Commit 091f9f9

Browse files
authored
Merge pull request #23 from replicatedhq/windows
Windows binaries
2 parents b13474f + 4e1cca7 commit 091f9f9

File tree

13 files changed

+460
-50
lines changed

13 files changed

+460
-50
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ release:
8787

8888
.PHONY: local-release
8989
local-release:
90-
curl -sL https://git.io/goreleaser | bash -s -- --rm-dist --snapshot --config deploy/.goreleaser.snapshot.yml
90+
curl -sL https://git.io/goreleaser | bash -s -- --rm-dist --snapshot --config deploy/.goreleaser.local.yml
9191
docker tag replicated/troubleshoot:alpha localhost:32000/troubleshoot:alpha
9292
docker tag replicated/preflight:alpha localhost:32000/preflight:alpha
9393
docker tag replicated/troubleshoot-manager:alpha localhost:32000/troubleshoot-manager:alpha

cmd/preflight/cli/run.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ func Run() *cobra.Command {
4040
cmd.Flags().String("collector-image", "", "the full name of the collector image to use")
4141
cmd.Flags().String("collector-pullpolicy", "", "the pull policy of the collector image")
4242

43+
cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created")
44+
4345
viper.BindPFlags(cmd.Flags())
4446

4547
return cmd

cmd/preflight/cli/run_nocrd.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map
125125
}
126126
restClient := clientset.CoreV1().RESTClient()
127127

128+
serviceAccountName := v.GetString("serviceaccount")
129+
if serviceAccountName == "" {
130+
generatedServiceAccountName, err := createServiceAccount(preflight, v.GetString("namespace"), clientset)
131+
if err != nil {
132+
return nil, err
133+
}
134+
defer removeServiceAccount(generatedServiceAccountName, v.GetString("namespace"), clientset)
135+
136+
serviceAccountName = generatedServiceAccountName
137+
}
138+
128139
// deploy an object that "owns" everything to aid in cleanup
129140
owner := corev1.ConfigMap{
130141
ObjectMeta: metav1.ObjectMeta{
@@ -186,6 +197,11 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map
186197
return
187198
}
188199

200+
if newPod.Status.Phase == corev1.PodFailed {
201+
podsDeleted = append(podsDeleted, newPod)
202+
return
203+
}
204+
189205
if newPod.Status.Phase != corev1.PodSucceeded {
190206
return
191207
}
@@ -229,7 +245,7 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map
229245
s := runtime.NewScheme()
230246
s.AddKnownTypes(schema.GroupVersion{Group: "", Version: "v1"}, &corev1.ConfigMap{})
231247
for _, collector := range desiredCollectors {
232-
_, pod, err := collectrunner.CreateCollector(client, s, &owner, preflight.Name, v.GetString("namespace"), "preflight", collector, v.GetString("image"), v.GetString("pullpolicy"))
248+
_, pod, err := collectrunner.CreateCollector(client, s, &owner, preflight.Name, v.GetString("namespace"), serviceAccountName, "preflight", collector, v.GetString("image"), v.GetString("pullpolicy"))
233249
if err != nil {
234250
return nil, err
235251
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package cli
2+
3+
import (
4+
"fmt"
5+
6+
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
7+
corev1 "k8s.io/api/core/v1"
8+
rbacv1 "k8s.io/api/rbac/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/client-go/kubernetes"
11+
)
12+
13+
func createServiceAccount(preflight troubleshootv1beta1.Preflight, namespace string, clientset *kubernetes.Clientset) (string, error) {
14+
name := fmt.Sprintf("preflight-%s", preflight.Name)
15+
16+
serviceAccount := corev1.ServiceAccount{
17+
TypeMeta: metav1.TypeMeta{
18+
APIVersion: "v1",
19+
Kind: "ServiceAccount",
20+
},
21+
ObjectMeta: metav1.ObjectMeta{
22+
Name: name,
23+
Namespace: namespace,
24+
},
25+
Secrets: []corev1.ObjectReference{
26+
{
27+
APIVersion: "v1",
28+
Kind: "Secret",
29+
Name: name,
30+
Namespace: namespace,
31+
},
32+
},
33+
}
34+
_, err := clientset.CoreV1().ServiceAccounts(namespace).Create(&serviceAccount)
35+
if err != nil {
36+
return "", err
37+
}
38+
39+
role := rbacv1.ClusterRole{
40+
TypeMeta: metav1.TypeMeta{
41+
APIVersion: "v1",
42+
Kind: "ClusterRole",
43+
},
44+
ObjectMeta: metav1.ObjectMeta{
45+
Name: name,
46+
Namespace: namespace,
47+
},
48+
Rules: []rbacv1.PolicyRule{
49+
{
50+
APIGroups: []string{""},
51+
Resources: []string{
52+
"namespaces",
53+
"pods",
54+
"services",
55+
"secrets",
56+
},
57+
Verbs: metav1.Verbs{"list"},
58+
},
59+
{
60+
APIGroups: []string{"apps"},
61+
Resources: []string{"deployments"},
62+
Verbs: metav1.Verbs{"list"},
63+
},
64+
{
65+
APIGroups: []string{"extensions"},
66+
Resources: []string{"ingresses"},
67+
Verbs: metav1.Verbs{"list"},
68+
},
69+
{
70+
APIGroups: []string{"storage.k8s.io"},
71+
Resources: []string{"storageclasses"},
72+
Verbs: metav1.Verbs{"list"},
73+
},
74+
{
75+
APIGroups: []string{"apiextensions.k8s.io"},
76+
Resources: []string{"customresourcedefinitions"},
77+
Verbs: metav1.Verbs{"list"},
78+
},
79+
},
80+
}
81+
_, err = clientset.RbacV1().ClusterRoles().Create(&role)
82+
if err != nil {
83+
return "", err
84+
}
85+
86+
roleBinding := rbacv1.ClusterRoleBinding{
87+
TypeMeta: metav1.TypeMeta{
88+
APIVersion: "v1",
89+
Kind: "ClusterRoleBinding",
90+
},
91+
ObjectMeta: metav1.ObjectMeta{
92+
Name: name,
93+
Namespace: namespace,
94+
},
95+
Subjects: []rbacv1.Subject{
96+
{
97+
Kind: "ServiceAccount",
98+
Name: name,
99+
Namespace: namespace,
100+
},
101+
},
102+
RoleRef: rbacv1.RoleRef{
103+
APIGroup: "rbac.authorization.k8s.io",
104+
Kind: "ClusterRole",
105+
Name: name,
106+
},
107+
}
108+
_, err = clientset.RbacV1().ClusterRoleBindings().Create(&roleBinding)
109+
if err != nil {
110+
return "", err
111+
}
112+
113+
return name, nil
114+
}
115+
116+
func removeServiceAccount(name string, namespace string, clientset *kubernetes.Clientset) error {
117+
if err := clientset.RbacV1().ClusterRoleBindings().Delete(name, &metav1.DeleteOptions{}); err != nil {
118+
return err
119+
}
120+
121+
if err := clientset.RbacV1().ClusterRoles().Delete(name, &metav1.DeleteOptions{}); err != nil {
122+
return err
123+
}
124+
125+
if err := clientset.CoreV1().ServiceAccounts(namespace).Delete(name, &metav1.DeleteOptions{}); err != nil {
126+
return err
127+
}
128+
129+
130+
return nil
131+
}

cmd/troubleshoot/cli/run.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,7 @@ For example:
1919
troubleshoot run --collectors application --wait
2020
`,
2121
PreRun: func(cmd *cobra.Command, args []string) {
22-
viper.BindPFlag("collectors", cmd.Flags().Lookup("collectors"))
23-
viper.BindPFlag("namespace", cmd.Flags().Lookup("namespace"))
24-
viper.BindPFlag("kubecontext", cmd.Flags().Lookup("kubecontext"))
25-
viper.BindPFlag("image", cmd.Flags().Lookup("image"))
26-
viper.BindPFlag("pullpolicy", cmd.Flags().Lookup("pullpolicy"))
27-
viper.BindPFlag("redact", cmd.Flags().Lookup("redact"))
22+
viper.BindPFlags(cmd.Flags())
2823
},
2924
RunE: func(cmd *cobra.Command, args []string) error {
3025
v := viper.GetViper()
@@ -46,6 +41,7 @@ troubleshoot run --collectors application --wait
4641
cmd.Flags().String("pullpolicy", "", "the pull policy of the collector image")
4742
cmd.Flags().Bool("redact", true, "enable/disable default redactions")
4843

44+
cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created")
4945
viper.BindPFlags(cmd.Flags())
5046

5147
return cmd

cmd/troubleshoot/cli/run_nocrd.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ func runCollectors(v *viper.Viper, collector troubleshootv1beta1.Collector) (str
8888
}
8989
restClient := clientset.CoreV1().RESTClient()
9090

91+
serviceAccountName := v.GetString("serviceaccount")
92+
if serviceAccountName == "" {
93+
generatedServiceAccountName, err := createServiceAccount(collector, v.GetString("namespace"), clientset)
94+
if err != nil {
95+
return "", err
96+
}
97+
defer removeServiceAccount(generatedServiceAccountName, v.GetString("namespace"), clientset)
98+
99+
serviceAccountName = generatedServiceAccountName
100+
}
101+
91102
// deploy an object that "owns" everything to aid in cleanup
92103
owner := corev1.ConfigMap{
93104
ObjectMeta: metav1.ObjectMeta{
@@ -126,7 +137,7 @@ func runCollectors(v *viper.Viper, collector troubleshootv1beta1.Collector) (str
126137
if err != nil {
127138
return "", err
128139
}
129-
// defer os.RemoveAll(bundlePath)
140+
defer os.RemoveAll(bundlePath)
130141

131142
resyncPeriod := time.Second
132143
ctx := context.Background()
@@ -158,6 +169,11 @@ func runCollectors(v *viper.Viper, collector troubleshootv1beta1.Collector) (str
158169
return
159170
}
160171

172+
if newPod.Status.Phase == corev1.PodFailed {
173+
podsDeleted = append(podsDeleted, newPod)
174+
return
175+
}
176+
161177
if newPod.Status.Phase != corev1.PodSucceeded {
162178
return
163179
}
@@ -206,7 +222,8 @@ func runCollectors(v *viper.Viper, collector troubleshootv1beta1.Collector) (str
206222
s := runtime.NewScheme()
207223
s.AddKnownTypes(schema.GroupVersion{Group: "", Version: "v1"}, &corev1.ConfigMap{})
208224
for _, collect := range desiredCollectors {
209-
_, pod, err := collectrunner.CreateCollector(client, s, &owner, collector.Name, v.GetString("namespace"), "troubleshoot", collect, v.GetString("image"), v.GetString("pullpolicy"))
225+
fmt.Printf("creating collector\n")
226+
_, pod, err := collectrunner.CreateCollector(client, s, &owner, collector.Name, v.GetString("namespace"), serviceAccountName, "troubleshoot", collect, v.GetString("image"), v.GetString("pullpolicy"))
210227
if err != nil {
211228
return "", err
212229
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package cli
2+
3+
import (
4+
"fmt"
5+
6+
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
7+
corev1 "k8s.io/api/core/v1"
8+
rbacv1 "k8s.io/api/rbac/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/client-go/kubernetes"
11+
)
12+
13+
func createServiceAccount(collector troubleshootv1beta1.Collector, namespace string, clientset *kubernetes.Clientset) (string, error) {
14+
name := fmt.Sprintf("troubleshoot-%s", collector.Name)
15+
16+
serviceAccount := corev1.ServiceAccount{
17+
TypeMeta: metav1.TypeMeta{
18+
APIVersion: "v1",
19+
Kind: "ServiceAccount",
20+
},
21+
ObjectMeta: metav1.ObjectMeta{
22+
Name: name,
23+
Namespace: namespace,
24+
},
25+
}
26+
_, err := clientset.CoreV1().ServiceAccounts(namespace).Create(&serviceAccount)
27+
if err != nil {
28+
return "", err
29+
}
30+
31+
role := rbacv1.ClusterRole{
32+
TypeMeta: metav1.TypeMeta{
33+
APIVersion: "v1",
34+
Kind: "ClusterRole",
35+
},
36+
ObjectMeta: metav1.ObjectMeta{
37+
Name: name,
38+
Namespace: namespace,
39+
},
40+
Rules: []rbacv1.PolicyRule{
41+
{
42+
APIGroups: []string{""},
43+
Resources: []string{
44+
"namespaces",
45+
"pods",
46+
"services",
47+
"secrets",
48+
},
49+
Verbs: metav1.Verbs{"list"},
50+
},
51+
{
52+
APIGroups: []string{"apps"},
53+
Resources: []string{"deployments"},
54+
Verbs: metav1.Verbs{"list"},
55+
},
56+
{
57+
APIGroups: []string{"extensions"},
58+
Resources: []string{"ingresses"},
59+
Verbs: metav1.Verbs{"list"},
60+
},
61+
{
62+
APIGroups: []string{"storage.k8s.io"},
63+
Resources: []string{"storageclasses"},
64+
Verbs: metav1.Verbs{"list"},
65+
},
66+
{
67+
APIGroups: []string{"apiextensions.k8s.io"},
68+
Resources: []string{"customresourcedefinitions"},
69+
Verbs: metav1.Verbs{"list"},
70+
},
71+
},
72+
}
73+
_, err = clientset.RbacV1().ClusterRoles().Create(&role)
74+
if err != nil {
75+
return "", err
76+
}
77+
78+
roleBinding := rbacv1.ClusterRoleBinding{
79+
TypeMeta: metav1.TypeMeta{
80+
APIVersion: "v1",
81+
Kind: "ClusterRoleBinding",
82+
},
83+
ObjectMeta: metav1.ObjectMeta{
84+
Name: name,
85+
Namespace: namespace,
86+
},
87+
Subjects: []rbacv1.Subject{
88+
{
89+
Kind: "ServiceAccount",
90+
Name: name,
91+
Namespace: namespace,
92+
},
93+
},
94+
RoleRef: rbacv1.RoleRef{
95+
APIGroup: "rbac.authorization.k8s.io",
96+
Kind: "ClusterRole",
97+
Name: name,
98+
},
99+
}
100+
_, err = clientset.RbacV1().ClusterRoleBindings().Create(&roleBinding)
101+
if err != nil {
102+
return "", err
103+
}
104+
105+
return name, nil
106+
}
107+
108+
func removeServiceAccount(name string, namespace string, clientset *kubernetes.Clientset) error {
109+
if err := clientset.RbacV1().ClusterRoleBindings().Delete(name, &metav1.DeleteOptions{}); err != nil {
110+
return err
111+
}
112+
113+
if err := clientset.RbacV1().ClusterRoles().Delete(name, &metav1.DeleteOptions{}); err != nil {
114+
return err
115+
}
116+
117+
if err := clientset.CoreV1().ServiceAccounts(namespace).Delete(name, &metav1.DeleteOptions{}); err != nil {
118+
return err
119+
}
120+
121+
return nil
122+
}

0 commit comments

Comments
 (0)