2017-02-22 03:27:51 +00:00
|
|
|
/*
|
|
|
|
Copyright 2016 The Kubernetes Authors All rights reserved.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2017-05-30 17:06:59 +00:00
|
|
|
package none
|
2017-02-22 03:27:51 +00:00
|
|
|
|
|
|
|
import (
|
2017-08-21 23:31:50 +00:00
|
|
|
"bytes"
|
2017-02-22 03:27:51 +00:00
|
|
|
"fmt"
|
|
|
|
"os/exec"
|
|
|
|
"strings"
|
|
|
|
|
2018-04-03 23:05:18 +00:00
|
|
|
"github.com/golang/glog"
|
|
|
|
|
2017-02-22 03:27:51 +00:00
|
|
|
"github.com/docker/machine/libmachine/drivers"
|
|
|
|
"github.com/docker/machine/libmachine/state"
|
2017-06-14 21:27:01 +00:00
|
|
|
"github.com/pkg/errors"
|
2017-12-21 21:28:08 +00:00
|
|
|
"k8s.io/apimachinery/pkg/util/net"
|
2017-09-10 21:59:11 +00:00
|
|
|
pkgdrivers "k8s.io/minikube/pkg/drivers"
|
2017-05-10 20:26:05 +00:00
|
|
|
"k8s.io/minikube/pkg/minikube/constants"
|
2017-02-22 03:27:51 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const driverName = "none"
|
2018-04-03 23:05:18 +00:00
|
|
|
const dockerstopcmd = `docker kill $(docker ps -a --filter="name=k8s_" --format="{{.ID}}")`
|
|
|
|
|
|
|
|
var dockerkillcmd = fmt.Sprintf(`docker rm $(%s)`, dockerstopcmd)
|
2017-02-22 03:27:51 +00:00
|
|
|
|
|
|
|
// none Driver is a driver designed to run localkube w/o a VM
|
|
|
|
type Driver struct {
|
|
|
|
*drivers.BaseDriver
|
2017-09-10 21:59:11 +00:00
|
|
|
*pkgdrivers.CommonDriver
|
2017-02-22 03:27:51 +00:00
|
|
|
URL string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewDriver(hostName, storePath string) *Driver {
|
|
|
|
return &Driver{
|
|
|
|
BaseDriver: &drivers.BaseDriver{
|
|
|
|
MachineName: hostName,
|
|
|
|
StorePath: storePath,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-26 16:41:08 +00:00
|
|
|
// PreCreateCheck checks for correct priviledges and dependencies
|
2017-05-10 20:26:05 +00:00
|
|
|
func (d *Driver) PreCreateCheck() error {
|
2017-06-26 16:41:08 +00:00
|
|
|
// check that docker is on path
|
|
|
|
_, err := exec.LookPath("docker")
|
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "docker cannot be found on the path for this machine. "+
|
|
|
|
"A docker installation is a requirement for using the none driver")
|
|
|
|
}
|
|
|
|
|
2017-05-10 20:26:05 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-02-22 03:27:51 +00:00
|
|
|
func (d *Driver) Create() error {
|
2017-05-10 20:26:05 +00:00
|
|
|
// creation for the none driver is handled by commands.go
|
2017-02-22 03:27:51 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// DriverName returns the name of the driver
|
|
|
|
func (d *Driver) DriverName() string {
|
|
|
|
return driverName
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) GetIP() (string, error) {
|
2017-12-21 21:28:08 +00:00
|
|
|
ip, err := net.ChooseBindAddress(nil)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return ip.String(), nil
|
2017-02-22 03:27:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) GetSSHHostname() (string, error) {
|
2017-05-10 20:26:05 +00:00
|
|
|
return "", fmt.Errorf("driver does not support ssh commands")
|
2017-02-22 03:27:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) GetSSHPort() (int, error) {
|
2017-05-10 20:26:05 +00:00
|
|
|
return 0, fmt.Errorf("driver does not support ssh commands")
|
2017-02-22 03:27:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) GetURL() (string, error) {
|
2017-12-21 21:28:08 +00:00
|
|
|
ip, err := d.GetIP()
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Sprintf("tcp://%s:2376", ip), nil
|
2017-02-22 03:27:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) GetState() (state.State, error) {
|
2017-06-14 21:27:01 +00:00
|
|
|
var statuscmd = fmt.Sprintf("if [[ `systemctl` =~ -\\.mount ]] &>/dev/null; "+`then
|
2017-12-28 18:15:00 +00:00
|
|
|
sudo systemctl is-active kubelet localkube &>/dev/null && echo "Running" || echo "Stopped"
|
2017-06-14 21:27:01 +00:00
|
|
|
else
|
|
|
|
if ps $(cat %s) &>/dev/null; then
|
|
|
|
echo "Running"
|
|
|
|
else
|
|
|
|
echo "Stopped"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
`, constants.LocalkubePIDPath)
|
|
|
|
|
|
|
|
out, err := runCommand(statuscmd, true)
|
2017-02-22 03:27:51 +00:00
|
|
|
if err != nil {
|
|
|
|
return state.None, err
|
|
|
|
}
|
2017-06-14 21:27:01 +00:00
|
|
|
s := strings.TrimSpace(out)
|
2017-02-22 03:27:51 +00:00
|
|
|
if state.Running.String() == s {
|
|
|
|
return state.Running, nil
|
|
|
|
} else if state.Stopped.String() == s {
|
|
|
|
return state.Stopped, nil
|
|
|
|
} else {
|
|
|
|
return state.None, fmt.Errorf("Error: Unrecognize output from GetLocalkubeStatus: %s", s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) Kill() error {
|
2018-04-03 23:05:18 +00:00
|
|
|
for _, cmdStr := range [][]string{
|
|
|
|
{"systemctl", "stop", "localkube.service"},
|
|
|
|
{"rm", "-rf", "/var/lib/localkube"},
|
|
|
|
} {
|
|
|
|
cmd := exec.Command("sudo", cmdStr...)
|
|
|
|
if out, err := cmd.CombinedOutput(); err != nil {
|
|
|
|
glog.Warningf("Error %s running command: %s. Output: %s", err, cmdStr, string(out))
|
|
|
|
}
|
2017-02-22 03:27:51 +00:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) Remove() error {
|
2018-02-15 16:37:46 +00:00
|
|
|
rmCmd := `for svc in "localkube" "kubelet"; do
|
2017-12-28 18:15:00 +00:00
|
|
|
sudo systemctl stop "$svc".service
|
|
|
|
done
|
2018-04-03 23:05:18 +00:00
|
|
|
sudo rm -rf /data
|
|
|
|
sudo rm -rf /etc/kubernetes/manifests
|
2017-12-28 18:15:00 +00:00
|
|
|
sudo rm -rf /var/lib/localkube || true`
|
2017-09-12 04:29:43 +00:00
|
|
|
|
2018-04-03 23:05:18 +00:00
|
|
|
for _, cmdStr := range []string{rmCmd, dockerkillcmd} {
|
|
|
|
if out, err := runCommand(cmdStr, true); err != nil {
|
|
|
|
glog.Warningf("Error %s running command: %s, Output: %s", err, cmdStr, out)
|
|
|
|
}
|
2017-02-22 03:27:51 +00:00
|
|
|
}
|
2017-12-28 18:15:00 +00:00
|
|
|
|
2017-02-22 03:27:51 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) Restart() error {
|
2018-02-15 16:37:46 +00:00
|
|
|
restartCmd := `for svc in "localkube" "kubelet"; do
|
2017-12-28 18:15:00 +00:00
|
|
|
if systemctl is-active $svc.service; then
|
|
|
|
sudo systemctl restart "$svc".service
|
|
|
|
fi
|
|
|
|
done`
|
|
|
|
|
|
|
|
cmd := exec.Command(restartCmd)
|
2017-02-22 03:27:51 +00:00
|
|
|
if err := cmd.Start(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) Start() error {
|
2017-12-28 17:35:10 +00:00
|
|
|
var err error
|
|
|
|
d.IPAddress, err = d.GetIP()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
d.URL, err = d.GetURL()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-02-22 03:27:51 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) Stop() error {
|
2017-06-14 21:27:01 +00:00
|
|
|
var stopcmd = fmt.Sprintf("if [[ `systemctl` =~ -\\.mount ]] &>/dev/null; "+`then
|
2018-02-15 16:37:46 +00:00
|
|
|
for svc in "localkube" "kubelet"; do
|
|
|
|
sudo systemctl stop "$svc".service || true
|
|
|
|
done
|
2017-06-14 21:27:01 +00:00
|
|
|
else
|
|
|
|
sudo kill $(cat %s)
|
|
|
|
fi
|
|
|
|
`, constants.LocalkubePIDPath)
|
2017-09-12 04:29:43 +00:00
|
|
|
_, err := runCommand(stopcmd, false)
|
2017-06-14 21:27:01 +00:00
|
|
|
if err != nil {
|
2017-02-22 03:27:51 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
for {
|
|
|
|
s, err := d.GetState()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if s != state.Running {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2018-04-03 23:05:18 +00:00
|
|
|
if out, err := runCommand(dockerstopcmd, false); err != nil {
|
|
|
|
glog.Warningf("Error %s running command %s. Output: %s", err, dockerstopcmd, out)
|
|
|
|
}
|
2017-02-22 03:27:51 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) RunSSHCommandFromDriver() error {
|
|
|
|
return fmt.Errorf("driver does not support ssh commands")
|
|
|
|
}
|
2017-06-14 21:27:01 +00:00
|
|
|
|
|
|
|
func runCommand(command string, sudo bool) (string, error) {
|
|
|
|
cmd := exec.Command("/bin/bash", "-c", command)
|
|
|
|
if sudo {
|
|
|
|
cmd = exec.Command("sudo", "/bin/bash", "-c", command)
|
|
|
|
}
|
2017-08-21 23:31:50 +00:00
|
|
|
var out bytes.Buffer
|
|
|
|
var stderr bytes.Buffer
|
|
|
|
cmd.Stdout = &out
|
|
|
|
cmd.Stderr = &stderr
|
|
|
|
err := cmd.Run()
|
2017-06-14 21:27:01 +00:00
|
|
|
if err != nil {
|
2017-08-21 23:31:50 +00:00
|
|
|
return "", errors.Wrap(err, stderr.String())
|
2017-06-14 21:27:01 +00:00
|
|
|
}
|
2017-08-21 23:31:50 +00:00
|
|
|
return out.String(), nil
|
2017-06-14 21:27:01 +00:00
|
|
|
}
|