Skip to content

Commit cd4b9a0

Browse files
author
olegs-codefresh
committed
Add default behaviour
Create will add only the current context --all will add all clusters --context name will add only one contex
1 parent d7ca5ee commit cd4b9a0

File tree

4 files changed

+153
-59
lines changed

4 files changed

+153
-59
lines changed

README.md

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,46 @@
11
# Stevedore
2-
Simple tool that will add all your working clusters to you Codefresh account
2+
Simple tool that will add your working clusters to you Codefresh account
33

44
# Install
55
`go get github.com/codefresh-io/stevedore`
66

77
# Run
8-
Run `stevedore create --token {Codefresh JWT token}` to add all cluster from your `$HOME/.kube/config`
8+
`stevedore create --help`
9+
```
10+
NAME:
11+
main create -
12+
13+
USAGE:
14+
main create [command options] [arguments...]
15+
16+
DESCRIPTION:
17+
Create clusters in Codefresh
18+
19+
OPTIONS:
20+
--verbose, -v Turn on verbose mode
21+
--all, -a Add all clusters from config file, default is only current context
22+
--context value, -c value Add spesific cluster
23+
--token value Codefresh JWT token [$CODEFRESH_TOKEN]
24+
--config value Kubernetes config file to be used as input (default: "/Users/oleg/.kube/config") [$KUBECONFIG]
25+
```
926

1027
# Run as docker container
28+
* No need to `go get github.com/codefresh-io/stevedore`
29+
* Requiements:
30+
* Docker
31+
* kubeconfig placed in default directory `$HOME/.kube/config`
32+
* For clusters hosted in GKE - ensure `$HOME/.config/gcloud/application_default_credentials.json` exist
33+
To add all availible clusters run:
1134
```
1235
docker run \
1336
-t \
1437
-e KUBECONFIG=/config \
15-
-e CODEFRESH_TOKEN=${PASTE_CODEFRESH_TOKEN} \
38+
-e CODEFRESH_TOKEN=$PASTE_CODEFRESH_TOKEN \
1639
-e GOOGLE_APPLICATION_CREDENTIALS=/.config/gcloud/application_default_credentials.json \
1740
-v ~/.kube/config:/config \
1841
-v ~/.config/gcloud/:/.config/gcloud \
19-
codefresh/stevedore create
42+
codefresh/stevedore create --all
2043
```
21-
GOOGLE_APPLICATION_CREDENTIALS - needed when you have clusters that are hosted in Google
2244

2345
# Find you Codefresh JWT token
2446
* Go to `https://g.codefresh.io/api/`
@@ -28,7 +50,6 @@ GOOGLE_APPLICATION_CREDENTIALS - needed when you have clusters that are hosted i
2850
`stevedore create --token {Codefresh token} --config {another kube config valid file}`
2951

3052
# Todo:
31-
* [ ] Tests!
3253
* [ ] Support interactive mode
3354
* [X] Support verbose/debug mode
3455
* [ ] Support service-accounts from not default namespace

cli.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ func setupCli() *cli.App {
1818
}
1919

2020
var (
21-
codefreshJwt string
22-
kubeConfigPath string
21+
codefreshJwt string
22+
kubeConfigPath string
23+
runOnAllContexts bool
24+
runOnContext string
2325
)
2426

2527
func setupCommands(app *cli.App) {
2628
app.Commands = []cli.Command{
2729
{
2830
Name: "create",
29-
Description: "Create clusters in Codefresh",
31+
Description: "Create clusters in Codefresh. Default is to add current-context",
3032
Action: create,
3133
Before: func(c *cli.Context) error {
3234
log.SetLevel(log.WarnLevel)
@@ -47,7 +49,17 @@ func setupCommands(app *cli.App) {
4749
Flags: []cli.Flag{
4850
cli.BoolFlag{
4951
Name: "verbose, v",
50-
Usage: "Turn on verbose mode, default is Warning",
52+
Usage: "Turn on verbose mode",
53+
},
54+
cli.BoolFlag{
55+
Name: "all, a",
56+
Usage: "Add all clusters from config file, default is only current context",
57+
Destination: &runOnAllContexts,
58+
},
59+
cli.StringFlag{
60+
Name: "context, c",
61+
Usage: "Add spesific cluster",
62+
Destination: &runOnContext,
5163
},
5264
cli.StringFlag{
5365
Name: "token",

create-clusters.go

Lines changed: 110 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -19,66 +19,122 @@ import (
1919

2020
var baseCodefreshURL = "https://g.codefresh.io/"
2121

22-
func create(cli *cli.Context) {
22+
func getConfigOrDie() *api.Config {
23+
return clientcmd.GetConfigFromFileOrDie(kubeConfigPath)
24+
}
2325

24-
cnf := clientcmd.GetConfigFromFileOrDie(kubeConfigPath)
25-
c := *cnf
26-
override := clientcmd.ConfigOverrides{
26+
func getDefaultOverride() clientcmd.ConfigOverrides {
27+
return clientcmd.ConfigOverrides{
2728
ClusterInfo: api.Cluster{
2829
Server: "",
2930
},
3031
}
31-
for contextName := range c.Contexts {
32-
logger := log.WithFields(log.Fields{
33-
"context_name": contextName,
34-
})
35-
logger.Info("Found context")
36-
config := clientcmd.NewNonInteractiveClientConfig(c, contextName, &override, nil)
37-
clientCnf, e := config.ClientConfig()
38-
39-
if e != nil {
40-
msg := fmt.Sprintf("Failed to create config with error:\n%s\n\n", e)
41-
logger.Warn(msg)
42-
continue
43-
}
44-
logger.Info("Created config for context")
32+
}
33+
func create(cli *cli.Context) {
34+
cnf := getConfigOrDie()
35+
c := *cnf
36+
if runOnAllContexts {
37+
goOverAllContexts(c)
38+
} else if runOnContext != "" {
39+
getOverContextByName(c, runOnContext)
40+
} else {
41+
goOverCurrentContext(c)
42+
}
43+
log.Info("Operation is done, check your account setting")
44+
}
4545

46-
clientset, e := kubernetes.NewForConfig(clientCnf)
47-
if e != nil {
48-
msg := fmt.Sprintf("Failed to create kubernetes client with error:\n%s\n\n", e)
49-
logger.Warn(msg)
50-
continue
51-
}
52-
logger.Info("Created client set for context")
46+
func getLogger(name string) *log.Entry {
47+
return log.WithFields(log.Fields{
48+
"context_name": name,
49+
})
50+
}
5351

54-
sa, e := clientset.CoreV1().ServiceAccounts("default").Get("default", metav1.GetOptions{})
55-
if e != nil {
56-
msg := fmt.Sprintf("Failed to get service account token with error:\n%s\n\n", e)
57-
logger.Warn(msg)
58-
continue
59-
}
60-
secretName := string(sa.Secrets[0].Name)
61-
namespace := sa.Secrets[0].Namespace
62-
logger.Info(fmt.Sprintf("Found service account accisiated with secret: %s in namespace %s\n", secretName, namespace))
63-
64-
secret, e := clientset.CoreV1().Secrets("default").Get(secretName, metav1.GetOptions{})
65-
if e != nil {
66-
msg := fmt.Sprintf("Failed to get secrets with error:\n%s\n\n", e)
67-
logger.Warn(msg)
52+
func goOverAllContexts(cnf api.Config) {
53+
contexts := cnf.Contexts
54+
for contextName := range contexts {
55+
logger := getLogger(contextName)
56+
logger.Info("Working on context")
57+
logger.Info("Creating config")
58+
override := getDefaultOverride()
59+
config := clientcmd.NewNonInteractiveClientConfig(cnf, contextName, &override, nil)
60+
err := goOverContext(contextName, config, logger)
61+
if err != nil {
6862
continue
6963
}
70-
logger.Info(fmt.Sprintf("Found secret"))
64+
}
7165

72-
logger.Info(fmt.Sprintf("Creating cluster in Codefresh"))
73-
body, e := addCluser(clientCnf.Host, contextName, secret.Data["token"], secret.Data["ca.crt"])
74-
if e != nil {
75-
msg := fmt.Sprintf("Failed to add cluster with error:\n%s\n\n", e)
76-
logger.Warn(msg)
77-
continue
78-
}
79-
logger.Warn(fmt.Sprintf("Added!\n%s\n\n", string(body)))
66+
}
67+
68+
func getOverContextByName(cnf api.Config, contextName string) {
69+
override := getDefaultOverride()
70+
config := clientcmd.NewNonInteractiveClientConfig(cnf, contextName, &override, nil)
71+
logger := getLogger(contextName)
72+
goOverContext(contextName, config, logger)
73+
}
74+
75+
func goOverCurrentContext(cnf api.Config) error {
76+
override := getDefaultOverride()
77+
config := clientcmd.NewDefaultClientConfig(cnf, &override)
78+
rawConfig, err := config.RawConfig()
79+
contextName := rawConfig.CurrentContext
80+
logger := getLogger(contextName)
81+
if err != nil {
82+
return err
8083
}
81-
log.Info("Operation is done, check your account setting")
84+
goOverContext(contextName, config, logger)
85+
return nil
86+
}
87+
88+
func goOverContext(contextName string, config clientcmd.ClientConfig, logger *log.Entry) error {
89+
clientCnf, e := config.ClientConfig()
90+
if e != nil {
91+
message := fmt.Sprintf("Failed to create config with error:\n%s", e)
92+
logger.Warn(message)
93+
return e
94+
}
95+
logger.Info("Created config for context")
96+
97+
logger.Info("Creating rest client")
98+
clientset, e := kubernetes.NewForConfig(clientCnf)
99+
if e != nil {
100+
message := fmt.Sprintf("Failed to create kubernetes client with error:\n%s", e)
101+
logger.Warn(message)
102+
return e
103+
}
104+
logger.Info("Created client set for context")
105+
106+
logger.Info("Fetching service account from cluster")
107+
sa, e := clientset.CoreV1().ServiceAccounts("default").Get("default", metav1.GetOptions{})
108+
if e != nil {
109+
message := fmt.Sprintf("Failed to get service account token with error:\n%s", e)
110+
logger.Warn(message)
111+
return e
112+
}
113+
secretName := string(sa.Secrets[0].Name)
114+
namespace := sa.Namespace
115+
logger.WithFields(log.Fields{
116+
"secret_name": secretName,
117+
"namespace": namespace,
118+
}).Info(fmt.Sprint("Found service account accisiated with secret"))
119+
120+
logger.Info("Fetching secret from cluster")
121+
secret, e := clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{})
122+
if e != nil {
123+
message := fmt.Sprintf("Failed to get secrets with error:\n%s", e)
124+
logger.Warn(message)
125+
return e
126+
}
127+
logger.Info(fmt.Sprint("Found secret"))
128+
129+
logger.Info(fmt.Sprint("Creating cluster in Codefresh"))
130+
_, e = addCluser(clientCnf.Host, contextName, secret.Data["token"], secret.Data["ca.crt"])
131+
if e != nil {
132+
message := fmt.Sprintf("Failed to add cluster with error:\n%s", e)
133+
logger.Error(message)
134+
return e
135+
}
136+
logger.Warn(fmt.Sprint("Cluster added!"))
137+
return nil
82138
}
83139

84140
func addCluser(host string, contextName string, token []byte, crt []byte) ([]byte, error) {
@@ -108,10 +164,15 @@ func addCluser(host string, contextName string, token []byte, crt []byte) ([]byt
108164
return nil, err
109165
}
110166
defer res.Body.Close()
167+
111168
body, err := ioutil.ReadAll(res.Body)
112169
if err != nil {
113170
return nil, err
114171
}
172+
if res.StatusCode != 201 {
173+
err := errors.New(string(body))
174+
return nil, fmt.Errorf("Failed to create cluster %s", err)
175+
}
115176
return body, nil
116177
}
117178

dist/bin/stevedore

12.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)