Commit Graph

177 Commits

Author SHA1 Message Date
Andy Zhou
2971dd6845 Add the ability to execute commands directly with the bash subcommand
In addition to provide an interactive shell, this patch adds the
'--command' and '-c' options to allow user to issue a command in the
context of a cluster.

For example:

$ k3d bash -c 'kubectl cluster-info'
2019-05-24 17:16:12 -07:00
Andy Zhou
5c6f2d7dc5 Avoid hard coding the bash path
OS distribution and user may choose to install bash in different path.
This patch uses bash found by "$PATH" environment, rather than hard code
the bash path.

This patch also handle the case 'bash' are not found. Mostly likely due
to bash not being supported by the platform, or it is not installed.
2019-05-24 17:16:12 -07:00
Andy Zhou
4ef6710e22 Add basic bashShell() function
Add the basic frame work for supporting spawning a bash shell by cli
command.

With this change, we can spawn a bash shell in the context of a cluster

$ k3d create -n my-cluster
$ k3d bash -n my-cluster
[my-cluster] $>

// execute commands with KUBECONFIG already set up
[my-cluster] $> kubectl get pods
2019-05-24 17:16:12 -07:00
Andy Zhou
9f276a68f3 Add getKubeConfig()
Move the logic of retrive per cluster kube config file into
cli/cluster.go. Simplify the CLI handling code.
2019-05-24 17:16:12 -07:00
Andy Zhou
cdcc5e1de6 Add createKubeconfigFile()
Refactoring. Make createKubeconfigFile() a stand along function, so we
don't have to recreate the file every time we look up the file name.
2019-05-24 17:16:12 -07:00
Andy Zhou
1eff974064 Add getClusterKubeConfigPath()
Minor refactor. Add getClusterKubeConfigOath() to make logic reusable
for later changes.
2019-05-24 17:16:12 -07:00
Andy Zhou
175ccbe3cd Improve error handling for CreateCluster()
Co-authored-by: Thorsten Klein <iwilltry42@gmail.com>

@iwilltry42 pointed out that currnet error path calls os.Exit(1), which
does follow the normal CLI framework. This patch implements this
suggestion.

Add a closure fucntion deleteCluster() to reduce code duplication.
2019-05-21 14:10:11 -07:00
Andy Zhou
6dfb1e054b
Merge pull request #61 from andyz-dev/always-on
[Feature] Implement --always-on flag for the create command
2019-05-21 10:46:00 -07:00
Andy Zhou
b9713c4ac4 Add --auto-restart flag for the create command
When creating clusters with the --auto-restart flag, any running cluster
will remain "running" up on docker daemon restart.

By default, without this flag, a "running" cluster becomes "stopped"
after docker daemon restart.

Clusters stopped with 'k3d stop' command will remain stopped after
docker daemon restart regardless the settings of this flag.
2019-05-21 09:31:45 -07:00
Andy Zhou
5028f2882f
Merge pull request #60 from andyz-dev/atomic-create
[Enhancement] Atomic create
2019-05-20 23:21:19 -07:00
Andy Zhou
490b7cd864 Atomic create
Before this commit, when creating a cluster was not successful, some
resource may be lingering behind. This commit fixes those cases.

Now the cluster creation model is easier to understand. Either a cluster
is successfully created, or all resources created will be cleaned up.

The intention is to keep the "atomic create" model going forward for
k3d.
2019-05-20 19:03:32 -07:00
Andy Zhou
3683eeb181 Deprecate the --timeout option
Use --wait <timeout> instead
2019-05-20 14:07:12 -07:00
Andy Zhou
01931b5894 Make list command always show all clusters. Remove --all option
It feels more natural to have the list command show all clusters by
default.
2019-05-18 22:25:24 -07:00
Andy Zhou
cb1daebe41
Merge pull request #52 from andyz-dev/rename
[Enhancement] Rename cli/config.go to cli/cluster.go
2019-05-16 23:52:07 -07:00
Andy Zhou
abfd6bd18a Makefile: Add lint target and factor the check target 2019-05-16 23:37:46 -07:00
Andy Zhou
10c6eeeea5 Rename cli/config.go to cli/cluster.go
Config.go mainly contains functions around the cluster data structure. Rename
the file to cluster.go
2019-05-16 20:07:09 -07:00
Andy Zhou
89d51a0abc
Merge pull request #49 from andyz-dev/makefile
[Enhancement] Makefile
2019-05-16 00:21:50 -07:00
Andy Zhou
c3c8f0d6f8 Golang format clean up
Changes made by 'make fmt'.
2019-05-16 00:02:10 -07:00
Andy Zhou
62f7071ee5
Merge pull request #40 from andyz-dev/reclaim-volumes
[Enhancement] Automatically reclaim k3s container volumes after a cluster is deleted
2019-05-15 15:42:16 -07:00
Andy Zhou
cd2292ba3a Automatically reclaim k3s container volumes after a cluster is deleted
Thanks @zeerorg for the suggestion on possible container volume leak.

With out this fix the k3s container volumes are left in the reclaimable
state. This experiment confirms it:

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              14                  0                   2.131GB             2.131GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

$ bin/k3d create; sleep 5; bin/k3d delete

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              14                  0                   2.131GB             2.131GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       3                   0                   2.366MB             2.366MB (100%)
Build Cache         0                   0                   0B                  0B

In this case, 2.36MB are left in the reclaimable state. This number can be
larger with a larger cluster.

With this fix, output of "docker system df" does not contain the
claimable volume
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              14                  0                   2.131GB             2.131GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B
2019-05-15 15:27:47 -07:00
Andy Zhou
3c3c72b4af Check for cluster existence before using a name to create a new cluster
This change improve the error message. It also avoids the tricky situation of
potentially destroying an existing clusters when the same name cluster
creation fails. For more details see issue #42.
2019-05-15 09:56:48 -07:00
Andy Zhou
b48debb176 Refactor getClusters() to make the API easier to use
Simplify the caller of this function in the code base. Also remove
getCluster() since there is no caller of this function any more.
2019-05-15 09:56:48 -07:00
Andy Zhou
a0eb69b73e Allow the volume argument to be specified multiple times
Most k3d arguments are using in "stringSlice" style, allowing the
argument to supplied multiple times. Currently "volume" is an exception
to this style, require multiple arguments to be supplied in a single
argument, separated by comma.

This commit improve the k3d usability by improve the consistency of its
argument style.
2019-05-15 09:35:07 -07:00
iwilltry42
6823470ef5 don't allow empty node-specifiers 2019-05-15 07:11:06 +02:00
iwilltry42
8512ac0c8a make server the default node for portmaps 2019-05-14 20:48:48 +02:00
iwilltry42
2640fc13ce make server the default node for portmaps 2019-05-14 16:44:47 +02:00
iwilltry42
c5f410d5ef Merge branch 'master' of https://github.com/rancher/k3d into feature/enhanced-port-mapping 2019-05-14 14:40:16 +02:00
iwilltry42
6d0fc76b22 improve portspec and ndoespec validation 2019-05-14 14:27:30 +02:00
iwilltry42
464d2e23c5 Offset multiplication 2019-05-14 13:13:56 +02:00
iwilltry42
107700dc98 update log messages 2019-05-14 13:12:10 +02:00
iwilltry42
a68d9e7042 generate container names in a func and use it to determine if node-specifier is valid 2019-05-14 11:33:10 +02:00
Andy Zhou
4674a5d6c8 Improve cluster status display
Before this change, k3d list stopped cluster as "exited", This patch
change it to "stopped".

$ k3d create -n test
$ k3d stop -n test
$ k3d list --all

+------+------------------------------+--------+---------+
| NAME |            IMAGE             | STATUS | WORKERS |
+------+------------------------------+--------+---------+
| test | docker.io/rancher/k3s:v0.5.0 | exited |   0/0   |
+------+------------------------------+--------+---------+

Before this change, k3d report the server status as the cluster status.
This commit output the server status if the server and all worker
containers status agree. Otherwise, the cluster status is reported as "unhealthy".

$ k3d create --workers 2
$ docker ps -a

d14135f5929c        rancher/k3s:v0.5.0   "/bin/k3s agent"         6 seconds ago       Up 5 seconds                                        k3d-k3s-default-worker-1
612d71f3ec23        rancher/k3s:v0.5.0   "/bin/k3s agent"         6 seconds ago       Up 5 seconds                                        k3d-k3s-default-worker-0
7f201731bf45        rancher/k3s:v0.5.0   "/bin/k3s server --h…"   7 seconds ago       Up 6 seconds               0.0.0.0:6443->6443/tcp   k3d-k3s-default-server

$ docker stop d14135f5929c

$ bin/k3d list --all

+-------------+------------------------------+-----------+---------+
|    NAME     |            IMAGE             |  STATUS   | WORKERS |
+-------------+------------------------------+-----------+---------+
| k3s-default | docker.io/rancher/k3s:v0.5.0 | unhealthy |   1/2   |
+-------------+------------------------------+-----------+---------+
2019-05-13 21:16:19 -07:00
Andy Zhou
6292c89ec4 Minor simplification of getCluster()
This make the code easier to read.
2019-05-13 21:12:24 -07:00
Andy Zhou
953578ed11 Avoid output an empty table when no cluster to list
Before this patch:

$ k3d create
$ k3d stop
$ k3d list

+------+-------+--------+---------+
| NAME | IMAGE | STATUS | WORKERS |
+------+-------+--------+---------+
+------+-------+--------+---------+

This commit omits such empty table.
2019-05-13 21:10:38 -07:00
iwilltry42
f77d67aaf0 Merge branch 'master' of https://github.com/rancher/k3d into new-publish 2019-05-13 09:10:11 +02:00
Thorsten Klein
3a2eeba9b1
Merge pull request #41 from andyz-dev/center-align
[Enhancement] Center align list output
2019-05-13 09:10:04 +02:00
iwilltry42
a0c0c3ff9d add --api-port and --port-auto-offset 2019-05-13 09:08:32 +02:00
iwilltry42
7d6ae201e9 make node-specifier mandatory 2019-05-13 08:12:09 +02:00
iwilltry42
58b1682e32 Merge branch 'master' of https://github.com/rancher/k3d into new-publish 2019-05-13 07:54:07 +02:00
iwilltry42
0670a0e11b resovle conflicts 2019-05-13 07:53:23 +02:00
iwilltry42
a881a87ef6 go fmt 2019-05-13 07:50:05 +02:00
Andy Zhou
2f07bdb78a Center align list output
Make list output center aligne. It is slightly eaier to read.

Before the commit:

$ bin/k3d list --all

+-------------+------------------------------+---------+---------+
|    NAME     |            IMAGE             | STATUS  | WORKERS |
+-------------+------------------------------+---------+---------+
| k3s-default | docker.io/rancher/k3s:v0.5.0 | running | 2/2     |
+-------------+------------------------------+---------+---------+

After this commit:

$ bin/k3d list --all

+-------------+------------------------------+---------+---------+
|    NAME     |            IMAGE             | STATUS  | WORKERS |
+-------------+------------------------------+---------+---------+
| k3s-default | docker.io/rancher/k3s:v0.5.0 | running |   2/2   |
+-------------+------------------------------+---------+---------+

In this output, only the last cell shows up differently.
2019-05-12 16:01:49 -07:00
Rishabh Gupta
787d6608ba Delete a cluster if it is not started due to port conflicts or any other unforseen error
Signed-off-by: Rishabh Gupta <r.g.gupta@outlook.com>
2019-05-10 13:10:55 +05:30
iwilltry42
0c8cdc004a Merge branch 'master' of https://github.com/rancher/k3d into new-publish 2019-05-09 15:36:27 +02:00
Andy Zhou
32cc70b599
Merge pull request #32 from andyz-dev/publish
[Feature] Add --publish/--add-port flag for port mappings
2019-05-09 01:09:40 -07:00
iwilltry42
fd720b0887 move hostname check to util 2019-05-09 08:05:39 +02:00
Andy Zhou
93f72e672a Make sure the culster name is valid before creating it.
MAke sure the cluster name is a RFC 1123 compliant host name, since the
cluster name is used as base for expanding into a auto generated
host names for k3s nodes.
2019-05-08 15:57:32 -07:00
iwilltry42
124a45688f working version 2019-05-08 15:29:57 +02:00
iwilltry42
d35f12a77e init 2019-05-08 13:37:24 +02:00
Andy Zhou
65f2820b3f Support publishing ports for the worker nodes
All ports exposed by --publish will also be exported for all worker
nodes. The host port will be auto indexed based worker id.

For example: with the following command option:

k3d create --publish  80:80  --publish 90:90/udp --workers 1

The exposed ports will be:

host TCP port 80  -> k3s server TCP 80
host TCP port 90  -> k3s server TCP 90
host UDP port 81 -> k3s worker 0 UDP 80
host UDP port 91 -> k3s worker 0 UDP 90
2019-05-08 01:45:16 -07:00
Andy Zhou
988fbdbdc5 Refactor createWorker() API
Use postfix as int instead string. This make the following patch easier
to read.
2019-05-08 01:45:16 -07:00
Andy Zhou
f70a8b42f7 Add support for the --publish option for create subcommand
Inspired by the docker CLI, --publish take same input as docker CLI and
provides similar functions. For the k3s cluster server node, it behaves
the same as docker cli; it exports the k3d server ports to the host
ports.

Handling for worker nodes will be added in the subsequent patches.

This option can be used mutiple times for exposing more ports.

--add-port is an alias to this option.
2019-05-08 01:45:16 -07:00
Andy Zhou
6fe75640bb Add the PublishedPorts helping class
This class holds the parsed results of the --publish options. Its
methods helps the create clones of class, with mutations applied.

Currently, there are two methods: Offset() change the host ports by a
fixed amount.  Addport() adds one additional port to the class.
2019-05-07 11:38:00 -07:00
Thorsten Klein
0c332faf2b
Merge pull request #30 from rancher/feature/custom-image-flag
[Feature] add --image/-i flag to specify custom k3s image/tag (start deprecation of --version flag)
2019-05-07 14:55:00 +02:00
iwilltry42
40fb583160 better image and version flags 2019-05-07 09:09:05 +02:00
iwilltry42
4fbda454f7 remove todo 2019-05-06 08:32:18 +02:00
iwilltry42
9ac81982e2 [Enhancement] set hostnames for nodes 2019-05-06 08:26:10 +02:00
iwilltry42
e78a548da2 [Feature] add --image/-i flag to specify custom k3s image 2019-05-06 08:13:11 +02:00
Thorsten Klein
a0d9089a6f
Merge pull request #27 from ibuildthecloud/pull
[ENHANCEMENT] Only pull image if the image is not found and always force remove containers (thanks @ibuildthecloud )
2019-05-04 08:19:33 +02:00
Darren Shepherd
13aaec64ed Only create network if not found 2019-05-03 21:13:22 -07:00
Darren Shepherd
7c76f4621a Always to force delete 2019-05-03 17:14:16 -07:00
Darren Shepherd
c86518e3d4 Only pull image if the image is not found 2019-05-03 17:13:41 -07:00
iwilltry42
1294b5b3a6 Merge branch 'imporve-error-message' of https://github.com/andyz-dev/k3d into andyz-dev-imporve-error-message 2019-05-03 07:59:25 +02:00
Andy Zhou
2267924578 cli: Improve error message for 'k3d get-kubeconfig'
Before this change, command:
 $ k3d create -name test
 $ k3d get-kubeconfig

Produces the following error message:

	panic: runtime error: index out of range

	goroutine 1 [running]:
	github.com/rancher/k3d/cli.GetKubeConfig(0xc00031a160, 0x0, 0x0)
		/Users/azhou/projs/k3d/cli/commands.go:335 +0x105d
	github.com/urfave/cli.HandleAction(0x13e7ca0, 0x148f0b0, 0xc00031a160, 0xc000304000, 0x0)
		/Users/azhou/projs/rcloud/pkg/mod/github.com/urfave/cli@v1.20.0/app.go:490 +0xc8
	github.com/urfave/cli.Command.Run(0x1477cb5, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1480cd8, 0x23, 0x0, ...)
		/Users/azhou/projs/rcloud/pkg/mod/github.com/urfave/cli@v1.20.0/command.go:210 +0x996
	github.com/urfave/cli.(*App).Run(0xc0000bc1a0, 0xc00000e060, 0x2, 0x2, 0x0, 0x0)
		/Users/azhou/projs/rcloud/pkg/mod/github.com/urfave/cli@v1.20.0/app.go:255 +0x6af
	main.main()
		/Users/azhou/projs/k3d/main.go:185 +0x11e0

This patch improve the error message by avoid the panic. Now the output
becomes:

	019/05/02 12:05:30 No server container for cluster k3s_default
2019-05-02 12:17:36 -07:00
iwilltry42
942e667b24 add some comments 2019-04-29 08:19:01 +02:00
iwilltry42
068172aa1a fix output order for logs 2019-04-23 15:20:06 +02:00
iwilltry42
e9206a74b2 make start/stop functions start/stop workers as well 2019-04-23 11:22:59 +02:00
iwilltry42
9142529c62 get-kubeconfig using docker sdk 2019-04-23 10:51:02 +02:00
iwilltry42
6c072fb6d9 connect workers and server via own docker network 2019-04-18 16:08:15 +02:00
iwilltry42
92039edbb1 fix clusters not being filtered correctly 2019-04-18 15:10:28 +02:00
iwilltry42
7d5964c3b9 fix image not being pulled if reader is not being used 2019-04-18 14:42:41 +02:00
iwilltry42
b0b08d2119 bring back env vars, enable booting workers and base list output on docker data instead of dirs 2019-04-16 11:12:05 +02:00
iwilltry42
7eec5b061b use docker sdk wherever possible 2019-04-15 15:48:43 +02:00
iwilltry42
65b5f06bfc add server-arg and env flags 2019-04-11 14:31:46 +02:00
iwilltry42
65c0bf9e5c better errors 2019-04-10 08:38:54 +02:00
iwilltry42
0b35d7c138 get back --all function for all commands 2019-04-09 15:12:38 +02:00
Rishabh Gupta
29fced4ef7 Added version tags, separated command implementaitons, added wait and timeout
Signed-off-by: Rishabh Gupta <r.g.gupta@outlook.com>
2019-04-09 13:47:47 +05:30