Skip to content

Commit 0f70184

Browse files
committed
Merge pull request #120 from ethernetdan/move-localkubectl
Kubernetes 1.2 + moved localkube controller to localkube repo
2 parents ed9568b + 293110c commit 0f70184

137 files changed

Lines changed: 13589 additions & 3023 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Godeps/Godeps.json

Lines changed: 260 additions & 176 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cli/cluster.go

Lines changed: 2 additions & 225 deletions
Original file line numberDiff line numberDiff line change
@@ -1,237 +1,14 @@
11
package cli
22

33
import (
4-
"fmt"
5-
"strings"
4+
"rsprd.com/localkube/pkg/localkubectl"
65

76
"github.com/codegangsta/cli"
8-
docker "github.com/fsouza/go-dockerclient"
9-
"github.com/mitchellh/go-homedir"
10-
kubectlapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
11-
kubectlcfg "k8s.io/kubernetes/pkg/kubectl/cmd/config"
127
)
138

14-
const (
15-
LocalkubeContainerName = "/localkube"
16-
LocalkubeImageName = "redspreadapps/localkube"
17-
LocalkubeDefaultTag = "latest"
18-
19-
DefaultHostDataDir = "~/.localkube/data"
20-
ContainerDataDir = "/var/localkube/data"
21-
KubectlName = "localkube"
22-
)
239

2410
// Cluster manages the localkube Kubernetes development environment.
2511
func (s SpreadCli) Cluster() *cli.Command {
26-
return &cli.Command{
27-
Name: "cluster",
28-
Usage: "spread cluster [-a] [-t <tag>] <start|stop> [ClusterDataDirectory]",
29-
Description: "Manages localkube Kubernetes development environment",
30-
ArgsUsage: "-a will attach to the process and print logs to stdout, -t specfies localkube tag to use, default is latest.",
31-
Action: func(c *cli.Context) {
32-
action := strings.ToLower(c.Args().First())
33-
switch {
34-
case "start" == action:
35-
s.startLocalkube(c)
36-
case "stop" == action:
37-
s.stopLocalkube(c)
38-
default:
39-
s.printf("Invalid option `%s`, must choose start or stop", action)
40-
}
41-
},
42-
}
43-
}
44-
45-
func (s SpreadCli) startLocalkube(c *cli.Context) {
46-
client := s.dockerOrErr()
47-
48-
dataDir := c.Args().Get(1)
49-
if len(dataDir) == 0 {
50-
var err error
51-
dataDir, err = homedir.Expand(DefaultHostDataDir)
52-
if err != nil {
53-
s.fatalf("Unable to expand home directory: %v", err)
54-
}
55-
}
56-
57-
tag := c.String("t")
58-
if len(tag) == 0 {
59-
tag = LocalkubeDefaultTag
60-
}
61-
62-
ctrOpts := localkube(c.Bool("a"), dataDir, tag)
63-
ctr, err := client.CreateContainer(ctrOpts)
64-
if err != nil {
65-
if err.Error() == "no such image" {
66-
s.printf("Pulling localkube image...")
67-
err = client.PullImage(docker.PullImageOptions{
68-
Repository: LocalkubeImageName,
69-
Tag: tag,
70-
}, docker.AuthConfiguration{})
71-
if err != nil {
72-
s.fatalf("Failed to pull localkube image: %v", err)
73-
}
74-
75-
s.startLocalkube(c)
76-
return
77-
} else if err.Error() == "container already exists" {
78-
// replace container if already exists
79-
err = client.RemoveContainer(docker.RemoveContainerOptions{
80-
ID: LocalkubeContainerName,
81-
})
82-
if err != nil {
83-
s.fatalf("Failed to start container: %v", err)
84-
}
85-
s.startLocalkube(c)
86-
return
87-
}
88-
s.fatalf("Failed to create localkube container: %v", err)
89-
90-
}
91-
92-
binds := []string{
93-
"/sys:/sys:rw",
94-
"/var/lib/docker:/var/lib/docker",
95-
"/mnt/sda1/var/lib/docker:/mnt/sda1/var/lib/docker",
96-
"/var/lib/kubelet:/var/lib/kubelet",
97-
"/var/run:/var/run:rw",
98-
"/:/rootfs:ro",
99-
}
100-
101-
// if provided mount etcd data dir
102-
if len(dataDir) != 0 {
103-
dataBind := fmt.Sprintf("%s:%s", dataDir, ContainerDataDir)
104-
binds = append(binds, dataBind)
105-
}
106-
107-
hostConfig := &docker.HostConfig{
108-
Binds: binds,
109-
NetworkMode: "host",
110-
RestartPolicy: docker.AlwaysRestart(),
111-
PidMode: "host",
112-
Privileged: true,
113-
}
114-
err = client.StartContainer(ctr.ID, hostConfig)
115-
if err != nil {
116-
s.fatalf("Failed to start localkube: %v", err)
117-
}
118-
119-
s.printf("Started localkube...")
120-
121-
err = setupContext(client.Endpoint())
122-
if err != nil {
123-
s.fatalf("Could not configure kubectl context.")
124-
}
125-
s.printf("Setup and using kubectl `%s` context.", KubectlName)
126-
return
12+
return localkubectl.Command(s.out)
12713
}
12814

129-
func (s SpreadCli) stopLocalkube(c *cli.Context) {
130-
client := s.dockerOrErr()
131-
132-
ctrs, err := client.ListContainers(docker.ListContainersOptions{
133-
All: true,
134-
Filters: map[string][]string{
135-
"label": []string{"rsprd.com/name=localkube"},
136-
},
137-
})
138-
if err != nil {
139-
s.fatalf("Could not list containers: %v", err)
140-
}
141-
142-
for _, ctr := range ctrs {
143-
if strings.HasPrefix(ctr.Status, "Up") {
144-
s.printf("Stopping container `%s`...\n", ctr.ID)
145-
if err := client.StopContainer(ctr.ID, 5); err != nil {
146-
s.fatalf("Could not kill container: %v", err)
147-
}
148-
}
149-
150-
if err := client.RemoveContainer(docker.RemoveContainerOptions{ID: ctr.ID}); err != nil {
151-
s.fatalf("Could not remove container: %v", err)
152-
}
153-
}
154-
}
155-
156-
func (s SpreadCli) dockerOrErr() *docker.Client {
157-
client, err := docker.NewClientFromEnv()
158-
if err != nil {
159-
s.fatalf("Could not create Docker client: %v", err)
160-
}
161-
162-
_, err = client.Version()
163-
if err != nil {
164-
s.fatalf("Unable to establish connection with Docker daemon: %v", err)
165-
}
166-
return client
167-
}
168-
169-
func localkube(attach bool, dataDir, tag string) docker.CreateContainerOptions {
170-
return docker.CreateContainerOptions{
171-
Name: LocalkubeContainerName,
172-
Config: &docker.Config{
173-
Hostname: "localkube",
174-
AttachStderr: attach,
175-
AttachStdout: attach,
176-
Image: fmt.Sprintf("%s:%s", LocalkubeImageName, tag),
177-
Env: []string{
178-
fmt.Sprintf("KUBE_ETCD_DATA_DIRECTORY=%s", ContainerDataDir),
179-
},
180-
Labels: map[string]string{
181-
"rsprd.com/name": "localkube",
182-
},
183-
StopSignal: "SIGINT",
184-
},
185-
}
186-
}
187-
188-
func identifyHost(endpoint string) (string, error) {
189-
beginPort := strings.LastIndex(endpoint, ":")
190-
switch {
191-
// if using TCP use provided host
192-
case strings.HasPrefix(endpoint, "tcp://"):
193-
return endpoint[6:beginPort], nil
194-
// assuming localhost if Unix
195-
// TODO: Make this customizable
196-
case strings.HasPrefix(endpoint, "unix://"):
197-
return "127.0.0.1", nil
198-
}
199-
return "", fmt.Errorf("Could not determine localkube API server from endpoint `%s`", endpoint)
200-
}
201-
202-
func setupContext(endpoint string) error {
203-
host, err := identifyHost(endpoint)
204-
if err != nil {
205-
return fmt.Errorf("Could not identify host: %v", err)
206-
}
207-
208-
pathOpts := kubectlcfg.NewDefaultPathOptions()
209-
210-
config, err := pathOpts.GetStartingConfig()
211-
if err != nil {
212-
return fmt.Errorf("could not setup config: %v", err)
213-
}
214-
215-
cluster, exists := config.Clusters[KubectlName]
216-
if !exists {
217-
cluster = kubectlapi.NewCluster()
218-
}
219-
220-
// configure cluster
221-
cluster.Server = fmt.Sprintf("%s:8080", host)
222-
cluster.InsecureSkipTLSVerify = true
223-
config.Clusters[KubectlName] = cluster
224-
225-
context, exists := config.Contexts[KubectlName]
226-
if !exists {
227-
context = kubectlapi.NewContext()
228-
}
229-
230-
// configure context
231-
context.Cluster = KubectlName
232-
config.Contexts[KubectlName] = context
233-
234-
config.CurrentContext = KubectlName
235-
236-
return kubectlcfg.ModifyConfig(pathOpts, *config, true)
237-
}

vendor/github.com/Sirupsen/logrus/.gitignore

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Sirupsen/logrus/.travis.yml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Sirupsen/logrus/LICENSE

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)