From b20846353080a73cf7f5c8a203daffbba0714118 Mon Sep 17 00:00:00 2001 From: pbitty Date: Mon, 8 Jan 2018 12:42:16 -0500 Subject: [PATCH 01/42] Rough in basic node commands: add, start, remove, list, ssh --- Makefile | 2 +- cmd/minikube/cmd/delete.go | 2 +- cmd/minikube/cmd/node/node.go | 278 +++++++++++++++++++++++++++ cmd/minikube/cmd/root.go | 4 +- cmd/minikube/cmd/start.go | 102 +++------- cmd/minikube/cmd/start_node.go | 28 +++ cmd/minikube/profile/profile.go | 92 +++++++++ multi-node.md | 20 ++ pkg/minikube/cluster/cluster.go | 33 ++-- pkg/minikube/cluster/cluster_test.go | 9 +- pkg/minikube/cluster/types.go | 6 + 11 files changed, 477 insertions(+), 99 deletions(-) create mode 100644 cmd/minikube/cmd/node/node.go create mode 100644 cmd/minikube/cmd/start_node.go create mode 100644 cmd/minikube/profile/profile.go create mode 100644 multi-node.md diff --git a/Makefile b/Makefile index d3790270e7d8..6e2f9135da3c 100755 --- a/Makefile +++ b/Makefile @@ -138,7 +138,7 @@ ifeq ($(IN_DOCKER),1) $(MAKE) minikube_iso else docker run --rm --workdir /mnt --volume $(CURDIR):/mnt $(ISO_DOCKER_EXTRA_ARGS) \ - --user $(shell id -u):$(shell id -g) --env HOME=/tmp --env IN_DOCKER=1 \ + --env HOME=/tmp --env IN_DOCKER=1 \ $(ISO_BUILD_IMAGE) /usr/bin/make out/minikube.iso endif diff --git a/cmd/minikube/cmd/delete.go b/cmd/minikube/cmd/delete.go index 54ec6abe187b..f4d4cadaf82f 100644 --- a/cmd/minikube/cmd/delete.go +++ b/cmd/minikube/cmd/delete.go @@ -49,7 +49,7 @@ associated files.`, } defer api.Close() - if err = cluster.DeleteHost(api); err != nil { + if err = cluster.DeleteHost(pkg_config.GetMachineName(), api); err != nil { fmt.Println("Errors occurred deleting machine: ", err) os.Exit(1) } diff --git a/cmd/minikube/cmd/node/node.go b/cmd/minikube/cmd/node/node.go new file mode 100644 index 000000000000..7f0a75ac6932 --- /dev/null +++ b/cmd/minikube/cmd/node/node.go @@ -0,0 +1,278 @@ +package node + +import ( + "fmt" + "math/rand" + "os" + "text/template" + "time" + + "github.com/golang/glog" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "k8s.io/minikube/cmd/minikube/profile" + cmdutil "k8s.io/minikube/cmd/util" + "k8s.io/minikube/pkg/minikube/cluster" + cfg "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/machine" +) + +const internalErrorCode = -1 + +var ( + NodeCmd *cobra.Command +) + +func init() { + NodeCmd = &cobra.Command{ + Use: "node SUBCOMMAND [flags]", + Short: "Control a minikube cluster's nodes", + Long: `Control a cluster's nodes using subcommands like "minikube node add "`, + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + + addCmd := &cobra.Command{ + Use: "add [flags]", + Short: "Adds a node to the cluster", + Long: "Adds a node tot the cluster", + Run: addNode, + } + NodeCmd.AddCommand(addCmd) + + startCmd := &cobra.Command{ + Use: "start", + Short: "Starts all nodes", + Long: "Starts all nodes", + Run: startNode, + } + NodeCmd.AddCommand(startCmd) + + listCmd := &cobra.Command{ + Use: "list", + Short: "Lists all nodes", + Long: "Lists all nodes", + Run: listNodes, + } + NodeCmd.AddCommand(listCmd) + + removeCmd := &cobra.Command{ + Use: "remove ", + Short: "Removes a node from the cluster", + Long: "Removes a node from the cluster", + Run: removeNode, + } + NodeCmd.AddCommand(removeCmd) + + sshCmd := &cobra.Command{ + Use: "ssh", + Short: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'", + Long: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.", + Run: ssh, + } + NodeCmd.AddCommand(sshCmd) +} + +func addNode(cmd *cobra.Command, args []string) { + // TODO Make clusterName into `--cluster=` flag + clusterName := viper.GetString(cfg.MachineProfile) + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + s := rand.New(rand.NewSource(time.Now().UTC().UnixNano())) + + node := cluster.Node{ + Name: fmt.Sprintf("node-%d", s.Uint32()), + } + + cfg.Nodes = append(cfg.Nodes, node) + + if err := profile.SaveConfig(clusterName, cfg); err != nil { + glog.Errorln("Error saving profile cluster configuration: ", err) + os.Exit(1) + } + + fmt.Println("Added node: ", node.Name) +} + +func startNode(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + fmt.Println("Starting nodes...") + fmt.Printf("Config: %#v\n", cfg) + + api, err := machine.NewAPIClient() + if err != nil { + glog.Errorf("Error getting client: %s\n", err) + os.Exit(1) + } + defer api.Close() + + for _, node := range cfg.Nodes { + fmt.Printf("Starting node: %s\n", node.Name) + + machineCfg := cfg.MachineConfig + machineCfg.MachineName = getMachineName(clusterName, node) + + host, err := cluster.StartHost(api, machineCfg) + if err != nil { + glog.Errorln("Error starting node machine: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + ip, err := host.Driver.GetIP() + if err != nil { + glog.Errorln("Error getting machine IP: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + fmt.Printf("Node started. IP: %s\n", ip) + } + +} + +func removeNode(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + if len(args) == 0 || args[0] == "" { + glog.Error("node_name is required.") + os.Exit(1) + } + + nodeName := args[0] + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil && !os.IsNotExist(err) { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + api, err := machine.NewAPIClient() + if err != nil { + glog.Errorf("Error getting client: %s\n", err) + os.Exit(1) + } + defer api.Close() + + for i, node := range cfg.Nodes { + if node.Name == nodeName { + machineName := getMachineName(clusterName, node) + exists, err := api.Exists(machineName) + if err != nil { + glog.Errorln("Error removing node: ", err) + os.Exit(1) + } + + if exists { + if err := cluster.DeleteHost(machineName, api); err != nil { + glog.Errorln("Error removing node: ", err) + os.Exit(1) + } + } + + cfg.Nodes = append(cfg.Nodes[:i], cfg.Nodes[i+1:]...) + break + + } else if i == len(cfg.Nodes)-1 { + glog.Errorln("Node not found: ", nodeName) + os.Exit(1) + } + } + + if err := profile.SaveConfig(clusterName, cfg); err != nil { + glog.Errorln("Error saving profile cluster configuration: ", err) + os.Exit(1) + } +} + +func getMachineName(clusterName string, node cluster.Node) string { + return fmt.Sprintf("%s-node-%s", clusterName, node.Name) +} + +func listNodes(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil && !os.IsNotExist(err) { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + tmpl, err := template.New("nodeeList").Parse("{{range .}}{{ .Name }}\n{{end}}") + if err != nil { + glog.Errorln("Error creating nodeList template:", err) + os.Exit(internalErrorCode) + } + + err = tmpl.Execute(os.Stdout, cfg.Nodes) + if err != nil { + glog.Errorln("Error executing nodeList template:", err) + os.Exit(internalErrorCode) + } +} + +func ssh(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + if len(args) == 0 || args[0] == "" { + glog.Error("node_name is required.") + os.Exit(1) + } + + nodeName := args[0] + args = args[1:] + + node, err := getNode(clusterName, nodeName) + if err != nil { + glog.Error("Error loading node: ", err) + os.Exit(1) + } + + api, err := machine.NewAPIClient() + if err != nil { + fmt.Fprintf(os.Stderr, "Error getting client: %s\n", err) + os.Exit(1) + } + defer api.Close() + + machineName := getMachineName(clusterName, node) + host, err := cluster.CheckIfApiExistsAndLoadByName(machineName, api) + if err != nil { + fmt.Fprintf(os.Stderr, "Error getting host: %s\n", err) + os.Exit(1) + } + if host.Driver.DriverName() == "none" { + fmt.Println(`'none' driver does not support 'minikube ssh' command`) + os.Exit(0) + } + err = cluster.CreateSSHShellByName(machineName, api, args) + if err != nil { + glog.Errorln(errors.Wrap(err, "Error attempting to ssh/run-ssh-command")) + os.Exit(1) + } +} + +func getNode(clusterName, nodeName string) (cluster.Node, error) { + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil && !os.IsNotExist(err) { + return cluster.Node{}, errors.Errorf("Error loading profile config: %s", err) + } + + for _, node := range cfg.Nodes { + if node.Name == nodeName { + return node, nil + } + } + + return cluster.Node{}, errors.Errorf("Node not found in cluster. cluster: %s node: %s", clusterName, nodeName) +} diff --git a/cmd/minikube/cmd/root.go b/cmd/minikube/cmd/root.go index 0f8bd5efcb19..0102d33ca851 100755 --- a/cmd/minikube/cmd/root.go +++ b/cmd/minikube/cmd/root.go @@ -32,6 +32,7 @@ import ( "github.com/spf13/pflag" "github.com/spf13/viper" configCmd "k8s.io/minikube/cmd/minikube/cmd/config" + nodeCmd "k8s.io/minikube/cmd/minikube/cmd/node" "k8s.io/minikube/cmd/util" "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm" @@ -125,12 +126,13 @@ func setFlagsUsingViper() { } func init() { - RootCmd.PersistentFlags().StringP(config.MachineProfile, "p", constants.DefaultMachineName, `The name of the minikube VM being used. + RootCmd.PersistentFlags().StringP(config.MachineProfile, "p", constants.DefaultMachineName, `The name of the minikube VM being used. This can be modified to allow for multiple minikube instances to be run independently`) RootCmd.PersistentFlags().StringP(configCmd.Bootstrapper, "b", constants.DefaultClusterBootstrapper, "The name of the cluster bootstrapper that will set up the kubernetes cluster.") RootCmd.AddCommand(configCmd.ConfigCmd) RootCmd.AddCommand(configCmd.AddonsCmd) RootCmd.AddCommand(configCmd.ProfileCmd) + RootCmd.AddCommand(nodeCmd.NodeCmd) pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) viper.BindPFlags(RootCmd.PersistentFlags()) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 7739db35142d..04f0ea4ec3e0 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -17,7 +17,6 @@ limitations under the License. package cmd import ( - "encoding/json" "fmt" "io/ioutil" "os" @@ -32,6 +31,7 @@ import ( "github.com/golang/glog" "github.com/spf13/cobra" "github.com/spf13/viper" + "k8s.io/minikube/cmd/minikube/profile" cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config" cmdutil "k8s.io/minikube/cmd/util" "k8s.io/minikube/pkg/minikube/bootstrapper" @@ -97,6 +97,8 @@ func runStart(cmd *cobra.Command, args []string) { if shouldCacheImages { go machine.CacheImagesForBootstrapper(k8sVersion, clusterBootstrapper) } + + // NOTE Instantiate docker-machine API api, err := machine.NewAPIClient() if err != nil { fmt.Fprintf(os.Stderr, "Error getting client: %s\n", err) @@ -104,11 +106,6 @@ func runStart(cmd *cobra.Command, args []string) { } defer api.Close() - exists, err := api.Exists(cfg.GetMachineName()) - if err != nil { - glog.Exitf("checking if machine exists: %s", err) - } - diskSize := viper.GetString(humanReadableDiskSize) diskSizeMB := pkgutil.CalculateDiskSizeInMB(diskSize) @@ -123,7 +120,9 @@ func runStart(cmd *cobra.Command, args []string) { validateK8sVersion(k8sVersion) } + // NOTE Create machine config config := cluster.MachineConfig{ + MachineName: cfg.GetMachineName(), MinikubeISO: viper.GetString(isoURL), Memory: viper.GetInt(memory), CPUs: viper.GetInt(cpus), @@ -141,6 +140,13 @@ func runStart(cmd *cobra.Command, args []string) { DisableDriverMounts: viper.GetBool(disableDriverMounts), } + // NOTE Check if machine exists + exists, err := api.Exists(config.MachineName) + if err != nil { + glog.Exitf("checking if machine exists: %s", err) + } + + // NOTE Start machine fmt.Printf("Starting local Kubernetes %s cluster...\n", viper.GetString(kubernetesVersion)) fmt.Println("Starting VM...") var host *host.Host @@ -157,6 +163,7 @@ func runStart(cmd *cobra.Command, args []string) { cmdutil.MaybeReportErrorAndExit(err) } + // NOTE Get machine IP fmt.Println("Getting VM IP address...") ip, err := host.Driver.GetIP() if err != nil { @@ -166,8 +173,10 @@ func runStart(cmd *cobra.Command, args []string) { selectedKubernetesVersion := viper.GetString(kubernetesVersion) + // NOTE Load cluster cfg // Load profile cluster config from file - cc, err := loadConfigFromFile(viper.GetString(cfg.MachineProfile)) + profileName := viper.GetString(cfg.MachineProfile) + cc, err := profile.LoadConfigFromFile(profileName) if err != nil && !os.IsNotExist(err) { glog.Errorln("Error loading profile config: ", err) } @@ -203,6 +212,7 @@ func runStart(cmd *cobra.Command, args []string) { ShouldLoadCachedImages: shouldCacheImages, } + // NOTE Get bootstrapper k8sBootstrapper, err := GetClusterBootstrapper(api, clusterBootstrapper) if err != nil { glog.Exitf("Error getting cluster bootstrapper: %s", err) @@ -214,10 +224,11 @@ func runStart(cmd *cobra.Command, args []string) { KubernetesConfig: kubernetesConfig, } - if err := saveConfig(clusterConfig); err != nil { + if err := profile.SaveConfig(profileName, clusterConfig); err != nil { glog.Errorln("Error saving profile cluster configuration: ", err) } + // NOTE Configure machine fmt.Println("Moving files into cluster...") if err := k8sBootstrapper.UpdateCluster(kubernetesConfig); err != nil { glog.Errorln("Error updating cluster: ", err) @@ -260,6 +271,7 @@ func runStart(cmd *cobra.Command, args []string) { fmt.Println("Starting cluster components...") + // NOTE Start base components if !exists { if err := k8sBootstrapper.StartCluster(kubernetesConfig); err != nil { glog.Errorln("Error starting cluster: ", err) @@ -319,10 +331,10 @@ You will need to move the files to the appropriate location and then set the cor sudo mv /root/.kube $HOME/.kube # this will write over any previous configuration sudo chown -R $USER $HOME/.kube sudo chgrp -R $USER $HOME/.kube - + sudo mv /root/.minikube $HOME/.minikube # this will write over any previous configuration sudo chown -R $USER $HOME/.minikube - sudo chgrp -R $USER $HOME/.minikube + sudo chgrp -R $USER $HOME/.minikube This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true`) } @@ -385,73 +397,3 @@ func init() { viper.BindPFlags(startCmd.Flags()) RootCmd.AddCommand(startCmd) } - -// saveConfig saves profile cluster configuration in -// $MINIKUBE_HOME/profiles//config.json -func saveConfig(clusterConfig cluster.Config) error { - data, err := json.MarshalIndent(clusterConfig, "", " ") - if err != nil { - return err - } - - profileConfigFile := constants.GetProfileFile(viper.GetString(cfg.MachineProfile)) - - if err := os.MkdirAll(filepath.Dir(profileConfigFile), 0700); err != nil { - return err - } - - if err := saveConfigToFile(data, profileConfigFile); err != nil { - return err - } - - return nil -} - -func saveConfigToFile(data []byte, file string) error { - if _, err := os.Stat(file); os.IsNotExist(err) { - return ioutil.WriteFile(file, data, 0600) - } - - tmpfi, err := ioutil.TempFile(filepath.Dir(file), "config.json.tmp") - if err != nil { - return err - } - defer os.Remove(tmpfi.Name()) - - if err = ioutil.WriteFile(tmpfi.Name(), data, 0600); err != nil { - return err - } - - if err = tmpfi.Close(); err != nil { - return err - } - - if err = os.Remove(file); err != nil { - return err - } - - if err = os.Rename(tmpfi.Name(), file); err != nil { - return err - } - return nil -} - -func loadConfigFromFile(profile string) (cluster.Config, error) { - var cc cluster.Config - - profileConfigFile := constants.GetProfileFile(profile) - - if _, err := os.Stat(profileConfigFile); os.IsNotExist(err) { - return cc, err - } - - data, err := ioutil.ReadFile(profileConfigFile) - if err != nil { - return cc, err - } - - if err := json.Unmarshal(data, &cc); err != nil { - return cc, err - } - return cc, nil -} diff --git a/cmd/minikube/cmd/start_node.go b/cmd/minikube/cmd/start_node.go new file mode 100644 index 000000000000..2a1c03473bcb --- /dev/null +++ b/cmd/minikube/cmd/start_node.go @@ -0,0 +1,28 @@ +package cmd + +import ( + "fmt" + + "github.com/docker/machine/libmachine" + "github.com/golang/glog" + "k8s.io/minikube/pkg/minikube/cluster" +) + +func startNodes(api libmachine.API, masterIP string, baseConfig cluster.Config, count int) error { + for i := 0; i < count; i++ { + name := fmt.Sprintf("%s-%d", baseConfig.MachineConfig.MachineName, i+1) + newConfig := newConfig(baseConfig.MachineConfig, name) + glog.Infoln("Creating machine: %s", name) + _, err := cluster.StartHost(api, newConfig) + if err != nil { + return err + } + } + + return nil +} + +func newConfig(baseConfig cluster.MachineConfig, machineName string) cluster.MachineConfig { + baseConfig.MachineName = machineName + return baseConfig +} diff --git a/cmd/minikube/profile/profile.go b/cmd/minikube/profile/profile.go new file mode 100644 index 000000000000..9543b7dd3194 --- /dev/null +++ b/cmd/minikube/profile/profile.go @@ -0,0 +1,92 @@ +package profile + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "github.com/spf13/viper" + "k8s.io/minikube/pkg/minikube/cluster" + cfg "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/constants" + pkgutil "k8s.io/minikube/pkg/util" +) + +// SaveConfig saves profile cluster configuration in +// $MINIKUBE_HOME/profiles//config.json +func SaveConfig(profile string, clusterConfig cluster.Config) error { + data, err := json.MarshalIndent(clusterConfig, "", " ") + if err != nil { + return err + } + + profileConfigFile := constants.GetProfileFile(viper.GetString(cfg.MachineProfile)) + + if err := os.MkdirAll(filepath.Dir(profileConfigFile), 0700); err != nil { + return err + } + + if err := saveConfigToFile(data, profileConfigFile); err != nil { + return err + } + + return nil +} + +func saveConfigToFile(data []byte, file string) error { + if _, err := os.Stat(file); os.IsNotExist(err) { + return ioutil.WriteFile(file, data, 0600) + } + + tmpfi, err := ioutil.TempFile(filepath.Dir(file), "config.json.tmp") + if err != nil { + return err + } + defer os.Remove(tmpfi.Name()) + + if err = ioutil.WriteFile(tmpfi.Name(), data, 0600); err != nil { + return err + } + + if err = tmpfi.Close(); err != nil { + return err + } + + if err = os.Remove(file); err != nil { + return err + } + + if err = os.Rename(tmpfi.Name(), file); err != nil { + return err + } + return nil +} + +func LoadConfigFromFile(profile string) (cluster.Config, error) { + var cc cluster.Config + + if profile == "" { + return cc, fmt.Errorf("Profile name cannot be empty.") + } + + profileConfigFile := constants.GetProfileFile(profile) + + if _, err := os.Stat(profileConfigFile); os.IsNotExist(err) { + return cc, err + } + + data, err := ioutil.ReadFile(profileConfigFile) + if err != nil { + return cc, err + } + + if err := json.Unmarshal(data, &cc); err != nil { + return cc, err + } + + cc.MachineConfig.Downloader = pkgutil.DefaultDownloader{} + + return cc, nil +} diff --git a/multi-node.md b/multi-node.md new file mode 100644 index 000000000000..c87ca7678ab2 --- /dev/null +++ b/multi-node.md @@ -0,0 +1,20 @@ + +TODO: + +* Parameterize machine name +* Start worker nodes +* Configure worker nodes + +# Usage + +## Add node + +``` +minikube node add [--cluster=default] --name=[] +``` + +``` +minikube node start +``` + +``` diff --git a/pkg/minikube/cluster/cluster.go b/pkg/minikube/cluster/cluster.go index 7acccab7478e..5f5db3217c38 100644 --- a/pkg/minikube/cluster/cluster.go +++ b/pkg/minikube/cluster/cluster.go @@ -62,9 +62,10 @@ func init() { // StartHost starts a host VM. func StartHost(api libmachine.API, config MachineConfig) (*host.Host, error) { - exists, err := api.Exists(cfg.GetMachineName()) + + exists, err := api.Exists(config.MachineName) if err != nil { - return nil, errors.Wrapf(err, "Error checking if host exists: %s", cfg.GetMachineName()) + return nil, errors.Wrapf(err, "Error checking if host exists: %s", config.MachineName) } if !exists { glog.Infoln("Machine does not exist... provisioning new machine") @@ -74,7 +75,7 @@ func StartHost(api libmachine.API, config MachineConfig) (*host.Host, error) { glog.Infoln("Skipping create...Using existing machine configuration") } - h, err := api.Load(cfg.GetMachineName()) + h, err := api.Load(config.MachineName) if err != nil { return nil, errors.Wrap(err, "Error loading existing host. Please try running [minikube delete], then run [minikube start] again.") } @@ -119,8 +120,8 @@ func StopHost(api libmachine.API) error { } // DeleteHost deletes the host VM. -func DeleteHost(api libmachine.API) error { - host, err := api.Load(cfg.GetMachineName()) +func DeleteHost(name string, api libmachine.API) error { + host, err := api.Load(name) if err != nil { return errors.Wrapf(err, "Error deleting host: %s", cfg.GetMachineName()) } @@ -181,7 +182,7 @@ func engineOptions(config MachineConfig) *engine.Options { } func createVirtualboxHost(config MachineConfig) drivers.Driver { - d := virtualbox.NewDriver(cfg.GetMachineName(), constants.GetMinipath()) + d := virtualbox.NewDriver(config.MachineName, constants.GetMinipath()) d.Boot2DockerURL = config.Downloader.GetISOFileURI(config.MinikubeISO) d.Memory = config.Memory d.CPU = config.CPUs @@ -355,23 +356,31 @@ func getIPForInterface(name string) (net.IP, error) { } func CheckIfApiExistsAndLoad(api libmachine.API) (*host.Host, error) { - exists, err := api.Exists(cfg.GetMachineName()) + return CheckIfApiExistsAndLoadByName(cfg.GetMachineName(), api) +} + +func CheckIfApiExistsAndLoadByName(name string, api libmachine.API) (*host.Host, error) { + exists, err := api.Exists(name) if err != nil { - return nil, errors.Wrapf(err, "Error checking that api exists for: %s", cfg.GetMachineName()) + return nil, errors.Wrapf(err, "Error checking that api exists for: %s", name) } if !exists { - return nil, errors.Errorf("Machine does not exist for api.Exists(%s)", cfg.GetMachineName()) + return nil, errors.Errorf("Machine does not exist for api.Exists(%s)", name) } - host, err := api.Load(cfg.GetMachineName()) + host, err := api.Load(name) if err != nil { - return nil, errors.Wrapf(err, "Error loading api for: %s", cfg.GetMachineName()) + return nil, errors.Wrapf(err, "Error loading api for: %s", name) } return host, nil } func CreateSSHShell(api libmachine.API, args []string) error { - host, err := CheckIfApiExistsAndLoad(api) + return CreateSSHShellByName(cfg.GetMachineName(), api, args) +} + +func CreateSSHShellByName(name string, api libmachine.API, args []string) error { + host, err := CheckIfApiExistsAndLoadByName(name, api) if err != nil { return errors.Wrap(err, "Error checking if api exist and loading it") } diff --git a/pkg/minikube/cluster/cluster_test.go b/pkg/minikube/cluster/cluster_test.go index f8729100d78c..dc1382540c49 100644 --- a/pkg/minikube/cluster/cluster_test.go +++ b/pkg/minikube/cluster/cluster_test.go @@ -36,6 +36,7 @@ func (d MockDownloader) GetISOFileURI(isoURL string) string { return "" func (d MockDownloader) CacheMinikubeISOFromURL(isoURL string) error { return nil } var defaultMachineConfig = MachineConfig{ + MachineName: "test-cluster", VMDriver: constants.DefaultVMDriver, MinikubeISO: constants.DefaultIsoUrl, Downloader: MockDownloader{}, @@ -227,7 +228,7 @@ func TestDeleteHost(t *testing.T) { api := tests.NewMockAPI() createHost(api, defaultMachineConfig) - if err := DeleteHost(api); err != nil { + if err := DeleteHost(defaultMachineConfig.MachineName, api); err != nil { t.Fatalf("Unexpected error deleting host: %s", err) } } @@ -240,7 +241,7 @@ func TestDeleteHostErrorDeletingVM(t *testing.T) { h.Driver = d - if err := DeleteHost(api); err == nil { + if err := DeleteHost(defaultMachineConfig.MachineName, api); err == nil { t.Fatal("Expected error deleting host.") } } @@ -250,7 +251,7 @@ func TestDeleteHostErrorDeletingFiles(t *testing.T) { api.RemoveError = true createHost(api, defaultMachineConfig) - if err := DeleteHost(api); err == nil { + if err := DeleteHost(defaultMachineConfig.MachineName, api); err == nil { t.Fatal("Expected error deleting host.") } } @@ -264,7 +265,7 @@ func TestDeleteHostMultipleErrors(t *testing.T) { h.Driver = d - err := DeleteHost(api) + err := DeleteHost(defaultMachineConfig.MachineName, api) if err == nil { t.Fatal("Expected error deleting host, didn't get one.") diff --git a/pkg/minikube/cluster/types.go b/pkg/minikube/cluster/types.go index c524be30d3d3..43f30bf89731 100644 --- a/pkg/minikube/cluster/types.go +++ b/pkg/minikube/cluster/types.go @@ -23,6 +23,7 @@ import ( // MachineConfig contains the parameters used to start a cluster. type MachineConfig struct { + MachineName string MinikubeISO string Memory int CPUs int @@ -44,4 +45,9 @@ type MachineConfig struct { type Config struct { MachineConfig MachineConfig KubernetesConfig bootstrapper.KubernetesConfig + Nodes []Node +} + +type Node struct { + Name string } From bb9ded248a2fa1788f287f8cc10416266bbb6e5f Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 11 Jan 2018 15:44:22 -0500 Subject: [PATCH 02/42] Add gostregen --- vendor/github.com/elgs/gostrgen/.gitignore | 24 ++++++++ vendor/github.com/elgs/gostrgen/README.md | 33 +++++++++++ vendor/github.com/elgs/gostrgen/gostrgen.go | 61 +++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 vendor/github.com/elgs/gostrgen/.gitignore create mode 100644 vendor/github.com/elgs/gostrgen/README.md create mode 100644 vendor/github.com/elgs/gostrgen/gostrgen.go diff --git a/vendor/github.com/elgs/gostrgen/.gitignore b/vendor/github.com/elgs/gostrgen/.gitignore new file mode 100644 index 000000000000..daf913b1b347 --- /dev/null +++ b/vendor/github.com/elgs/gostrgen/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/elgs/gostrgen/README.md b/vendor/github.com/elgs/gostrgen/README.md new file mode 100644 index 000000000000..82458955f291 --- /dev/null +++ b/vendor/github.com/elgs/gostrgen/README.md @@ -0,0 +1,33 @@ +# gostrgen +Random string generator in Golang. + +#Installation +`go get -u github.com/elgs/gostrgen` + +# Sample code +```go +package main + +import ( + "fmt" + "github.com/elgs/gostrgen" +) + +func main() { + + // possible character sets are: + // Lower, Upper, Digit, Punct, LowerUpper, LowerDigit, UpperDigit, LowerUpperDigit, All and None. + // Any of the above can be combine by "|", e.g. LowerUpper is the same as Lower | Upper + + charsToGenerate := 20 + charSet := gostrgen.Lower | gostrgen.Digit + includes := "[]{}<>" // optionally include some additional letters + excludes := "Ol" //exclude big 'O' and small 'l' to avoid confusion with zero and one. + + str, err := gostrgen.RandGen(charsToGenerate, charSet, includes, excludes) + if err != nil { + fmt.Println(err) + } + fmt.Println(str) // zxh9[pvoxbaup32b7s0d +} +``` \ No newline at end of file diff --git a/vendor/github.com/elgs/gostrgen/gostrgen.go b/vendor/github.com/elgs/gostrgen/gostrgen.go new file mode 100644 index 000000000000..8463c970a1bf --- /dev/null +++ b/vendor/github.com/elgs/gostrgen/gostrgen.go @@ -0,0 +1,61 @@ +// gostrgen +package gostrgen + +import ( + "errors" + "math/rand" + "strings" + "time" +) + +const None = 0 +const Lower = 1 << 0 +const Upper = 1 << 1 +const Digit = 1 << 2 +const Punct = 1 << 3 + +const LowerUpper = Lower | Upper +const LowerDigit = Lower | Digit +const UpperDigit = Upper | Digit +const LowerUpperDigit = LowerUpper | Digit +const All = LowerUpperDigit | Punct + +const lower = "abcdefghijklmnopqrstuvwxyz" +const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +const digit = "0123456789" +const punct = "~!@#$%^&*()_+-=" + +func init() { + rand.Seed(time.Now().UTC().UnixNano()) +} + +func RandGen(size int, set int, include string, exclude string) (string, error) { + all := include + if set&Lower > 0 { + all += lower + } + if set&Upper > 0 { + all += upper + } + if set&Digit > 0 { + all += digit + } + if set&Punct > 0 { + all += punct + } + + lenAll := len(all) + if len(exclude) >= lenAll { + return "", errors.New("Too much to exclude.") + } + buf := make([]byte, size) + for i := 0; i < size; i++ { + b := all[rand.Intn(lenAll)] + if strings.Contains(exclude, string(b)) { + i-- + continue + } + buf[i] = b + } + return string(buf), nil +} From ae5c71fe9bbda17952e15f0916bf2878e98e2b2d Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 11 Jan 2018 15:44:37 -0500 Subject: [PATCH 03/42] WIP: Add node join logic --- Godeps/Godeps.json | 6401 +---------------- cmd/minikube/cmd/node/node.go | 27 +- cmd/minikube/cmd/start.go | 20 + pkg/minikube/bootstrapper/bootstrapper.go | 2 + pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 77 +- .../bootstrapper/kubeadm/templates.go | 7 +- 6 files changed, 131 insertions(+), 6403 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 6f4c10cd9e38..0359f11e8f65 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1,6407 +1,14 @@ { "ImportPath": "k8s.io/minikube", "GoVersion": "go1.8", - "GodepVersion": "v79", + "GodepVersion": "v74", "Packages": [ - "./..." + "github.com/elgs/gostrgen" ], "Deps": [ { - "ImportPath": "bitbucket.org/ww/goautoneg", - "Comment": "null-5", - "Rev": "75cd24fc2f2c2a2088577d12123ddee5f54e0675" - }, - { - "ImportPath": "cloud.google.com/go/compute/metadata", - "Comment": "v0.1.0-115-g3b1ae45", - "Rev": "3b1ae45394a234c385be014e9a488f2bb6eef821" - }, - { - "ImportPath": "cloud.google.com/go/internal", - "Comment": "v0.1.0-115-g3b1ae45", - "Rev": "3b1ae45394a234c385be014e9a488f2bb6eef821" - }, - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/arm/compute", - "Comment": "v10.0.4-beta-1-g786cc841", - "Rev": "786cc84138518bf7fd6d60e92fad1ac9d1a117ad" - }, - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/arm/containerregistry", - "Comment": "v10.0.4-beta-1-g786cc841", - "Rev": "786cc84138518bf7fd6d60e92fad1ac9d1a117ad" - }, - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/arm/disk", - "Comment": "v10.0.4-beta-1-g786cc841", - "Rev": "786cc84138518bf7fd6d60e92fad1ac9d1a117ad" - }, - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/arm/network", - "Comment": "v10.0.4-beta-1-g786cc841", - "Rev": "786cc84138518bf7fd6d60e92fad1ac9d1a117ad" - }, - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/arm/storage", - "Comment": "v10.0.4-beta-1-g786cc841", - "Rev": "786cc84138518bf7fd6d60e92fad1ac9d1a117ad" - }, - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/storage", - "Comment": "v10.0.4-beta-1-g786cc841", - "Rev": "786cc84138518bf7fd6d60e92fad1ac9d1a117ad" - }, - { - "ImportPath": "github.com/Azure/go-ansiterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" - }, - { - "ImportPath": "github.com/Azure/go-ansiterm/winterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" - }, - { - "ImportPath": "github.com/Azure/go-autorest/autorest", - "Comment": "v8.0.0", - "Rev": "58f6f26e200fa5dfb40c9cd1c83f3e2c860d779d" - }, - { - "ImportPath": "github.com/Azure/go-autorest/autorest/adal", - "Comment": "v8.0.0", - "Rev": "58f6f26e200fa5dfb40c9cd1c83f3e2c860d779d" - }, - { - "ImportPath": "github.com/Azure/go-autorest/autorest/azure", - "Comment": "v8.0.0", - "Rev": "58f6f26e200fa5dfb40c9cd1c83f3e2c860d779d" - }, - { - "ImportPath": "github.com/Azure/go-autorest/autorest/date", - "Comment": "v8.0.0", - "Rev": "58f6f26e200fa5dfb40c9cd1c83f3e2c860d779d" - }, - { - "ImportPath": "github.com/Azure/go-autorest/autorest/to", - "Comment": "v8.0.0", - "Rev": "58f6f26e200fa5dfb40c9cd1c83f3e2c860d779d" - }, - { - "ImportPath": "github.com/Azure/go-autorest/autorest/validation", - "Comment": "v8.0.0", - "Rev": "58f6f26e200fa5dfb40c9cd1c83f3e2c860d779d" - }, - { - "ImportPath": "github.com/Microsoft/go-winio", - "Comment": "v0.4.5", - "Rev": "78439966b38d69bf38227fbf57ac8a6fee70f69a" - }, - { - "ImportPath": "github.com/Microsoft/hcsshim", - "Comment": "V0.6.3", - "Rev": "6ea7fe54f719d95721e7d9b26ac0add224c9b923" - }, - { - "ImportPath": "github.com/NYTimes/gziphandler", - "Rev": "56545f4a5d46df9a6648819d1664c3a03a13ffdb" - }, - { - "ImportPath": "github.com/Nvveen/Gotty", - "Rev": "cd527374f1e5bff4938207604a14f2e38a9cf512" - }, - { - "ImportPath": "github.com/PuerkitoBio/purell", - "Comment": "v1.0.0", - "Rev": "8a290539e2e8629dbc4e6bad948158f790ec31f4" - }, - { - "ImportPath": "github.com/PuerkitoBio/urlesc", - "Rev": "5bd2802263f21d8788851d5305584c82a5c75d7e" - }, - { - "ImportPath": "github.com/abbot/go-http-auth", - "Rev": "c0ef4539dfab4d21c8ef20ba2924f9fc6f186d35" - }, - { - "ImportPath": "github.com/appc/spec/schema", - "Comment": "v0.8.9-17-gfc380db", - "Rev": "fc380db5fc13c6dd71a5b0bf2af0d182865d1b1d" - }, - { - "ImportPath": "github.com/appc/spec/schema/common", - "Comment": "v0.8.9-17-gfc380db", - "Rev": "fc380db5fc13c6dd71a5b0bf2af0d182865d1b1d" - }, - { - "ImportPath": "github.com/appc/spec/schema/types", - "Comment": "v0.8.9-17-gfc380db", - "Rev": "fc380db5fc13c6dd71a5b0bf2af0d182865d1b1d" - }, - { - "ImportPath": "github.com/appc/spec/schema/types/resource", - "Comment": "v0.8.9-17-gfc380db", - "Rev": "fc380db5fc13c6dd71a5b0bf2af0d182865d1b1d" - }, - { - "ImportPath": "github.com/armon/circbuf", - "Rev": "bbbad097214e2918d8543d5201d12bfd7bca254d" - }, - { - "ImportPath": "github.com/asaskevich/govalidator", - "Comment": "v4-12-g593d645", - "Rev": "593d64559f7600f29581a3ee42177f5dbded27a9" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/awserr", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/awsutil", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/client", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/client/metadata", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/corehandlers", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/stscreds", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/defaults", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/ec2metadata", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/endpoints", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/request", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/session", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/signer/v4", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/ec2query", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/jsonrpc", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/rest", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/waiter", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/autoscaling", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/ec2", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/ecr", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/elb", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/kms", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/sts", - "Comment": "v1.6.10", - "Rev": "63ce630574a5ec05ecd8e8de5cea16332a5a684d" - }, - { - "ImportPath": "github.com/beorn7/perks/quantile", - "Rev": "3ac7bf7a47d159a033b107610db8a1b6575507a4" - }, - { - "ImportPath": "github.com/blang/semver", - "Comment": "v3.5.0", - "Rev": "b38d23b8782a487059e8fc8773e9a5b228a77cb6" - }, - { - "ImportPath": "github.com/boltdb/bolt", - "Comment": "v1.3.0", - "Rev": "583e8937c61f1af6513608ccc75c97b6abdf4ff9" - }, - { - "ImportPath": "github.com/c4milo/gotoolkit", - "Rev": "bcc06269efa974c4f098619d9aae436846e83d84" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/auth", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/certdb", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/config", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/crypto/pkcs7", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/csr", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/errors", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/helpers", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/helpers/derhelpers", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/info", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/log", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/ocsp/config", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/signer", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/cloudflare/cfssl/signer/local", - "Comment": "1.2.0", - "Rev": "db0d0650b6496bfe8061ec56a92edd32d8e75c30" - }, - { - "ImportPath": "github.com/clusterhq/flocker-go", - "Rev": "2b8b7259d3139c96c4a6871031355808ab3fd3b3" - }, - { - "ImportPath": "github.com/cockroachdb/cmux", - "Rev": "30d10be492927e2dcae0089c374c455d42414fcb" - }, - { - "ImportPath": "github.com/codedellemc/goscaleio", - "Rev": "20e2ce2cf8852dc78bd42b76698dcd8dcd77b7b1" - }, - { - "ImportPath": "github.com/codedellemc/goscaleio/types/v1", - "Rev": "20e2ce2cf8852dc78bd42b76698dcd8dcd77b7b1" - }, - { - "ImportPath": "github.com/containernetworking/cni/libcni", - "Comment": "v0.5.2", - "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" - }, - { - "ImportPath": "github.com/containernetworking/cni/pkg/invoke", - "Comment": "v0.5.2", - "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" - }, - { - "ImportPath": "github.com/containernetworking/cni/pkg/types", - "Comment": "v0.5.2", - "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" - }, - { - "ImportPath": "github.com/containernetworking/cni/pkg/types/020", - "Comment": "v0.5.2", - "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" - }, - { - "ImportPath": "github.com/containernetworking/cni/pkg/types/current", - "Comment": "v0.5.2", - "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" - }, - { - "ImportPath": "github.com/containernetworking/cni/pkg/version", - "Comment": "v0.5.2", - "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" - }, - { - "ImportPath": "github.com/containers/image/copy", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/docker", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/docker/archive", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/docker/policyconfiguration", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/docker/reference", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/docker/tarfile", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/image", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/manifest", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/pkg/compression", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/pkg/docker/config", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/pkg/strslice", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/pkg/tlsclientconfig", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/signature", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/transports", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/types", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/image/version", - "Rev": "ba72d1c8f590a19d182a25fd8671156766ab3c60" - }, - { - "ImportPath": "github.com/containers/storage/pkg/homedir", - "Rev": "87cb51ae7a688abb71dbe6e4ac5c962d9121b862" - }, - { - "ImportPath": "github.com/coreos/etcd/alarm", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/auth", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/auth/authpb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/client", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/clientv3", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/compactor", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/discovery", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/embed", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/error", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/api", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/api/v2http", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/api/v2http/httptypes", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/api/v3rpc", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/auth", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/etcdserverpb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/membership", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/etcdserver/stats", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/lease", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/lease/leasehttp", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/lease/leasepb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/mvcc", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/mvcc/backend", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/mvcc/mvccpb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/adt", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/contention", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/cors", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/cpuutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/crc", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/fileutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/httputil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/idutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/ioutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/logutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/monotime", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/netutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/pathutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/pbutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/runtime", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/schedule", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/tlsutil", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/transport", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/types", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/pkg/wait", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/raft", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/raft/raftpb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/rafthttp", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/snap", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/snap/snappb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/store", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/version", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/wal", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/etcd/wal/walpb", - "Comment": "v3.1.10", - "Rev": "0520cb9304cb2385f7e72b8bc02d6e4d3257158a" - }, - { - "ImportPath": "github.com/coreos/go-oidc/http", - "Rev": "a4973d9a4225417aecf5d450a9522f00c1f7130f" - }, - { - "ImportPath": "github.com/coreos/go-oidc/jose", - "Rev": "a4973d9a4225417aecf5d450a9522f00c1f7130f" - }, - { - "ImportPath": "github.com/coreos/go-oidc/key", - "Rev": "a4973d9a4225417aecf5d450a9522f00c1f7130f" - }, - { - "ImportPath": "github.com/coreos/go-oidc/oauth2", - "Rev": "a4973d9a4225417aecf5d450a9522f00c1f7130f" - }, - { - "ImportPath": "github.com/coreos/go-oidc/oidc", - "Rev": "a4973d9a4225417aecf5d450a9522f00c1f7130f" - }, - { - "ImportPath": "github.com/coreos/go-semver/semver", - "Rev": "568e959cd89871e61434c1143528d9162da89ef2" - }, - { - "ImportPath": "github.com/coreos/go-systemd/daemon", - "Comment": "v14", - "Rev": "48702e0da86bd25e76cfef347e2adeb434a0d0a6" - }, - { - "ImportPath": "github.com/coreos/go-systemd/dbus", - "Comment": "v14", - "Rev": "48702e0da86bd25e76cfef347e2adeb434a0d0a6" - }, - { - "ImportPath": "github.com/coreos/go-systemd/journal", - "Comment": "v14", - "Rev": "48702e0da86bd25e76cfef347e2adeb434a0d0a6" - }, - { - "ImportPath": "github.com/coreos/go-systemd/unit", - "Comment": "v14", - "Rev": "48702e0da86bd25e76cfef347e2adeb434a0d0a6" - }, - { - "ImportPath": "github.com/coreos/go-systemd/util", - "Comment": "v14", - "Rev": "48702e0da86bd25e76cfef347e2adeb434a0d0a6" - }, - { - "ImportPath": "github.com/coreos/pkg/capnslog", - "Comment": "v2-8-gfa29b1d", - "Rev": "fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8" - }, - { - "ImportPath": "github.com/coreos/pkg/dlopen", - "Comment": "v2-8-gfa29b1d", - "Rev": "fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8" - }, - { - "ImportPath": "github.com/coreos/pkg/health", - "Comment": "v2-8-gfa29b1d", - "Rev": "fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8" - }, - { - "ImportPath": "github.com/coreos/pkg/httputil", - "Comment": "v2-8-gfa29b1d", - "Rev": "fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8" - }, - { - "ImportPath": "github.com/coreos/pkg/timeutil", - "Comment": "v2-8-gfa29b1d", - "Rev": "fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8" - }, - { - "ImportPath": "github.com/coreos/rkt/api/v1alpha", - "Comment": "v1.25.0", - "Rev": "ec37f3cb649bfb72408906e7cbf330e4aeda1075" - }, - { - "ImportPath": "github.com/cpuguy83/go-md2man/md2man", - "Comment": "v1.0.4", - "Rev": "71acacd42f85e5e82f70a55327789582a5200a90" - }, - { - "ImportPath": "github.com/d2g/dhcp4", - "Rev": "a1d1b6c41b1ce8a71a5121a9cee31809c4707d9c" - }, - { - "ImportPath": "github.com/d2g/dhcp4client", - "Rev": "6e570ed0a266b730a860ba1068090f683b2c213a" - }, - { - "ImportPath": "github.com/davecgh/go-spew/spew", - "Comment": "v1.1.0-1-g782f496", - "Rev": "782f4967f2dc4564575ca782fe2d04090b5faca8" - }, - { - "ImportPath": "github.com/dgrijalva/jwt-go", - "Comment": "v3.0.0-4-g01aeca5", - "Rev": "01aeca54ebda6e0fbfafd0a524d234159c05ec20" - }, - { - "ImportPath": "github.com/docker/distribution", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/context", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/digestset", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/reference", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/api/errcode", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/api/v2", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/client", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/client/auth/challenge", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/client/transport", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/storage/cache", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/registry/storage/cache/memory", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/distribution/uuid", - "Comment": "v2.6.0-rc.1-209-gedc3ab29", - "Rev": "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c" - }, - { - "ImportPath": "github.com/docker/docker-credential-helpers/client", - "Comment": "v0.6.0", - "Rev": "d68f9aeca33f5fd3f08eeae5e9d175edf4e731d1" - }, - { - "ImportPath": "github.com/docker/docker-credential-helpers/credentials", - "Comment": "v0.6.0", - "Rev": "d68f9aeca33f5fd3f08eeae5e9d175edf4e731d1" - }, - { - "ImportPath": "github.com/docker/docker/api", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/blkiodev", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/container", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/events", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/filters", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/image", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/mount", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/network", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/registry", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/strslice", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/swarm", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/swarm/runtime", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/time", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/versions", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/api/types/volume", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/client", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/homedir", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/idtools", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/ioutils", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/jsonlog", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/jsonmessage", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/longpath", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/mount", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/stdcopy", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/symlink", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/system", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/term", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/tlsconfig", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/engine-api/client", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/client/transport", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/client/transport/cancellable", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/blkiodev", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/container", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/filters", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/network", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/reference", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/registry", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/strslice", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/time", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/engine-api/types/versions", - "Comment": "v0.3.1-78-gdea108d", - "Rev": "dea108d3aa0c67d7162a3fd8aa65f38a430019fd" - }, - { - "ImportPath": "github.com/docker/go-connections/nat", - "Comment": "v0.3.0", - "Rev": "3ede32e2033de7505e6500d6c868c2b9ed9f169d" - }, - { - "ImportPath": "github.com/docker/go-connections/sockets", - "Comment": "v0.3.0", - "Rev": "3ede32e2033de7505e6500d6c868c2b9ed9f169d" - }, - { - "ImportPath": "github.com/docker/go-connections/tlsconfig", - "Comment": "v0.3.0", - "Rev": "3ede32e2033de7505e6500d6c868c2b9ed9f169d" - }, - { - "ImportPath": "github.com/docker/go-units", - "Comment": "v0.3.1-11-g9e638d3", - "Rev": "9e638d38cf6977a37a8ea0078f3ee75a7cdb2dd1" - }, - { - "ImportPath": "github.com/docker/libnetwork/ipvs", - "Comment": "v0.8.0-dev.2-908-gd5c82231", - "Rev": "d5c822319097cc01cc9bd5ffedd74c7ce7c894f2" - }, - { - "ImportPath": "github.com/docker/libtrust", - "Rev": "9cbd2a1374f46905c68a4eb3694a130610adc62a" - }, - { - "ImportPath": "github.com/docker/machine/commands/mcndirs", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/drivers/errdriver", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/drivers/hyperv", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/drivers/none", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/drivers/virtualbox", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/drivers/vmwarefusion", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/auth", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/cert", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/check", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/drivers", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/drivers/plugin", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/drivers/plugin/localbinary", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/drivers/rpc", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/engine", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/host", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/log", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/mcndockerclient", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/mcnerror", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/mcnflag", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/mcnutils", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/persist", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/provision", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/provision/pkgaction", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/provision/serviceaction", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/shell", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/ssh", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/state", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/swarm", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/version", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/libmachine/versioncmp", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/machine/version", - "Comment": "docs-v0.8.2-2016-09-26-226-gb63e1e8b", - "Rev": "b63e1e8b2c43167a6811ef580cabd7dfca3a18f0" - }, - { - "ImportPath": "github.com/docker/spdystream", - "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" - }, - { - "ImportPath": "github.com/docker/spdystream/spdy", - "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" - }, - { - "ImportPath": "github.com/elazarl/go-bindata-assetfs", - "Rev": "3dcc96556217539f50599357fb481ac0dc7439b9" - }, - { - "ImportPath": "github.com/emicklei/go-restful", - "Comment": "2.2.0-4-gff4f55a", - "Rev": "ff4f55a206334ef123e4f79bbf348980da81ca46" - }, - { - "ImportPath": "github.com/emicklei/go-restful-swagger12", - "Comment": "1.0.1", - "Rev": "dcef7f55730566d41eae5db10e7d6981829720f6" - }, - { - "ImportPath": "github.com/emicklei/go-restful/log", - "Comment": "2.2.0-4-gff4f55a", - "Rev": "ff4f55a206334ef123e4f79bbf348980da81ca46" - }, - { - "ImportPath": "github.com/euank/go-kmsg-parser/kmsgparser", - "Comment": "v2.0.0", - "Rev": "5ba4d492e455a77d25dcf0d2c4acc9f2afebef4e" - }, - { - "ImportPath": "github.com/evanphx/json-patch", - "Rev": "944e07253867aacae43c04b2e6a239005443f33a" - }, - { - "ImportPath": "github.com/exponent-io/jsonpath", - "Rev": "d6023ce2651d8eafb5c75bb0c7167536102ec9f5" - }, - { - "ImportPath": "github.com/fatih/camelcase", - "Rev": "f6a740d52f961c60348ebb109adde9f4635d7540" - }, - { - "ImportPath": "github.com/fsnotify/fsnotify", - "Comment": "v1.3.1-1-gf12c623", - "Rev": "f12c6236fe7b5cf6bcf30e5935d08cb079d78334" - }, - { - "ImportPath": "github.com/ghodss/yaml", - "Rev": "73d445a93680fa1a78ae23a5839bad48f32ba1ee" - }, - { - "ImportPath": "github.com/go-ini/ini", - "Comment": "v0-54-g2e44421", - "Rev": "2e44421e256d82ebbf3d4d4fcabe8930b905eff3" - }, - { - "ImportPath": "github.com/go-openapi/analysis", - "Rev": "b44dc874b601d9e4e2f6e19140e794ba24bead3b" - }, - { - "ImportPath": "github.com/go-openapi/errors", - "Rev": "d24ebc2075bad502fac3a8ae27aa6dd58e1952dc" - }, - { - "ImportPath": "github.com/go-openapi/jsonpointer", - "Rev": "46af16f9f7b149af66e5d1bd010e3574dc06de98" - }, - { - "ImportPath": "github.com/go-openapi/jsonreference", - "Rev": "13c6e3589ad90f49bd3e3bbe2c2cb3d7a4142272" - }, - { - "ImportPath": "github.com/go-openapi/loads", - "Rev": "18441dfa706d924a39a030ee2c3b1d8d81917b38" - }, - { - "ImportPath": "github.com/go-openapi/runtime", - "Rev": "11e322eeecc1032d5a0a96c566ed53f2b5c26e22" - }, - { - "ImportPath": "github.com/go-openapi/spec", - "Rev": "6aced65f8501fe1217321abf0749d354824ba2ff" - }, - { - "ImportPath": "github.com/go-openapi/strfmt", - "Rev": "d65c7fdb29eca313476e529628176fe17e58c488" - }, - { - "ImportPath": "github.com/go-openapi/swag", - "Rev": "1d0bd113de87027671077d3c71eb3ac5d7dbba72" - }, - { - "ImportPath": "github.com/go-openapi/validate", - "Rev": "deaf2c9013bc1a7f4c774662259a506ba874d80f" - }, - { - "ImportPath": "github.com/godbus/dbus", - "Comment": "v3", - "Rev": "c7fdd8b5cd55e87b4e1f4e372cdb1db61dd6c66f" - }, - { - "ImportPath": "github.com/gogo/protobuf/gogoproto", - "Comment": "v0.4-3-gc0656edd", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/gogo/protobuf/proto", - "Comment": "v0.4-3-gc0656edd", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/gogo/protobuf/protoc-gen-gogo/descriptor", - "Comment": "v0.4-3-gc0656edd", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/gogo/protobuf/sortkeys", - "Comment": "v0.4-3-gc0656edd", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/golang/glog", - "Rev": "44145f04b68cf362d9c4df2182967c2275eaefed" - }, - { - "ImportPath": "github.com/golang/groupcache/lru", - "Rev": "02826c3e79038b59d737d3b1c0a1d937f71a4433" - }, - { - "ImportPath": "github.com/golang/protobuf/jsonpb", - "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" - }, - { - "ImportPath": "github.com/golang/protobuf/proto", - "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes", - "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes/any", - "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes/duration", - "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", - "Rev": "4bd1920723d7b7c925de087aa32e2187708897f7" - }, - { - "ImportPath": "github.com/google/btree", - "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" - }, - { - "ImportPath": "github.com/google/cadvisor/api", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/cache/memory", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/collector", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/common", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/crio", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/docker", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/libcontainer", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/raw", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/rkt", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/container/systemd", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/devicemapper", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/events", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/fs", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/healthz", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/http", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/http/mux", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/info/v1", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/info/v2", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/machine", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/manager", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/manager/watcher", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/manager/watcher/raw", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/manager/watcher/rkt", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/metrics", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/pages", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/pages/static", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/storage", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/summary", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/cloudinfo", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/cpuload", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/docker", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/oomparser", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/sysfs", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/utils/sysinfo", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/validate", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/version", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/cadvisor/zfs", - "Comment": "v0.27.1", - "Rev": "cda62a43857256fbc95dd31e7c810888f00f8ec7" - }, - { - "ImportPath": "github.com/google/certificate-transparency/go", - "Rev": "af98904302724c29aa6659ca372d41c9687de2b7" - }, - { - "ImportPath": "github.com/google/certificate-transparency/go/asn1", - "Rev": "af98904302724c29aa6659ca372d41c9687de2b7" - }, - { - "ImportPath": "github.com/google/certificate-transparency/go/client", - "Rev": "af98904302724c29aa6659ca372d41c9687de2b7" - }, - { - "ImportPath": "github.com/google/certificate-transparency/go/x509", - "Rev": "af98904302724c29aa6659ca372d41c9687de2b7" - }, - { - "ImportPath": "github.com/google/certificate-transparency/go/x509/pkix", - "Rev": "af98904302724c29aa6659ca372d41c9687de2b7" - }, - { - "ImportPath": "github.com/google/gofuzz", - "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" - }, - { - "ImportPath": "github.com/googleapis/gnostic/OpenAPIv2", - "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" - }, - { - "ImportPath": "github.com/googleapis/gnostic/compiler", - "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" - }, - { - "ImportPath": "github.com/googleapis/gnostic/extensions", - "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/common/extensions", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/compute/v2/flavors", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/compute/v2/images", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/compute/v2/servers", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/networking/v2/ports", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/openstack/utils", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gophercloud/gophercloud/pagination", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" - }, - { - "ImportPath": "github.com/gorilla/mux", - "Rev": "8096f47503459bcc74d1f4c487b7e6e42e5746b5" - }, - { - "ImportPath": "github.com/gorilla/websocket", - "Rev": "6eb6ad425a89d9da7a5549bc6da8f79ba5c17844" - }, - { - "ImportPath": "github.com/gregjones/httpcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/gregjones/httpcache/diskcache", - "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" - }, - { - "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", - "Comment": "v1.1-4-g2500245", - "Rev": "2500245aa6110c562d17020fb31a2c133d737799" - }, - { - "ImportPath": "github.com/grpc-ecosystem/grpc-gateway/runtime", - "Comment": "v1.1.0-25-g84398b9", - "Rev": "84398b94e188ee336f307779b57b3aa91af7063c" - }, - { - "ImportPath": "github.com/grpc-ecosystem/grpc-gateway/runtime/internal", - "Comment": "v1.1.0-25-g84398b9", - "Rev": "84398b94e188ee336f307779b57b3aa91af7063c" - }, - { - "ImportPath": "github.com/grpc-ecosystem/grpc-gateway/utilities", - "Comment": "v1.1.0-25-g84398b9", - "Rev": "84398b94e188ee336f307779b57b3aa91af7063c" - }, - { - "ImportPath": "github.com/hashicorp/errwrap", - "Rev": "7554cd9344cec97297fa6649b055a8c98c2a1e55" - }, - { - "ImportPath": "github.com/hashicorp/go-multierror", - "Rev": "8c5f0ad9360406a3807ce7de6bc73269a91a6e51" - }, - { - "ImportPath": "github.com/hashicorp/golang-lru", - "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" - }, - { - "ImportPath": "github.com/hashicorp/golang-lru/simplelru", - "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" - }, - { - "ImportPath": "github.com/hashicorp/hcl", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/hcl/ast", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/hcl/parser", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/hcl/scanner", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/hcl/strconv", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/hcl/token", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/json/parser", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/json/scanner", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hashicorp/hcl/json/token", - "Rev": "d8c773c4cba11b11539e3d45f93daeaa5dcf1fa1" - }, - { - "ImportPath": "github.com/hawkular/hawkular-client-go/metrics", - "Comment": "v0.5.1-1-g1d46ce7", - "Rev": "1d46ce7e1eca635f372357a8ccbf1fa7cc28b7d2" - }, - { - "ImportPath": "github.com/heketi/heketi/client/api/go-client", - "Comment": "v4.0.0-95-gaaf4061", - "Rev": "aaf40619d85fda757e7a1c1ea1b5118cea65594b" - }, - { - "ImportPath": "github.com/heketi/heketi/pkg/glusterfs/api", - "Comment": "v4.0.0-95-gaaf4061", - "Rev": "aaf40619d85fda757e7a1c1ea1b5118cea65594b" - }, - { - "ImportPath": "github.com/heketi/heketi/pkg/utils", - "Comment": "v4.0.0-95-gaaf4061", - "Rev": "aaf40619d85fda757e7a1c1ea1b5118cea65594b" - }, - { - "ImportPath": "github.com/hooklift/iso9660", - "Comment": "v1.0.0-6-g1cf07e5", - "Rev": "1cf07e5970d810f027bfbdfa2e9ad86db479c53a" - }, - { - "ImportPath": "github.com/howeyc/gopass", - "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8" - }, - { - "ImportPath": "github.com/imdario/mergo", - "Comment": "0.1.3-8-g6633656", - "Rev": "6633656539c1639d9d78127b7d47c622b5d7b6dc" - }, - { - "ImportPath": "github.com/inconshreveable/mousetrap", - "Comment": "v1.0", - "Rev": "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" - }, - { - "ImportPath": "github.com/influxdata/influxdb/client", - "Comment": "v1.1.1", - "Rev": "e47cf1f2e83a02443d7115c54f838be8ee959644" - }, - { - "ImportPath": "github.com/influxdata/influxdb/models", - "Comment": "v1.1.1", - "Rev": "e47cf1f2e83a02443d7115c54f838be8ee959644" - }, - { - "ImportPath": "github.com/influxdata/influxdb/pkg/escape", - "Comment": "v1.1.1", - "Rev": "e47cf1f2e83a02443d7115c54f838be8ee959644" - }, - { - "ImportPath": "github.com/jimmidyson/go-download", - "Rev": "7f9a90c8c95bee1bb7de9e72c682c67c8bf5546d" - }, - { - "ImportPath": "github.com/jmespath/go-jmespath", - "Comment": "0.2.2", - "Rev": "3433f3ea46d9f8019119e7dd41274e112a2359a9" - }, - { - "ImportPath": "github.com/jonboulle/clockwork", - "Rev": "72f9bd7c4e0c2a40055ab3d0f09654f730cce982" - }, - { - "ImportPath": "github.com/json-iterator/go", - "Comment": "1.0.0", - "Rev": "36b14963da70d11297d313183d7e6388c8510e1e" - }, - { - "ImportPath": "github.com/juju/ratelimit", - "Rev": "5b9ff866471762aa2ab2dced63c9fb6f53921342" - }, - { - "ImportPath": "github.com/kardianos/osext", - "Rev": "8fef92e41e22a70e700a96b29f066cda30ea24ef" - }, - { - "ImportPath": "github.com/kr/fs", - "Rev": "2788f0dbd16903de03cb8186e5c7d97b69ad387b" - }, - { - "ImportPath": "github.com/kr/pty", - "Comment": "release.r56-29-gf7ee69f", - "Rev": "f7ee69f31298ecbe5d2b349c711e2547a617d398" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/api", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/api/client", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/api/client/volume", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/api/spec", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/pkg/parser", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/pkg/units", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libopenstorage/openstorage/volume", - "Rev": "093a0c3888753c2056e7373183693d670c6bba01" - }, - { - "ImportPath": "github.com/libvirt/libvirt-go", - "Comment": "v3.4.0", - "Rev": "5ba8227244c30438609adcec6ea84dc1e688dfbd" - }, - { - "ImportPath": "github.com/lpabon/godbc", - "Comment": "v1.0-1-g9577782", - "Rev": "9577782540c1398b710ddae1b86268ba03a19b0c" - }, - { - "ImportPath": "github.com/magiconair/properties", - "Comment": "v1.7.0-4-g61b492c", - "Rev": "61b492c03cf472e0c6419be5899b8e0dc28b1b88" - }, - { - "ImportPath": "github.com/mailru/easyjson/buffer", - "Rev": "d5b7844b561a7bc640052f1b935f7b800330d7e0" - }, - { - "ImportPath": "github.com/mailru/easyjson/jlexer", - "Rev": "d5b7844b561a7bc640052f1b935f7b800330d7e0" - }, - { - "ImportPath": "github.com/mailru/easyjson/jwriter", - "Rev": "d5b7844b561a7bc640052f1b935f7b800330d7e0" - }, - { - "ImportPath": "github.com/mattn/go-runewidth", - "Comment": "v0.0.1-10-g737072b", - "Rev": "737072b4e32b7a5018b4a7125da8d12de90e8045" - }, - { - "ImportPath": "github.com/matttproud/golang_protobuf_extensions/pbutil", - "Rev": "fc2b8d3a73c4867e51861bbdd5ae3c1f0869dd6a" - }, - { - "ImportPath": "github.com/miekg/dns", - "Rev": "5d001d020961ae1c184f9f8152fdc73810481677" - }, - { - "ImportPath": "github.com/mistifyio/go-zfs", - "Comment": "v2.1.1-5-g1b4ae6f", - "Rev": "1b4ae6fb4e77b095934d4430860ff202060169f8" - }, - { - "ImportPath": "github.com/mitchellh/go-ps", - "Rev": "4fdf99ab29366514c69ccccddab5dc58b8d84062" - }, - { - "ImportPath": "github.com/mitchellh/mapstructure", - "Rev": "53818660ed4955e899c0bcafa97299a388bd7c8e" - }, - { - "ImportPath": "github.com/moby/hyperkit/go", - "Comment": "v0.20170425-63-ga12cd72", - "Rev": "a12cd7250bcd8d689078e3e42ae4a7cf6a0cbaf3" - }, - { - "ImportPath": "github.com/mohae/deepcopy", - "Rev": "491d3605edfb866af34a48075bd4355ac1bf46ca" - }, - { - "ImportPath": "github.com/mreiferson/go-httpclient", - "Rev": "31f0106b4474f14bc441575c19d3a5fa21aa1f6c" - }, - { - "ImportPath": "github.com/mrunalp/fileutils", - "Rev": "4ee1cc9a80582a0c75febdd5cfa779ee4361cbca" - }, - { - "ImportPath": "github.com/mtrmac/gpgme", - "Rev": "b2432428689ca58c2b8e8dea9449d3295cf96fc9" - }, - { - "ImportPath": "github.com/mxk/go-flowrate/flowrate", - "Rev": "cca7078d478f8520f85629ad7c68962d31ed7682" - }, - { - "ImportPath": "github.com/olekukonko/tablewriter", - "Rev": "bdcc175572fd7abece6c831e643891b9331bc9e7" - }, - { - "ImportPath": "github.com/opencontainers/go-digest", - "Rev": "a6d0ee40d4207ea02364bd3b9e8e77b9159ba1eb" - }, - { - "ImportPath": "github.com/opencontainers/image-spec/specs-go", - "Comment": "v1.0.0-rc6-12-g372ad78", - "Rev": "372ad780f63454fbbbbcc7cf80e5b90245c13e13" - }, - { - "ImportPath": "github.com/opencontainers/image-spec/specs-go/v1", - "Comment": "v1.0.0-rc6-12-g372ad78", - "Rev": "372ad780f63454fbbbbcc7cf80e5b90245c13e13" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/apparmor", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/fs", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/rootless", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/systemd", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/configs", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/configs/validate", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/criurpc", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/keys", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/seccomp", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/stacktrace", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/system", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/user", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runc/libcontainer/utils", - "Comment": "v1.0.0-rc4-50-g4d6e6720", - "Rev": "4d6e6720a7c885c37b4cb083c0d372dda3425120" - }, - { - "ImportPath": "github.com/opencontainers/runtime-spec/specs-go", - "Comment": "v1.0.0", - "Rev": "02137cd4e50b37a01665e1731fcd4ac2d2178230" - }, - { - "ImportPath": "github.com/opencontainers/selinux/go-selinux", - "Comment": "v1.0.0-rc1-5-g4a2974b", - "Rev": "4a2974bf1ee960774ffd517717f1f45325af0206" - }, - { - "ImportPath": "github.com/opencontainers/selinux/go-selinux/label", - "Comment": "v1.0.0-rc1-5-g4a2974b", - "Rev": "4a2974bf1ee960774ffd517717f1f45325af0206" - }, - { - "ImportPath": "github.com/pborman/uuid", - "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" - }, - { - "ImportPath": "github.com/pelletier/go-buffruneio", - "Comment": "v0.1.0", - "Rev": "df1e16fde7fc330a0ca68167c23bf7ed6ac31d6d" - }, - { - "ImportPath": "github.com/pelletier/go-toml", - "Comment": "v0.3.5-10-g0049ab3", - "Rev": "0049ab3dc4c4c70a9eee23087437b69c0dde2130" - }, - { - "ImportPath": "github.com/peterbourgon/diskv", - "Comment": "v2.0.1", - "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" - }, - { - "ImportPath": "github.com/pkg/browser", - "Rev": "9302be274faad99162b9d48ec97b24306872ebb0" - }, - { - "ImportPath": "github.com/pkg/errors", - "Comment": "v0.7.0-13-ga221380", - "Rev": "a22138067af1c4942683050411a841ade67fe1eb" - }, - { - "ImportPath": "github.com/pkg/profile", - "Comment": "v1.2.0-7-g3a8809b", - "Rev": "3a8809bd8a80f8ecfe4ee1b34b3f37194968617c" - }, - { - "ImportPath": "github.com/pkg/sftp", - "Rev": "4d0e916071f68db74f8a73926335f809396d6b42" - }, - { - "ImportPath": "github.com/prometheus/client_golang/prometheus", - "Comment": "v0.8.0-83-ge7e9030", - "Rev": "e7e903064f5e9eb5da98208bae10b475d4db0f8c" - }, - { - "ImportPath": "github.com/prometheus/client_golang/prometheus/promhttp", - "Comment": "v0.8.0-83-ge7e9030", - "Rev": "e7e903064f5e9eb5da98208bae10b475d4db0f8c" - }, - { - "ImportPath": "github.com/prometheus/client_model/go", - "Comment": "model-0.0.2-12-gfa8ad6f", - "Rev": "fa8ad6fec33561be4280a8f0514318c79d7f6cb6" - }, - { - "ImportPath": "github.com/prometheus/common/expfmt", - "Rev": "13ba4ddd0caa9c28ca7b7bffe1dfa9ed8d5ef207" - }, - { - "ImportPath": "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg", - "Rev": "13ba4ddd0caa9c28ca7b7bffe1dfa9ed8d5ef207" - }, - { - "ImportPath": "github.com/prometheus/common/model", - "Rev": "13ba4ddd0caa9c28ca7b7bffe1dfa9ed8d5ef207" - }, - { - "ImportPath": "github.com/prometheus/procfs", - "Rev": "65c1f6f8f0fc1e2185eb9863a3bc751496404259" - }, - { - "ImportPath": "github.com/prometheus/procfs/xfs", - "Rev": "65c1f6f8f0fc1e2185eb9863a3bc751496404259" - }, - { - "ImportPath": "github.com/quobyte/api", - "Rev": "cb10db90715b14d4784465d2fa3b915dfacc0628" - }, - { - "ImportPath": "github.com/r2d4/external-storage/lib/controller", - "Comment": "v1.0.0-22-g01d5830", - "Rev": "01d5830a6980d4c7572139cc40817132854bf394" - }, - { - "ImportPath": "github.com/r2d4/external-storage/lib/leaderelection", - "Comment": "v1.0.0-22-g01d5830", - "Rev": "01d5830a6980d4c7572139cc40817132854bf394" - }, - { - "ImportPath": "github.com/r2d4/external-storage/lib/leaderelection/resourcelock", - "Comment": "v1.0.0-22-g01d5830", - "Rev": "01d5830a6980d4c7572139cc40817132854bf394" - }, - { - "ImportPath": "github.com/rackspace/gophercloud", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/flavors", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/images", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/servers", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/identity/v2/tenants", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/identity/v2/tokens", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/identity/v3/tokens", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/openstack/utils", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/pagination", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/rackspace", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/rackspace/compute/v2/servers", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/rackspace/identity/v2/tokens", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/testhelper", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rackspace/gophercloud/testhelper/client", - "Comment": "v1.0.0-1012-ge00690e8", - "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" - }, - { - "ImportPath": "github.com/rancher/go-rancher/client", - "Comment": "v0.1.0-196-g09693a8", - "Rev": "09693a8743ba5ee58c58c1b1e8a4abd17af00d45" - }, - { - "ImportPath": "github.com/renstrom/dedent", - "Comment": "v1.0.0-3-g020d11c", - "Rev": "020d11c3b9c0c7a3c2efcc8e5cf5b9ef7bcea21f" - }, - { - "ImportPath": "github.com/robfig/cron", - "Comment": "v1-53-gdf38d32", - "Rev": "df38d32658d8788cd446ba74db4bb5375c4b0cb3" - }, - { - "ImportPath": "github.com/rubiojr/go-vhd/vhd", - "Rev": "0bfd3b39853cdde5762efda92289f14b0ac0491b" - }, - { - "ImportPath": "github.com/russross/blackfriday", - "Comment": "v1.4-2-g300106c", - "Rev": "300106c228d52c8941d4b3de6054a6062a86dda3" - }, - { - "ImportPath": "github.com/samalba/dockerclient", - "Rev": "91d7393ff85980ba3a8966405871a3d446ca28f2" - }, - { - "ImportPath": "github.com/satori/uuid", - "Comment": "v1.1.0-8-g5bf94b6", - "Rev": "5bf94b69c6b68ee1b541973bb8e1144db23a194b" - }, - { - "ImportPath": "github.com/seccomp/libseccomp-golang", - "Rev": "1b506fc7c24eec5a3693cdcbed40d9c226cfc6a1" - }, - { - "ImportPath": "github.com/shurcooL/sanitized_anchor_name", - "Rev": "10ef21a441db47d8b13ebcc5fd2310f636973c77" - }, - { - "ImportPath": "github.com/sirupsen/logrus", - "Comment": "v1.0.3-11-g89742ae", - "Rev": "89742aefa4b206dcf400792f3bd35b542998eb3b" - }, - { - "ImportPath": "github.com/spf13/afero", - "Rev": "b28a7effac979219c2a2ed6205a4d70e4b1bcd02" - }, - { - "ImportPath": "github.com/spf13/afero/mem", - "Rev": "b28a7effac979219c2a2ed6205a4d70e4b1bcd02" - }, - { - "ImportPath": "github.com/spf13/afero/sftp", - "Rev": "b28a7effac979219c2a2ed6205a4d70e4b1bcd02" - }, - { - "ImportPath": "github.com/spf13/cast", - "Rev": "e31f36ffc91a2ba9ddb72a4b6a607ff9b3d3cb63" - }, - { - "ImportPath": "github.com/spf13/cobra", - "Rev": "f62e98d28ab7ad31d707ba837a966378465c7b57" - }, - { - "ImportPath": "github.com/spf13/cobra/doc", - "Rev": "f62e98d28ab7ad31d707ba837a966378465c7b57" - }, - { - "ImportPath": "github.com/spf13/jwalterweatherman", - "Rev": "33c24e77fb80341fe7130ee7c594256ff08ccc46" - }, - { - "ImportPath": "github.com/spf13/pflag", - "Rev": "9ff6c6923cfffbcd502984b8e0c80539a94968b7" - }, - { - "ImportPath": "github.com/spf13/viper", - "Rev": "7fb2782df3d83e0036cc89f461ed0422628776f4" - }, - { - "ImportPath": "github.com/square/go-jose", - "Rev": "789a4c4bd4c118f7564954f441b29c153ccd6a96" - }, - { - "ImportPath": "github.com/square/go-jose/cipher", - "Rev": "789a4c4bd4c118f7564954f441b29c153ccd6a96" - }, - { - "ImportPath": "github.com/square/go-jose/json", - "Rev": "789a4c4bd4c118f7564954f441b29c153ccd6a96" - }, - { - "ImportPath": "github.com/storageos/go-api", - "Rev": "74f9beb613cacf0cc282facc2e1550a3231e126f" - }, - { - "ImportPath": "github.com/storageos/go-api/types", - "Rev": "74f9beb613cacf0cc282facc2e1550a3231e126f" - }, - { - "ImportPath": "github.com/syndtr/gocapability/capability", - "Rev": "e7cb7fa329f456b3855136a2642b197bad7366ba" - }, - { - "ImportPath": "github.com/ugorji/go/codec", - "Rev": "ded73eae5db7e7a0ef6f55aace87a2873c5d2b74" - }, - { - "ImportPath": "github.com/vishvananda/netlink", - "Rev": "f5a6f697a596c788d474984a38a0ac4ba0719e93" - }, - { - "ImportPath": "github.com/vishvananda/netlink/nl", - "Rev": "f5a6f697a596c788d474984a38a0ac4ba0719e93" - }, - { - "ImportPath": "github.com/vishvananda/netns", - "Rev": "86bef332bfc3b59b7624a600bd53009ce91a9829" - }, - { - "ImportPath": "github.com/vmware/govmomi", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/find", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/list", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/object", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/pbm", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/pbm/methods", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/pbm/types", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/property", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/session", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/task", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/debug", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/methods", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/mo", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/progress", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/soap", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/types", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/govmomi/vim25/xml", - "Comment": "v0.14.0-11-gb8b228c", - "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" - }, - { - "ImportPath": "github.com/vmware/photon-controller-go-sdk/SSPI", - "Comment": "PROMOTED-488", - "Rev": "4a435daef6ccd3d0edaac1161e76f51a70c2589a" - }, - { - "ImportPath": "github.com/vmware/photon-controller-go-sdk/photon", - "Comment": "PROMOTED-488", - "Rev": "4a435daef6ccd3d0edaac1161e76f51a70c2589a" - }, - { - "ImportPath": "github.com/vmware/photon-controller-go-sdk/photon/lightwave", - "Comment": "PROMOTED-488", - "Rev": "4a435daef6ccd3d0edaac1161e76f51a70c2589a" - }, - { - "ImportPath": "github.com/xanzy/go-cloudstack/cloudstack", - "Comment": "v2.1.1-1-g1e2cbf6", - "Rev": "1e2cbf647e57fa90353612074fdfc42faf5073bf" - }, - { - "ImportPath": "github.com/xeipuuv/gojsonpointer", - "Rev": "e0fe6f68307607d540ed8eac07a342c33fa1b54a" - }, - { - "ImportPath": "github.com/xeipuuv/gojsonreference", - "Rev": "e02fc20de94c78484cd5ffb007f8af96be030a45" - }, - { - "ImportPath": "github.com/xeipuuv/gojsonschema", - "Rev": "c539bca196be50ccdd1f0bcd9076de95f9081831" - }, - { - "ImportPath": "github.com/xiang90/probing", - "Comment": "0.0.1", - "Rev": "07dd2e8dfe18522e9c447ba95f2fe95262f63bb2" - }, - { - "ImportPath": "github.com/zchee/go-vmnet", - "Rev": "97ebf91740978f1e665defc0a960fb997ebe282b" - }, - { - "ImportPath": "go4.org/errorutil", - "Rev": "03efcb870d84809319ea509714dd6d19a1498483" - }, - { - "ImportPath": "golang.org/x/crypto/bcrypt", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/blowfish", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/cast5", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/curve25519", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/ed25519", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/ed25519/internal/edwards25519", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/nacl/secretbox", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/openpgp", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/openpgp/armor", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/openpgp/elgamal", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/openpgp/errors", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/openpgp/packet", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/openpgp/s2k", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/pkcs12", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/pkcs12/internal/rc2", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/poly1305", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/salsa20/salsa", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/ssh", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/crypto/ssh/terminal", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" - }, - { - "ImportPath": "golang.org/x/exp/inotify", - "Rev": "292a51b8d262487dab23a588950e8052d63d9113" - }, - { - "ImportPath": "golang.org/x/net/context", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/context/ctxhttp", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/html", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/html/atom", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/http2", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/idna", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/proxy", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/trace", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/websocket", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/oauth2", - "Rev": "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - }, - { - "ImportPath": "golang.org/x/oauth2/google", - "Rev": "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - }, - { - "ImportPath": "golang.org/x/oauth2/internal", - "Rev": "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - }, - { - "ImportPath": "golang.org/x/oauth2/jws", - "Rev": "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - }, - { - "ImportPath": "golang.org/x/oauth2/jwt", - "Rev": "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - }, - { - "ImportPath": "golang.org/x/sync/errgroup", - "Rev": "f52d1811a62927559de87708c8913c1650ce4f26" - }, - { - "ImportPath": "golang.org/x/sync/syncmap", - "Rev": "f52d1811a62927559de87708c8913c1650ce4f26" - }, - { - "ImportPath": "golang.org/x/sys/unix", - "Rev": "7ddbeae9ae08c6a06a59597f0c9edbc5ff2444ce" - }, - { - "ImportPath": "golang.org/x/sys/windows", - "Rev": "7ddbeae9ae08c6a06a59597f0c9edbc5ff2444ce" - }, - { - "ImportPath": "golang.org/x/sys/windows/registry", - "Rev": "7ddbeae9ae08c6a06a59597f0c9edbc5ff2444ce" - }, - { - "ImportPath": "golang.org/x/text/cases", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/encoding", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/encoding/internal", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/encoding/internal/identifier", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/encoding/unicode", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/internal", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/internal/utf8internal", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/language", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/runes", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/transform", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/width", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/tools/container/intsets", - "Rev": "2382e3994d48b1d22acc2c86bcad0a2aff028e32" - }, - { - "ImportPath": "google.golang.org/api/cloudkms/v1", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/cloudmonitoring/v2beta2", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/compute/v0.alpha", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/compute/v0.beta", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/compute/v1", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/container/v1", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/gensupport", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/googleapi", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/api/googleapi/internal/uritemplates", - "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" - }, - { - "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", - "Rev": "09f6ed296fc66555a25fe4ce95173148778dfa85" - }, - { - "ImportPath": "google.golang.org/grpc", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/codes", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/credentials", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/grpclog", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/internal", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/keepalive", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/metadata", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/naming", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/peer", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/stats", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/status", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/tap", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "google.golang.org/grpc/transport", - "Comment": "v1.3.0", - "Rev": "d2e1b51f33ff8c5e4a15560ff049d200e83726c5" - }, - { - "ImportPath": "gopkg.in/cheggaaa/pb.v1", - "Comment": "v1.0.6", - "Rev": "dd61faab99a777c652bb680e37715fe0cb549856" - }, - { - "ImportPath": "gopkg.in/gcfg.v1", - "Comment": "v1.2.0", - "Rev": "27e4946190b4a327b539185f2b5b1f7c84730728" - }, - { - "ImportPath": "gopkg.in/gcfg.v1/scanner", - "Comment": "v1.2.0", - "Rev": "27e4946190b4a327b539185f2b5b1f7c84730728" - }, - { - "ImportPath": "gopkg.in/gcfg.v1/token", - "Comment": "v1.2.0", - "Rev": "27e4946190b4a327b539185f2b5b1f7c84730728" - }, - { - "ImportPath": "gopkg.in/gcfg.v1/types", - "Comment": "v1.2.0", - "Rev": "27e4946190b4a327b539185f2b5b1f7c84730728" - }, - { - "ImportPath": "gopkg.in/inf.v0", - "Comment": "v0.9.0", - "Rev": "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" - }, - { - "ImportPath": "gopkg.in/natefinch/lumberjack.v2", - "Comment": "v1.0-16-g20b71e5", - "Rev": "20b71e5b60d756d3d2f80def009790325acc2b23" - }, - { - "ImportPath": "gopkg.in/warnings.v0", - "Comment": "v0.1.1", - "Rev": "8a331561fe74dadba6edfc59f3be66c22c3b065d" - }, - { - "ImportPath": "gopkg.in/yaml.v2", - "Rev": "53feefa2559fb8dfa8d81baad31be332c97d6c77" - }, - { - "ImportPath": "k8s.io/heapster/metrics/api/v1/types", - "Comment": "v1.2.0-beta.1", - "Rev": "c2ac40f1adf8c42a79badddb2a2acd673cae3bcb" - }, - { - "ImportPath": "k8s.io/kube-openapi/pkg/aggregator", - "Rev": "868f2f29720b192240e18284659231b440f9cda5" - }, - { - "ImportPath": "k8s.io/kube-openapi/pkg/builder", - "Rev": "868f2f29720b192240e18284659231b440f9cda5" - }, - { - "ImportPath": "k8s.io/kube-openapi/pkg/common", - "Rev": "868f2f29720b192240e18284659231b440f9cda5" - }, - { - "ImportPath": "k8s.io/kube-openapi/pkg/handler", - "Rev": "868f2f29720b192240e18284659231b440f9cda5" - }, - { - "ImportPath": "k8s.io/kube-openapi/pkg/util", - "Rev": "868f2f29720b192240e18284659231b440f9cda5" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kube-apiserver/app", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kube-apiserver/app/options", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kube-controller-manager/app", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kube-controller-manager/app/options", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kube-proxy/app", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kubeadm/app/constants", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app/options", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/apis/federation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/apis/federation/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/apis/federation/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/scheme", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/autoscaling/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/batch/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/core/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/extensions/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/federation/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/endpoints", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/events", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/helper", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/helper/qos", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/persistentvolume", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/pod", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/ref", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/resource", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/service", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/endpoints", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/helper", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/helper/qos", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/node", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/pod", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/resource", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/service", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/v1/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/api/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/abac", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/abac/latest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/abac/v0", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/abac/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admission", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admission/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admission/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/apps", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1beta2", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/batch", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v2alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/networking", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/networking/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/networking/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/networking/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/policy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/settings", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1beta1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/auth/authorizer/abac", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/auth/nodeidentifier", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/bootstrap/api", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/capabilities", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/chaosclient", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/scheme", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/admissionregistration", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/admissionregistration/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/apps", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/apps/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/autoscaling", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/autoscaling/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/batch", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/batch/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/certificates", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/certificates/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/core", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/core/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/extensions", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/extensions/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/internalinterfaces", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/networking", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/networking/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/policy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/policy/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/rbac", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/rbac/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/scheduling", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/scheduling/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/settings", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/settings/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/storage/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/leaderelectionconfig", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/admissionregistration/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/apps/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/autoscaling/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/batch/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/certificates/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/core/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/extensions/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/networking/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/policy/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/rbac/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/scheduling/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/settings/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/listers/storage/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/aws", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/azure", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/cloudstack", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/photon", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/bootstrap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/certificates", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/certificates/approver", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/certificates/signer", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/cronjob", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/daemon", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/daemon/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/deployment", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/deployment/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/disruption", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/endpoint", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/garbagecollector", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/history", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/job", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/namespace", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/namespace/deletion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/node", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/node/ipam", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/node/ipam/cidrset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/node/ipam/sync", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/node/scheduler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/node/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/podautoscaler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/podgc", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/replicaset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/replication", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/resourcequota", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/route", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/service", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/serviceaccount", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/statefulset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/ttl", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/populator", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/reconciler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/statusupdater", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/events", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/expand", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/expand/cache", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/expand/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/persistentvolume", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/aws", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/azure", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/gcp", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/rancher", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/features", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/fieldpath", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/generated/openapi", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/admission", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/admission/configuration", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/admission/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/authenticator", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/authorizer", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/options", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubeapiserver/server", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/cmd/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/plugins", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/resource", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/hash", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/slice", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubectl/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/cri", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cadvisor", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/certificate", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/client", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpuset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/config", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/configmap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/container", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/deviceplugin", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/cm", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/errors", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/remote", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/envvars", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/events", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/eviction", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/eviction/api", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/gpu", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/gpu/nvidia", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/images", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/equal", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kuberuntime", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/leaky", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/lifecycle", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/metrics", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/cni", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/hairpin", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/hostport", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/kubenet", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/pleg", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/pod", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/preemption", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/prober", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/prober/results", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/qos", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/remote", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/rkt", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/secret", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/portforward", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/remotecommand", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/stats", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/streaming", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/stats", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/status", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/sysctl", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/types", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/cache", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/csr", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/format", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/ioutils", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/queue", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/sliceutils", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/master", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/master/controller/crdregistration", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/master/ports", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/master/tunneler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/printers", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/printers/internalversion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/printers/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/probe", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/probe/exec", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/probe/http", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/probe/tcp", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/config", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/healthcheck", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/iptables", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/ipvs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/userspace", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/winkernel", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/proxy/winuserspace", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/quota", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/quota/evaluator/core", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/quota/generic", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/quota/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/admissionregistration/externaladmissionhookconfiguration", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/admissionregistration/externaladmissionhookconfiguration/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/admissionregistration/initializerconfiguration", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/admissionregistration/initializerconfiguration/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/admissionregistration/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/apps/controllerrevision", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/apps/controllerrevision/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/apps/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/apps/statefulset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/apps/statefulset/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authentication/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authentication/tokenreview", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/localsubjectaccessreview", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/selfsubjectaccessreview", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/selfsubjectrulesreview", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/autoscaling/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/batch/cronjob", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/batch/cronjob/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/batch/job", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/batch/job/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/batch/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/cachesize", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/certificates/certificates", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/certificates/certificates/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/certificates/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/componentstatus", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/configmap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/configmap/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/endpoint", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/endpoint/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/event", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/event/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/limitrange", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/limitrange/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/namespace", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/namespace/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/node", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/node/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/node/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/persistentvolume", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/pod", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/pod/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/pod/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/podtemplate", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/podtemplate/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/rangeallocation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/replicationcontroller", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/resourcequota", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/resourcequota/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/secret", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/secret/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/allocator", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/allocator/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/ipallocator", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/ipallocator/controller", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/portallocator", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/portallocator/controller", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/service/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/serviceaccount", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/core/serviceaccount/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/controller/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/daemonset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/daemonset/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/deployment", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/deployment/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/ingress", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/ingress/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/podsecuritypolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/podsecuritypolicy/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/replicaset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/replicaset/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/extensions/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/networking/networkpolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/networking/networkpolicy/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/networking/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/policy/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/clusterrole", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/clusterrole/policybased", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/clusterrole/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/policybased", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/reconciliation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/role", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/role/policybased", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/role/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/rolebinding", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/rolebinding/policybased", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/rolebinding/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/rbac/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/scheduling/priorityclass", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/scheduling/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/settings/podpreset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/settings/podpreset/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/settings/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/storage/rest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/storage/storageclass", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/registry/storage/storageclass/storage", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/routes", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/apparmor", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/group", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/user", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/securitycontext", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/serviceaccount", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/ssh", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/async", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/bandwidth", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/config", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/configz", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/dbus", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/ebtables", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/env", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/file", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/filesystem", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/flock", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/goroutinemap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/hash", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/interrupt", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/io", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/ipconfig", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/iptables", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/ipvs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/keymutex", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/labels", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/limitwriter", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/maps", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/metrics", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/mount", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/net/sets", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/netsh", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/node", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/oom", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/parsers", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/pointer", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/procfs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/reflector/prometheus", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/removeall", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/resourcecontainer", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/rlimit", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/selinux", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/slice", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/strings", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/sysctl", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/system", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/tail", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/taints", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/term", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/tolerations", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/version", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/util/workqueue/prometheus", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/version", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/version/verflag", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/aws_ebs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/azure_dd", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/azure_file", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/cephfs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/cinder", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/configmap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/downwardapi", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/empty_dir", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/fc", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/flexvolume", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/flocker", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/gce_pd", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/git_repo", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/glusterfs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/host_path", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/iscsi", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/local", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/nfs", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/photon_pd", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/portworx", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/projected", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/quobyte", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/rbd", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/scaleio", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/secret", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/storageos", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/util/operationexecutor", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/util/types", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/util/volumehelper", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/pkg/volume/vsphere_volume", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/cmd/kube-scheduler/app", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/cmd/kube-scheduler/app/options", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/admit", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/antiaffinity", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/deny", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/exec", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/gc", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/imagepolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/initialization", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/initialresources", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/limitranger", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/namespace/exists", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/noderestriction", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/persistentvolume/label", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/persistentvolume/resize", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podnodeselector", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podpreset", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/priority", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/resourcequota", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/install", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/serviceaccount", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/storageclass/setdefault", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/webhook", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authorizer/node", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/priorities", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/priorities/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithmprovider", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithmprovider/defaults", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api/latest", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api/v1", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api/validation", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/core", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/factory", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/metrics", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/util", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/util/rand", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/expansion", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/third_party/forked/gonum/graph", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/third_party/forked/gonum/graph/simple", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/kubernetes/third_party/forked/gonum/graph/traverse", - "Comment": "v1.8.0", - "Rev": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4" - }, - { - "ImportPath": "k8s.io/utils/exec", - "Rev": "9fdc871a36f37980dd85f96d576b20d564cc0784" - }, - { - "ImportPath": "vbom.ml/util/sortorder", - "Rev": "db5cfe13f5cc80a4990d98e2e1b0707a4d1a5394" + "ImportPath": "github.com/elgs/gostrgen", + "Rev": "9d61ae07eeaeb54ce2100022b1fd3ea020093d09" } ] } diff --git a/cmd/minikube/cmd/node/node.go b/cmd/minikube/cmd/node/node.go index 7f0a75ac6932..b621e4b368cb 100644 --- a/cmd/minikube/cmd/node/node.go +++ b/cmd/minikube/cmd/node/node.go @@ -14,6 +14,7 @@ import ( "k8s.io/minikube/cmd/minikube/profile" cmdutil "k8s.io/minikube/cmd/util" + "k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm" "k8s.io/minikube/pkg/minikube/cluster" cfg "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/machine" @@ -112,7 +113,6 @@ func startNode(cmd *cobra.Command, args []string) { } fmt.Println("Starting nodes...") - fmt.Printf("Config: %#v\n", cfg) api, err := machine.NewAPIClient() if err != nil { @@ -132,6 +132,30 @@ func startNode(cmd *cobra.Command, args []string) { glog.Errorln("Error starting node machine: ", err) cmdutil.MaybeReportErrorAndExit(err) } + + k8sBootstrapper, err := kubeadm.NewKubeadmBootstrapperForMachine(machineCfg.MachineName, api) + if err != nil { + glog.Errorln("Error getting kubeadm bootstrapper: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + fmt.Println("Moving assets into node...") + if err := k8sBootstrapper.UpdateNode(cfg.KubernetesConfig); err != nil { + glog.Errorln("Error updating node: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + fmt.Println("Setting up certs...") + if err := k8sBootstrapper.SetupCerts(cfg.KubernetesConfig); err != nil { + glog.Errorln("Error configuring authentication: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + fmt.Println("Joining node to cluster...") + if err := k8sBootstrapper.JoinNode(cfg.KubernetesConfig); err != nil { + glog.Errorln("Error joining node to cluster: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + ip, err := host.Driver.GetIP() if err != nil { glog.Errorln("Error getting machine IP: ", err) @@ -139,7 +163,6 @@ func startNode(cmd *cobra.Command, args []string) { } fmt.Printf("Node started. IP: %s\n", ip) } - } func removeNode(cmd *cobra.Command, args []string) { diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 04f0ea4ec3e0..4a81c3b33654 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -26,6 +26,7 @@ import ( "strings" "time" + "github.com/elgs/gostrgen" "github.com/blang/semver" "github.com/docker/machine/libmachine/host" "github.com/golang/glog" @@ -198,6 +199,11 @@ func runStart(cmd *cobra.Command, args []string) { } } + token, err := genBootstrapToken() + if err != nil { + glog.Exitf("Error generating bootstrap token: ", err) + } + kubernetesConfig := bootstrapper.KubernetesConfig{ KubernetesVersion: selectedKubernetesVersion, NodeIP: ip, @@ -210,6 +216,7 @@ func runStart(cmd *cobra.Command, args []string) { ServiceCIDR: pkgutil.DefaultServiceCIDR, ExtraOptions: extraOptions, ShouldLoadCachedImages: shouldCacheImages, + BootstrapToken: token, } // NOTE Get bootstrapper @@ -397,3 +404,16 @@ func init() { viper.BindPFlags(startCmd.Flags()) RootCmd.AddCommand(startCmd) } + +func genBootstrapToken() (string, error) { + first, err := gostrgen.RandGen(6, gostrgen.Lower | gostrgen.Digit, "", "") + if err != nil { + return "", nil + } + + second, err := gostrgen.RandGen(16, gostrgen.Lower | gostrgen.Digit, "", "") + if err != nil { + return "", nil + } + return fmt.Sprintf("%s.%s", first, second), nil +} diff --git a/pkg/minikube/bootstrapper/bootstrapper.go b/pkg/minikube/bootstrapper/bootstrapper.go index 73ba18fac22f..3cc9cd56b732 100644 --- a/pkg/minikube/bootstrapper/bootstrapper.go +++ b/pkg/minikube/bootstrapper/bootstrapper.go @@ -45,6 +45,8 @@ type KubernetesConfig struct { ExtraOptions util.ExtraOptionSlice ShouldLoadCachedImages bool + + BootstrapToken string } const ( diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index bee53770cebb..21cf2afa04eb 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -45,7 +45,11 @@ type KubeadmBootstrapper struct { } func NewKubeadmBootstrapper(api libmachine.API) (*KubeadmBootstrapper, error) { - h, err := api.Load(config.GetMachineName()) + return NewKubeadmBootstrapperForMachine(config.GetMachineName(), api) +} + +func NewKubeadmBootstrapperForMachine(machineName string, api libmachine.API) (*KubeadmBootstrapper, error) { + h, err := api.Load(machineName) if err != nil { return nil, errors.Wrap(err, "getting api client") } @@ -106,7 +110,7 @@ func (k *KubeadmBootstrapper) StartCluster(k8s bootstrapper.KubernetesConfig) er // We use --skip-preflight-checks since we have our own custom addons // that we also stick in /etc/kubernetes/manifests b := bytes.Buffer{} - if err := kubeadmInitTemplate.Execute(&b, struct{ KubeadmConfigFile string }{constants.KubeadmConfigFile}); err != nil { + if err := kubeadmInitTemplate.Execute(&b, struct{KubeadmConfigFile, Token string}{ constants.KubeadmConfigFile, k8s.BootstrapToken }); err != nil { return err } @@ -128,6 +132,22 @@ func (k *KubeadmBootstrapper) StartCluster(k8s bootstrapper.KubernetesConfig) er return nil } +func (k *KubeadmBootstrapper) JoinNode(k8s bootstrapper.KubernetesConfig) error { + // We use --skip-preflight-checks since we have our own custom addons + // that we also stick in /etc/kubernetes/manifests + b := bytes.Buffer{} + if err := kubeadmJoinTemplate.Execute(&b, struct{Token, ServerAddress string}{ k8s.BootstrapToken, fmt.Sprintf("%s:8443", k8s.NodeIP) }); err != nil { + return err + } + + err := k.c.Run(b.String()) + if err != nil { + return errors.Wrapf(err, "kubeadm init error running command: %s", b.String()) + } + + return nil +} + //TODO(r2d4): Split out into shared function between localkube and kubeadm func addAddons(files *[]assets.CopyableFile) error { // add addons to file list @@ -305,6 +325,57 @@ sudo systemctl start kubelet return nil } +func (k *KubeadmBootstrapper) UpdateNode(cfg bootstrapper.KubernetesConfig) error { + kubeletCfg, err := NewKubeletConfig(cfg) + if err != nil { + return errors.Wrap(err, "generating kubelet config") + } + + files := []assets.CopyableFile{ + assets.NewMemoryAssetTarget([]byte(kubeletService), constants.KubeletServiceFile, "0640"), + assets.NewMemoryAssetTarget([]byte(kubeletCfg), constants.KubeletSystemdConfFile, "0640"), + } + + var g errgroup.Group + for _, bin := range []string{"kubelet", "kubeadm"} { + bin := bin + g.Go(func() error { + path, err := maybeDownloadAndCache(bin, cfg.KubernetesVersion) + if err != nil { + return errors.Wrapf(err, "downloading %s", bin) + } + f, err := assets.NewFileAsset(path, "/usr/bin", bin, "0641") + if err != nil { + return errors.Wrap(err, "making new file asset") + } + if err := k.c.Copy(f); err != nil { + return errors.Wrapf(err, "transferring kubeadm file: %+v", f) + } + return nil + }) + } + if err := g.Wait(); err != nil { + return errors.Wrap(err, "downloading binaries") + } + + for _, f := range files { + if err := k.c.Copy(f); err != nil { + return errors.Wrapf(err, "transferring kubeadm file: %+v", f) + } + } + + err = k.c.Run(` +sudo systemctl daemon-reload && +sudo systemctl enable kubelet && +sudo systemctl start kubelet +`) + if err != nil { + return errors.Wrap(err, "starting kubelet") + } + + return nil +} + func generateConfig(k8s bootstrapper.KubernetesConfig) (string, error) { version, err := ParseKubernetesVersion(k8s.KubernetesVersion) if err != nil { @@ -326,6 +397,7 @@ func generateConfig(k8s bootstrapper.KubernetesConfig) (string, error) { EtcdDataDir string NodeName string ExtraArgs []ComponentExtraArgs + Token string }{ CertDir: util.DefaultCertPath, ServiceCIDR: util.DefaultServiceCIDR, @@ -335,6 +407,7 @@ func generateConfig(k8s bootstrapper.KubernetesConfig) (string, error) { EtcdDataDir: "/data", //TODO(r2d4): change to something else persisted NodeName: k8s.NodeName, ExtraArgs: extraComponentConfig, + Token: k8s.BootstrapToken, } b := bytes.Buffer{} diff --git a/pkg/minikube/bootstrapper/kubeadm/templates.go b/pkg/minikube/bootstrapper/kubeadm/templates.go index 6dbd445b0ed9..abdf058c652a 100644 --- a/pkg/minikube/bootstrapper/kubeadm/templates.go +++ b/pkg/minikube/bootstrapper/kubeadm/templates.go @@ -37,8 +37,9 @@ etcd: dataDir: {{.EtcdDataDir}} nodeName: {{.NodeName}} {{range .ExtraArgs}}{{.Component}}:{{range $i, $val := printMapInOrder .Options ": " }} - {{$val}}{{end}} -{{end}}`)) + {{$val}}{{end}}{{end}} +token: {{.Token}} +`)) var kubeletSystemdTemplate = template.Must(template.New("kubeletSystemdTemplate").Parse(` [Service] @@ -73,6 +74,8 @@ sudo /usr/bin/kubeadm alpha phase etcd local --config {{.KubeadmConfigFile}} var kubeadmInitTemplate = template.Must(template.New("kubeadmInitTemplate").Parse("sudo /usr/bin/kubeadm init --config {{.KubeadmConfigFile}} --skip-preflight-checks")) +var kubeadmJoinTemplate = template.Must(template.New("kubeadmJoinTemplate").Parse("sudo /usr/bin/kubeadm join --token {{.Token}} {{.ServerAddress}}")) + // printMapInOrder sorts the keys and prints the map in order, combining key // value pairs with the separator character // From d423e8280f711fd5240f258ca5f82b63b77d942c Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 13 Jan 2018 22:47:45 -0500 Subject: [PATCH 04/42] Add Pod CIDR option (hard-coded for now) --- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 11 +++++++---- pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go | 5 +++++ pkg/minikube/bootstrapper/kubeadm/templates.go | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index 21cf2afa04eb..6dc1560d6e6b 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -110,7 +110,7 @@ func (k *KubeadmBootstrapper) StartCluster(k8s bootstrapper.KubernetesConfig) er // We use --skip-preflight-checks since we have our own custom addons // that we also stick in /etc/kubernetes/manifests b := bytes.Buffer{} - if err := kubeadmInitTemplate.Execute(&b, struct{KubeadmConfigFile, Token string}{ constants.KubeadmConfigFile, k8s.BootstrapToken }); err != nil { + if err := kubeadmInitTemplate.Execute(&b, struct{ KubeadmConfigFile, Token string }{constants.KubeadmConfigFile, k8s.BootstrapToken}); err != nil { return err } @@ -136,7 +136,7 @@ func (k *KubeadmBootstrapper) JoinNode(k8s bootstrapper.KubernetesConfig) error // We use --skip-preflight-checks since we have our own custom addons // that we also stick in /etc/kubernetes/manifests b := bytes.Buffer{} - if err := kubeadmJoinTemplate.Execute(&b, struct{Token, ServerAddress string}{ k8s.BootstrapToken, fmt.Sprintf("%s:8443", k8s.NodeIP) }); err != nil { + if err := kubeadmJoinTemplate.Execute(&b, struct{ Token, ServerAddress string }{k8s.BootstrapToken, fmt.Sprintf("%s:8443", k8s.NodeIP)}); err != nil { return err } @@ -391,23 +391,26 @@ func generateConfig(k8s bootstrapper.KubernetesConfig) (string, error) { opts := struct { CertDir string ServiceCIDR string + PodsCIDR string AdvertiseAddress string APIServerPort int KubernetesVersion string EtcdDataDir string NodeName string ExtraArgs []ComponentExtraArgs - Token string + Token string }{ CertDir: util.DefaultCertPath, ServiceCIDR: util.DefaultServiceCIDR, + // TODO Make configurable + PodsCIDR: "10.244.0.0/16", AdvertiseAddress: k8s.NodeIP, APIServerPort: util.APIServerPort, KubernetesVersion: k8s.KubernetesVersion, EtcdDataDir: "/data", //TODO(r2d4): change to something else persisted NodeName: k8s.NodeName, ExtraArgs: extraComponentConfig, - Token: k8s.BootstrapToken, + Token: k8s.BootstrapToken, } b := bytes.Buffer{} diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go index d0063dbcef1b..df3036356d65 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go @@ -46,6 +46,7 @@ kubernetesVersion: v1.8.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: minikube @@ -84,6 +85,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube @@ -123,6 +125,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube @@ -148,6 +151,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube @@ -183,6 +187,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube diff --git a/pkg/minikube/bootstrapper/kubeadm/templates.go b/pkg/minikube/bootstrapper/kubeadm/templates.go index abdf058c652a..46eb295c3b77 100644 --- a/pkg/minikube/bootstrapper/kubeadm/templates.go +++ b/pkg/minikube/bootstrapper/kubeadm/templates.go @@ -33,6 +33,7 @@ kubernetesVersion: {{.KubernetesVersion}} certificatesDir: {{.CertDir}} networking: serviceSubnet: {{.ServiceCIDR}} + podSubnet: {{.PodsCIDR}} etcd: dataDir: {{.EtcdDataDir}} nodeName: {{.NodeName}} From f86f74196bca4c46e63139ab623f2fcca824031f Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 13 Jan 2018 22:47:54 -0500 Subject: [PATCH 05/42] Fix node remove command --- pkg/minikube/cluster/cluster.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/cluster/cluster.go b/pkg/minikube/cluster/cluster.go index 5f5db3217c38..b9dff45fed18 100644 --- a/pkg/minikube/cluster/cluster.go +++ b/pkg/minikube/cluster/cluster.go @@ -127,7 +127,7 @@ func DeleteHost(name string, api libmachine.API) error { } m := util.MultiError{} m.Collect(host.Driver.Remove()) - m.Collect(api.Remove(cfg.GetMachineName())) + m.Collect(api.Remove(name)) return m.ToError() } From e9862e141bd00dfb0d59101aa19899c4234b6916 Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 18 Jan 2018 17:58:30 -0500 Subject: [PATCH 06/42] Enable multi-node networking: * tell kubelet to use host-only IP (eth1) * enable CNI * hard-code flannel's podSubnet * configure hostname-override --- kube-flannel.yml | 137 ++++++++++++++++++ pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 41 ++++-- .../bootstrapper/kubeadm/kubeadm_test.go | 10 +- .../bootstrapper/kubeadm/templates.go | 8 +- pkg/minikube/bootstrapper/kubeadm/versions.go | 2 +- 5 files changed, 176 insertions(+), 22 deletions(-) create mode 100644 kube-flannel.yml diff --git a/kube-flannel.yml b/kube-flannel.yml new file mode 100644 index 000000000000..bc359d577bb6 --- /dev/null +++ b/kube-flannel.yml @@ -0,0 +1,137 @@ +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: flannel +rules: + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - apiGroups: + - "" + resources: + - nodes + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - nodes/status + verbs: + - patch +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: flannel +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: flannel +subjects: +- kind: ServiceAccount + name: flannel + namespace: kube-system +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: flannel + namespace: kube-system +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: kube-flannel-cfg + namespace: kube-system + labels: + tier: node + app: flannel +data: + cni-conf.json: | + { + "name": "cbr0", + "type": "flannel", + "delegate": { + "isDefaultGateway": true + } + } + net-conf.json: | + { + "Network": "10.244.0.0/16", + "Backend": { + "Type": "vxlan" + } + } +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: kube-flannel-ds + namespace: kube-system + labels: + tier: node + app: flannel +spec: + template: + metadata: + labels: + tier: node + app: flannel + spec: + hostNetwork: true + nodeSelector: + beta.kubernetes.io/arch: amd64 + tolerations: + - key: node-role.kubernetes.io/master + operator: Exists + effect: NoSchedule + serviceAccountName: flannel + initContainers: + - name: install-cni + image: quay.io/coreos/flannel:v0.9.1-amd64 + command: + - cp + args: + - -f + - /etc/kube-flannel/cni-conf.json + - /etc/cni/net.d/10-flannel.conf + volumeMounts: + - name: cni + mountPath: /etc/cni/net.d + - name: flannel-cfg + mountPath: /etc/kube-flannel/ + containers: + - name: kube-flannel + image: quay.io/coreos/flannel:v0.9.1-amd64 + command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface", "eth1" ] + securityContext: + privileged: true + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumeMounts: + - name: run + mountPath: /run + - name: flannel-cfg + mountPath: /etc/kube-flannel/ + volumes: + - name: run + hostPath: + path: /run + - name: cni + hostPath: + path: /etc/cni/net.d + - name: flannel-cfg + configMap: + name: kube-flannel-cfg diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index da425e554167..733017870733 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -34,6 +34,7 @@ import ( "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/config" + "github.com/docker/machine/libmachine/host" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/machine" "k8s.io/minikube/pkg/minikube/sshutil" @@ -41,6 +42,7 @@ import ( ) type KubeadmBootstrapper struct { + host *host.Host c bootstrapper.CommandRunner } @@ -65,6 +67,7 @@ func NewKubeadmBootstrapperForMachine(machineName string, api libmachine.API) (* cmd = bootstrapper.NewSSHRunner(client) } return &KubeadmBootstrapper{ + host: h, c: cmd, }, nil } @@ -145,6 +148,15 @@ func (k *KubeadmBootstrapper) JoinNode(k8s bootstrapper.KubernetesConfig) error return errors.Wrapf(err, "kubeadm init error running command: %s", b.String()) } + err = k.c.Run(` +sudo systemctl daemon-reload && +sudo systemctl enable kubelet && +sudo systemctl start kubelet +`) + if err != nil { + return errors.Wrap(err, "starting kubelet") + } + return nil } @@ -230,7 +242,7 @@ func SetContainerRuntime(cfg map[string]string, runtime string) map[string]strin // NewKubeletConfig generates a new systemd unit containing a configured kubelet // based on the options present in the KubernetesConfig. -func NewKubeletConfig(k8s bootstrapper.KubernetesConfig) (string, error) { +func NewKubeletConfig(hostname, ip string, k8s bootstrapper.KubernetesConfig) (string, error) { version, err := ParseKubernetesVersion(k8s.KubernetesVersion) if err != nil { return "", errors.Wrap(err, "parsing kubernetes version") @@ -248,10 +260,14 @@ func NewKubeletConfig(k8s bootstrapper.KubernetesConfig) (string, error) { ExtraOptions string FeatureGates string ContainerRuntime string + Hostname string + NodeIP string }{ ExtraOptions: extraFlags, FeatureGates: k8s.FeatureGates, ContainerRuntime: k8s.ContainerRuntime, + Hostname: hostname, + NodeIP: ip, } if err := kubeletSystemdTemplate.Execute(&b, opts); err != nil { return "", err @@ -270,7 +286,12 @@ func (k *KubeadmBootstrapper) UpdateCluster(cfg bootstrapper.KubernetesConfig) e return errors.Wrap(err, "generating kubeadm cfg") } - kubeletCfg, err := NewKubeletConfig(cfg) + ip, err := k.host.Driver.GetIP() + if err != nil { + return errors.Wrap(err, "getting node's IP") + } + + kubeletCfg, err := NewKubeletConfig("minikube", ip, cfg) if err != nil { return errors.Wrap(err, "generating kubelet config") } @@ -326,7 +347,12 @@ sudo systemctl start kubelet } func (k *KubeadmBootstrapper) UpdateNode(cfg bootstrapper.KubernetesConfig) error { - kubeletCfg, err := NewKubeletConfig(cfg) + ip, err := k.host.Driver.GetIP() + if err != nil { + return errors.Wrap(err, "getting node's IP") + } + + kubeletCfg, err := NewKubeletConfig(k.host.Name, ip, cfg) if err != nil { return errors.Wrap(err, "generating kubelet config") } @@ -364,15 +390,6 @@ func (k *KubeadmBootstrapper) UpdateNode(cfg bootstrapper.KubernetesConfig) erro } } - err = k.c.Run(` -sudo systemctl daemon-reload && -sudo systemctl enable kubelet && -sudo systemctl start kubelet -`) - if err != nil { - return errors.Wrap(err, "starting kubelet") - } - return nil } diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go index df3036356d65..d9093009f222 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go @@ -46,7 +46,7 @@ kubernetesVersion: v1.8.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 - podSubnet: 10.244.0.0/16 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: minikube @@ -85,7 +85,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 - podSubnet: 10.244.0.0/16 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube @@ -125,7 +125,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 - podSubnet: 10.244.0.0/16 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube @@ -151,7 +151,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 - podSubnet: 10.244.0.0/16 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube @@ -187,7 +187,7 @@ kubernetesVersion: v1.8.0-alpha.0 certificatesDir: /var/lib/localkube/certs/ networking: serviceSubnet: 10.96.0.0/12 - podSubnet: 10.244.0.0/16 + podSubnet: 10.244.0.0/16 etcd: dataDir: /data nodeName: extra-args-minikube diff --git a/pkg/minikube/bootstrapper/kubeadm/templates.go b/pkg/minikube/bootstrapper/kubeadm/templates.go index 46eb295c3b77..1baae390cf64 100644 --- a/pkg/minikube/bootstrapper/kubeadm/templates.go +++ b/pkg/minikube/bootstrapper/kubeadm/templates.go @@ -22,6 +22,7 @@ import ( "text/template" ) +// TODO Make template more readable var kubeadmConfigTemplate = template.Must(template.New("kubeadmConfigTemplate").Funcs(template.FuncMap{ "printMapInOrder": printMapInOrder, }).Parse(`apiVersion: kubeadm.k8s.io/v1alpha1 @@ -38,14 +39,13 @@ etcd: dataDir: {{.EtcdDataDir}} nodeName: {{.NodeName}} {{range .ExtraArgs}}{{.Component}}:{{range $i, $val := printMapInOrder .Options ": " }} - {{$val}}{{end}}{{end}} -token: {{.Token}} -`)) + {{$val}}{{end}} +{{end}}{{if .Token}}token: {{.Token}}{{end}}`)) var kubeletSystemdTemplate = template.Must(template.New("kubeletSystemdTemplate").Parse(` [Service] ExecStart= -ExecStart=/usr/bin/kubelet {{.ExtraOptions}} {{if .FeatureGates}}--feature-gates={{.FeatureGates}}{{end}} +ExecStart=/usr/bin/kubelet --node-ip={{.NodeIP}} --hostname-override={{.Hostname}} {{.ExtraOptions}} {{if .FeatureGates}}--feature-gates={{.FeatureGates}}{{end}} [Install] {{if or (eq .ContainerRuntime "cri-o") (eq .ContainerRuntime "cri")}}Wants=crio.service{{else}}Wants=docker.socket{{end}} diff --git a/pkg/minikube/bootstrapper/kubeadm/versions.go b/pkg/minikube/bootstrapper/kubeadm/versions.go index 55b740d82e0e..7c3595feeaa4 100644 --- a/pkg/minikube/bootstrapper/kubeadm/versions.go +++ b/pkg/minikube/bootstrapper/kubeadm/versions.go @@ -174,7 +174,6 @@ var versionSpecificOpts = []VersionedExtraOption{ NewUnversionedOption(Kubelet, "kubeconfig", "/etc/kubernetes/kubelet.conf"), NewUnversionedOption(Kubelet, "bootstrap-kubeconfig", "/etc/kubernetes/bootstrap-kubelet.conf"), NewUnversionedOption(Kubelet, "require-kubeconfig", "true"), - NewUnversionedOption(Kubelet, "hostname-override", "minikube"), // System pods args NewUnversionedOption(Kubelet, "pod-manifest-path", "/etc/kubernetes/manifests"), @@ -183,6 +182,7 @@ var versionSpecificOpts = []VersionedExtraOption{ // Network args NewUnversionedOption(Kubelet, "cluster-dns", "10.96.0.10"), NewUnversionedOption(Kubelet, "cluster-domain", "cluster.local"), + NewUnversionedOption(Kubelet, "network-plugin", "cni"), // Auth args NewUnversionedOption(Kubelet, "authorization-mode", "Webhook"), From 61a8dd22c6d8aa0d64f81239ded6fed050931706 Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 18 Jan 2018 18:17:58 -0500 Subject: [PATCH 07/42] Add node_name to node start cmd --- cmd/minikube/cmd/node/node.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmd/minikube/cmd/node/node.go b/cmd/minikube/cmd/node/node.go index b621e4b368cb..9cad884793b7 100644 --- a/cmd/minikube/cmd/node/node.go +++ b/cmd/minikube/cmd/node/node.go @@ -104,6 +104,13 @@ func addNode(cmd *cobra.Command, args []string) { } func startNode(cmd *cobra.Command, args []string) { + if len(args) == 0 || args[0] == "" { + glog.Error("node_name is required.") + os.Exit(1) + } + + nodeName := args[0] + clusterName := viper.GetString(cfg.MachineProfile) cfg, err := profile.LoadConfigFromFile(clusterName) @@ -122,6 +129,10 @@ func startNode(cmd *cobra.Command, args []string) { defer api.Close() for _, node := range cfg.Nodes { + if node.Name != nodeName { + continue + } + fmt.Printf("Starting node: %s\n", node.Name) machineCfg := cfg.MachineConfig From 779f4e08787fefded25f17e27a4ce13af2762d0c Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 18 Jan 2018 18:18:08 -0500 Subject: [PATCH 08/42] Add hello service and daemonset --- hello.yml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 hello.yml diff --git a/hello.yml b/hello.yml new file mode 100644 index 000000000000..37e0a8680ec2 --- /dev/null +++ b/hello.yml @@ -0,0 +1,37 @@ +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: hello + labels: + app: hello +spec: + selector: + matchLabels: + app: hello + template: + metadata: + labels: + app: hello + spec: + tolerations: + - key: node-role.kubernetes.io/master + containers: + - name: main + image: strm/helloworld-http + ports: + - containerPort: 80 + name: http + terminationGracePeriodSeconds: 1 +--- +apiVersion: v1 +kind: Service +metadata: + name: hello +spec: + selector: + app: hello + ports: + - protocol: TCP + port: 80 + targetPort: http From 917fc0bed14da8712222a6e6831e38bbdd4314ac Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 20 Jan 2018 08:17:36 -0500 Subject: [PATCH 09/42] Fix failing tests by adding machineName arg to various functions --- cmd/minikube/cmd/env.go | 2 +- pkg/minikube/cluster/cluster.go | 24 +++++++++++----------- pkg/minikube/cluster/cluster_test.go | 30 ++++++++++++++++------------ 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/cmd/minikube/cmd/env.go b/cmd/minikube/cmd/env.go index d5a0cf4ad8cc..75441836bb6a 100644 --- a/cmd/minikube/cmd/env.go +++ b/cmd/minikube/cmd/env.go @@ -146,7 +146,7 @@ func generateUsageHint(userShell string) string { func shellCfgSet(api libmachine.API) (*ShellConfig, error) { - envMap, err := cluster.GetHostDockerEnv(api) + envMap, err := cluster.GetHostDockerEnv(config.GetMachineName(), api) if err != nil { return nil, err } diff --git a/pkg/minikube/cluster/cluster.go b/pkg/minikube/cluster/cluster.go index 5dde5469fe4a..14e8f32b949f 100644 --- a/pkg/minikube/cluster/cluster.go +++ b/pkg/minikube/cluster/cluster.go @@ -104,17 +104,17 @@ func StartHost(api libmachine.API, config MachineConfig) (*host.Host, error) { } // StopHost stops the host VM. -func StopHost(api libmachine.API) error { - host, err := api.Load(cfg.GetMachineName()) +func StopHost(name string, api libmachine.API) error { + host, err := api.Load(name) if err != nil { - return errors.Wrapf(err, "Error loading host: %s", cfg.GetMachineName()) + return errors.Wrapf(err, "Error loading host: %s", name) } if err := host.Stop(); err != nil { alreadyInStateError, ok := err.(mcnerror.ErrHostAlreadyInState) if ok && alreadyInStateError.State == state.Stopped { return nil } - return errors.Wrapf(err, "Error stopping host: %s", cfg.GetMachineName()) + return errors.Wrapf(err, "Error stopping host: %s", name) } return nil } @@ -132,18 +132,18 @@ func DeleteHost(name string, api libmachine.API) error { } // GetHostStatus gets the status of the host VM. -func GetHostStatus(api libmachine.API) (string, error) { - exists, err := api.Exists(cfg.GetMachineName()) +func GetHostStatus(name string, api libmachine.API) (string, error) { + exists, err := api.Exists(name) if err != nil { - return "", errors.Wrapf(err, "Error checking that api exists for: %s", cfg.GetMachineName()) + return "", errors.Wrapf(err, "Error checking that api exists for: %s", name) } if !exists { return state.None.String(), nil } - host, err := api.Load(cfg.GetMachineName()) + host, err := api.Load(name) if err != nil { - return "", errors.Wrapf(err, "Error loading api for: %s", cfg.GetMachineName()) + return "", errors.Wrapf(err, "Error loading api for: %s", name) } s, err := host.Driver.GetState() @@ -263,8 +263,8 @@ To disable this message, run [minikube config set WantShowDriverDeprecationNotif } // GetHostDockerEnv gets the necessary docker env variables to allow the use of docker through minikube's vm -func GetHostDockerEnv(api libmachine.API) (map[string]string, error) { - host, err := CheckIfApiExistsAndLoad(api) +func GetHostDockerEnv(name string, api libmachine.API) (map[string]string, error) { + host, err := CheckIfApiExistsAndLoadByName(name, api) if err != nil { return nil, errors.Wrap(err, "Error checking that api exists and loading it") } @@ -406,7 +406,7 @@ func CreateSSHShellByName(name string, api libmachine.API, args []string) error // EnsureMinikubeRunningOrExit checks that minikube has a status available and that // that the status is `Running`, otherwise it will exit func EnsureMinikubeRunningOrExit(api libmachine.API, exitStatus int) { - s, err := GetHostStatus(api) + s, err := GetHostStatus(cfg.GetMachineName(), api) if err != nil { glog.Errorln("Error getting machine status:", err) os.Exit(1) diff --git a/pkg/minikube/cluster/cluster_test.go b/pkg/minikube/cluster/cluster_test.go index dc1382540c49..89fe3a5bd23c 100644 --- a/pkg/minikube/cluster/cluster_test.go +++ b/pkg/minikube/cluster/cluster_test.go @@ -45,7 +45,7 @@ var defaultMachineConfig = MachineConfig{ func TestCreateHost(t *testing.T) { api := tests.NewMockAPI() - exists, _ := api.Exists(config.GetMachineName()) + exists, _ := api.Exists(defaultMachineConfig.MachineName) if exists { t.Fatal("Machine already exists.") } @@ -53,12 +53,12 @@ func TestCreateHost(t *testing.T) { if err != nil { t.Fatalf("Error creating host: %v", err) } - exists, _ = api.Exists(config.GetMachineName()) + exists, _ = api.Exists(defaultMachineConfig.MachineName) if !exists { t.Fatal("Machine does not exist, but should.") } - h, err := api.Load(config.GetMachineName()) + h, err := api.Load(defaultMachineConfig.MachineName) if err != nil { t.Fatalf("Error loading machine: %v", err) } @@ -102,7 +102,7 @@ func TestStartHostExists(t *testing.T) { if err != nil { t.Fatal("Error starting host.") } - if h.Name != config.GetMachineName() { + if h.Name != defaultMachineConfig.MachineName { t.Fatalf("Machine created with incorrect name: %s", h.Name) } if s, _ := h.Driver.GetState(); s != state.Running { @@ -130,7 +130,7 @@ func TestStartStoppedHost(t *testing.T) { if err != nil { t.Fatal("Error starting host.") } - if h.Name != config.GetMachineName() { + if h.Name != defaultMachineConfig.MachineName { t.Fatalf("Machine created with incorrect name: %s", h.Name) } @@ -157,7 +157,7 @@ func TestStartHost(t *testing.T) { if err != nil { t.Fatal("Error starting host.") } - if h.Name != config.GetMachineName() { + if h.Name != defaultMachineConfig.MachineName { t.Fatalf("Machine created with incorrect name: %s", h.Name) } if exists, _ := api.Exists(h.Name); !exists { @@ -208,7 +208,7 @@ func TestStartHostConfig(t *testing.T) { func TestStopHostError(t *testing.T) { api := tests.NewMockAPI() - if err := StopHost(api); err == nil { + if err := StopHost(defaultMachineConfig.MachineName, api); err == nil { t.Fatal("An error should be thrown when stopping non-existing machine.") } } @@ -216,9 +216,13 @@ func TestStopHostError(t *testing.T) { func TestStopHost(t *testing.T) { api := tests.NewMockAPI() h, _ := createHost(api, defaultMachineConfig) - if err := StopHost(api); err != nil { + if err := StopHost("some-other-machine", api); err == nil { t.Fatal("An error should be thrown when stopping non-existing machine.") } + if err := StopHost(defaultMachineConfig.MachineName, api); err != nil { + t.Fatal("An error should not be thrown when stopping existing machine.") + } + if s, _ := h.Driver.GetState(); s != state.Stopped { t.Fatalf("Machine not stopped. Currently in state: %s", s) } @@ -271,7 +275,7 @@ func TestDeleteHostMultipleErrors(t *testing.T) { t.Fatal("Expected error deleting host, didn't get one.") } - expectedErrors := []string{"Error removing " + config.GetMachineName(), "Error deleting machine"} + expectedErrors := []string{"Error removing " + defaultMachineConfig.MachineName, "Error deleting machine"} for _, expectedError := range expectedErrors { if !strings.Contains(err.Error(), expectedError) { t.Fatalf("Error %s expected to contain: %s.", err, expectedError) @@ -283,7 +287,7 @@ func TestGetHostStatus(t *testing.T) { api := tests.NewMockAPI() checkState := func(expected string) { - s, err := GetHostStatus(api) + s, err := GetHostStatus(defaultMachineConfig.MachineName, api) if err != nil { t.Fatalf("Unexpected error getting status: %s", err) } @@ -297,7 +301,7 @@ func TestGetHostStatus(t *testing.T) { createHost(api, defaultMachineConfig) checkState(state.Running.String()) - StopHost(api) + StopHost(defaultMachineConfig.MachineName, api) checkState(state.Stopped.String()) } @@ -317,7 +321,7 @@ func TestGetHostDockerEnv(t *testing.T) { } h.Driver = d - envMap, err := GetHostDockerEnv(api) + envMap, err := GetHostDockerEnv(defaultMachineConfig.MachineName, api) if err != nil { t.Fatalf("Unexpected error getting env: %s", err) } @@ -350,7 +354,7 @@ func TestGetHostDockerEnvIPv6(t *testing.T) { } h.Driver = d - envMap, err := GetHostDockerEnv(api) + envMap, err := GetHostDockerEnv(defaultMachineConfig.MachineName, api) if err != nil { t.Fatalf("Unexpected error getting env: %s", err) } From 4bec3ccdefb2a22566ca60c77510972daedbc6f4 Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 17:59:26 -0500 Subject: [PATCH 10/42] Add notes --- multi-node.md | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/multi-node.md b/multi-node.md index c87ca7678ab2..b157f99dca55 100644 --- a/multi-node.md +++ b/multi-node.md @@ -1,11 +1,22 @@ -TODO: +## Current setup and limitations + +* tested only with virtualbox +* pods can communicate across nodes +* nodes get non-overlapping subnets for pod IPs +* CNI is deployed manually, out-of-band +* hard-coded pod subnets in CNI config (set up for `flannel`) +* some components are explicitly told to use `eth1` +* code is hacked-in, minimal refactoring done + + +## TODO: * Parameterize machine name * Start worker nodes * Configure worker nodes -# Usage +## Usage ## Add node @@ -17,4 +28,21 @@ minikube node add [--cluster=default] --name=[] minikube node start ``` -``` +### Cluster + +* create +* delete +* add node + +### Node + +* create +* delete +* start +* stop + +### Bootstrapper + +* configure +* start +* restart From 824b0c92d81190d794dcfcaba79dc4d4215af4a5 Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 17:59:54 -0500 Subject: [PATCH 11/42] Move node commands to individual files --- cmd/minikube/cmd/node/add.go | 43 +++++ cmd/minikube/cmd/node/list.go | 36 +++++ cmd/minikube/cmd/node/node.go | 278 +++----------------------------- cmd/minikube/cmd/node/remove.go | 68 ++++++++ cmd/minikube/cmd/node/ssh.go | 56 +++++++ cmd/minikube/cmd/node/start.go | 98 +++++++++++ 6 files changed, 323 insertions(+), 256 deletions(-) create mode 100644 cmd/minikube/cmd/node/add.go create mode 100644 cmd/minikube/cmd/node/list.go create mode 100644 cmd/minikube/cmd/node/remove.go create mode 100644 cmd/minikube/cmd/node/ssh.go create mode 100644 cmd/minikube/cmd/node/start.go diff --git a/cmd/minikube/cmd/node/add.go b/cmd/minikube/cmd/node/add.go new file mode 100644 index 000000000000..f780ae714427 --- /dev/null +++ b/cmd/minikube/cmd/node/add.go @@ -0,0 +1,43 @@ +package node + +import ( + "fmt" + "math/rand" + "os" + "time" + + "github.com/golang/glog" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "k8s.io/minikube/cmd/minikube/profile" + cmdutil "k8s.io/minikube/cmd/util" + "k8s.io/minikube/pkg/minikube" + cfg "k8s.io/minikube/pkg/minikube/config" +) + +func add(cmd *cobra.Command, args []string) { + // TODO Make clusterName into `--cluster=` flag + clusterName := viper.GetString(cfg.MachineProfile) + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + s := rand.New(rand.NewSource(time.Now().UTC().UnixNano())) + + node := minikube.NodeConfig{ + Name: fmt.Sprintf("node-%d", s.Uint32()), + } + + cfg.Nodes = append(cfg.Nodes, node) + + if err := profile.SaveConfig(clusterName, cfg); err != nil { + glog.Errorln("Error saving profile cluster configuration: ", err) + os.Exit(1) + } + + fmt.Println("Added node: ", node.Name) +} diff --git a/cmd/minikube/cmd/node/list.go b/cmd/minikube/cmd/node/list.go new file mode 100644 index 000000000000..e51f7bb4da06 --- /dev/null +++ b/cmd/minikube/cmd/node/list.go @@ -0,0 +1,36 @@ +package node + +import ( + "os" + "text/template" + + "github.com/golang/glog" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "k8s.io/minikube/cmd/minikube/profile" + cmdutil "k8s.io/minikube/cmd/util" + cfg "k8s.io/minikube/pkg/minikube/config" +) + +func list(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil && !os.IsNotExist(err) { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + tmpl, err := template.New("nodeeList").Parse("{{range .}}{{ .Name }}\n{{end}}") + if err != nil { + glog.Errorln("Error creating nodeList template:", err) + os.Exit(internalErrorCode) + } + + err = tmpl.Execute(os.Stdout, cfg.Nodes) + if err != nil { + glog.Errorln("Error executing nodeList template:", err) + os.Exit(internalErrorCode) + } +} diff --git a/cmd/minikube/cmd/node/node.go b/cmd/minikube/cmd/node/node.go index 9cad884793b7..16fb26765b1f 100644 --- a/cmd/minikube/cmd/node/node.go +++ b/cmd/minikube/cmd/node/node.go @@ -2,22 +2,13 @@ package node import ( "fmt" - "math/rand" "os" - "text/template" - "time" - "github.com/golang/glog" "github.com/pkg/errors" "github.com/spf13/cobra" - "github.com/spf13/viper" "k8s.io/minikube/cmd/minikube/profile" - cmdutil "k8s.io/minikube/cmd/util" - "k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm" - "k8s.io/minikube/pkg/minikube/cluster" - cfg "k8s.io/minikube/pkg/minikube/config" - "k8s.io/minikube/pkg/minikube/machine" + "k8s.io/minikube/pkg/minikube" ) const internalErrorCode = -1 @@ -35,271 +26,46 @@ func init() { cmd.Help() }, } - - addCmd := &cobra.Command{ + NodeCmd.AddCommand(&cobra.Command{ Use: "add [flags]", Short: "Adds a node to the cluster", Long: "Adds a node tot the cluster", - Run: addNode, - } - NodeCmd.AddCommand(addCmd) - - startCmd := &cobra.Command{ - Use: "start", - Short: "Starts all nodes", - Long: "Starts all nodes", - Run: startNode, - } - NodeCmd.AddCommand(startCmd) - - listCmd := &cobra.Command{ + Run: add, + }) + NodeCmd.AddCommand(&cobra.Command{ Use: "list", Short: "Lists all nodes", Long: "Lists all nodes", - Run: listNodes, - } - NodeCmd.AddCommand(listCmd) - - removeCmd := &cobra.Command{ + Run: list, + }) + NodeCmd.AddCommand(&cobra.Command{ Use: "remove ", Short: "Removes a node from the cluster", Long: "Removes a node from the cluster", - Run: removeNode, - } - NodeCmd.AddCommand(removeCmd) - - sshCmd := &cobra.Command{ + Run: remove, + }) + NodeCmd.AddCommand(&cobra.Command{ Use: "ssh", Short: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'", Long: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.", Run: ssh, - } - NodeCmd.AddCommand(sshCmd) -} - -func addNode(cmd *cobra.Command, args []string) { - // TODO Make clusterName into `--cluster=` flag - clusterName := viper.GetString(cfg.MachineProfile) - - cfg, err := profile.LoadConfigFromFile(clusterName) - if err != nil { - glog.Errorln("Error loading profile config: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - s := rand.New(rand.NewSource(time.Now().UTC().UnixNano())) - - node := cluster.Node{ - Name: fmt.Sprintf("node-%d", s.Uint32()), - } - - cfg.Nodes = append(cfg.Nodes, node) - - if err := profile.SaveConfig(clusterName, cfg); err != nil { - glog.Errorln("Error saving profile cluster configuration: ", err) - os.Exit(1) - } - - fmt.Println("Added node: ", node.Name) -} - -func startNode(cmd *cobra.Command, args []string) { - if len(args) == 0 || args[0] == "" { - glog.Error("node_name is required.") - os.Exit(1) - } - - nodeName := args[0] - - clusterName := viper.GetString(cfg.MachineProfile) - - cfg, err := profile.LoadConfigFromFile(clusterName) - if err != nil { - glog.Errorln("Error loading profile config: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - fmt.Println("Starting nodes...") - - api, err := machine.NewAPIClient() - if err != nil { - glog.Errorf("Error getting client: %s\n", err) - os.Exit(1) - } - defer api.Close() - - for _, node := range cfg.Nodes { - if node.Name != nodeName { - continue - } - - fmt.Printf("Starting node: %s\n", node.Name) - - machineCfg := cfg.MachineConfig - machineCfg.MachineName = getMachineName(clusterName, node) - - host, err := cluster.StartHost(api, machineCfg) - if err != nil { - glog.Errorln("Error starting node machine: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - k8sBootstrapper, err := kubeadm.NewKubeadmBootstrapperForMachine(machineCfg.MachineName, api) - if err != nil { - glog.Errorln("Error getting kubeadm bootstrapper: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - fmt.Println("Moving assets into node...") - if err := k8sBootstrapper.UpdateNode(cfg.KubernetesConfig); err != nil { - glog.Errorln("Error updating node: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - fmt.Println("Setting up certs...") - if err := k8sBootstrapper.SetupCerts(cfg.KubernetesConfig); err != nil { - glog.Errorln("Error configuring authentication: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - fmt.Println("Joining node to cluster...") - if err := k8sBootstrapper.JoinNode(cfg.KubernetesConfig); err != nil { - glog.Errorln("Error joining node to cluster: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - ip, err := host.Driver.GetIP() - if err != nil { - glog.Errorln("Error getting machine IP: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - fmt.Printf("Node started. IP: %s\n", ip) - } -} - -func removeNode(cmd *cobra.Command, args []string) { - clusterName := viper.GetString(cfg.MachineProfile) - - if len(args) == 0 || args[0] == "" { - glog.Error("node_name is required.") - os.Exit(1) - } - - nodeName := args[0] - - cfg, err := profile.LoadConfigFromFile(clusterName) - if err != nil && !os.IsNotExist(err) { - glog.Errorln("Error loading profile config: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - api, err := machine.NewAPIClient() - if err != nil { - glog.Errorf("Error getting client: %s\n", err) - os.Exit(1) - } - defer api.Close() - - for i, node := range cfg.Nodes { - if node.Name == nodeName { - machineName := getMachineName(clusterName, node) - exists, err := api.Exists(machineName) - if err != nil { - glog.Errorln("Error removing node: ", err) - os.Exit(1) - } - - if exists { - if err := cluster.DeleteHost(machineName, api); err != nil { - glog.Errorln("Error removing node: ", err) - os.Exit(1) - } - } - - cfg.Nodes = append(cfg.Nodes[:i], cfg.Nodes[i+1:]...) - break - - } else if i == len(cfg.Nodes)-1 { - glog.Errorln("Node not found: ", nodeName) - os.Exit(1) - } - } - - if err := profile.SaveConfig(clusterName, cfg); err != nil { - glog.Errorln("Error saving profile cluster configuration: ", err) - os.Exit(1) - } + }) + NodeCmd.AddCommand(&cobra.Command{ + Use: "start", + Short: "Starts all nodes", + Long: "Starts all nodes", + Run: startNode, + }) } -func getMachineName(clusterName string, node cluster.Node) string { +func getMachineName(clusterName string, node minikube.NodeConfig) string { return fmt.Sprintf("%s-node-%s", clusterName, node.Name) } -func listNodes(cmd *cobra.Command, args []string) { - clusterName := viper.GetString(cfg.MachineProfile) - - cfg, err := profile.LoadConfigFromFile(clusterName) - if err != nil && !os.IsNotExist(err) { - glog.Errorln("Error loading profile config: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - tmpl, err := template.New("nodeeList").Parse("{{range .}}{{ .Name }}\n{{end}}") - if err != nil { - glog.Errorln("Error creating nodeList template:", err) - os.Exit(internalErrorCode) - } - - err = tmpl.Execute(os.Stdout, cfg.Nodes) - if err != nil { - glog.Errorln("Error executing nodeList template:", err) - os.Exit(internalErrorCode) - } -} - -func ssh(cmd *cobra.Command, args []string) { - clusterName := viper.GetString(cfg.MachineProfile) - - if len(args) == 0 || args[0] == "" { - glog.Error("node_name is required.") - os.Exit(1) - } - - nodeName := args[0] - args = args[1:] - - node, err := getNode(clusterName, nodeName) - if err != nil { - glog.Error("Error loading node: ", err) - os.Exit(1) - } - - api, err := machine.NewAPIClient() - if err != nil { - fmt.Fprintf(os.Stderr, "Error getting client: %s\n", err) - os.Exit(1) - } - defer api.Close() - - machineName := getMachineName(clusterName, node) - host, err := cluster.CheckIfApiExistsAndLoadByName(machineName, api) - if err != nil { - fmt.Fprintf(os.Stderr, "Error getting host: %s\n", err) - os.Exit(1) - } - if host.Driver.DriverName() == "none" { - fmt.Println(`'none' driver does not support 'minikube ssh' command`) - os.Exit(0) - } - err = cluster.CreateSSHShellByName(machineName, api, args) - if err != nil { - glog.Errorln(errors.Wrap(err, "Error attempting to ssh/run-ssh-command")) - os.Exit(1) - } -} - -func getNode(clusterName, nodeName string) (cluster.Node, error) { +func getNode(clusterName, nodeName string) (minikube.NodeConfig, error) { cfg, err := profile.LoadConfigFromFile(clusterName) if err != nil && !os.IsNotExist(err) { - return cluster.Node{}, errors.Errorf("Error loading profile config: %s", err) + return minikube.NodeConfig{}, errors.Errorf("Error loading profile config: %s", err) } for _, node := range cfg.Nodes { @@ -308,5 +74,5 @@ func getNode(clusterName, nodeName string) (cluster.Node, error) { } } - return cluster.Node{}, errors.Errorf("Node not found in cluster. cluster: %s node: %s", clusterName, nodeName) + return minikube.NodeConfig{}, errors.Errorf("Node not found in cluster. cluster: %s node: %s", clusterName, nodeName) } diff --git a/cmd/minikube/cmd/node/remove.go b/cmd/minikube/cmd/node/remove.go new file mode 100644 index 000000000000..ed037e108aab --- /dev/null +++ b/cmd/minikube/cmd/node/remove.go @@ -0,0 +1,68 @@ +package node + +import ( + "os" + + "github.com/golang/glog" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "k8s.io/minikube/cmd/minikube/profile" + cmdutil "k8s.io/minikube/cmd/util" + "k8s.io/minikube/pkg/minikube/cluster" + cfg "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/machine" +) + +func remove(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + if len(args) == 0 || args[0] == "" { + glog.Error("node_name is required.") + os.Exit(1) + } + + nodeName := args[0] + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil && !os.IsNotExist(err) { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + api, err := machine.NewAPIClient() + if err != nil { + glog.Errorf("Error getting client: %s\n", err) + os.Exit(1) + } + defer api.Close() + + for i, node := range cfg.Nodes { + if node.Name == nodeName { + machineName := getMachineName(clusterName, node) + exists, err := api.Exists(machineName) + if err != nil { + glog.Errorln("Error removing node: ", err) + os.Exit(1) + } + + if exists { + if err := cluster.DeleteHost(machineName, api); err != nil { + glog.Errorln("Error removing node: ", err) + os.Exit(1) + } + } + + cfg.Nodes = append(cfg.Nodes[:i], cfg.Nodes[i+1:]...) + break + + } else if i == len(cfg.Nodes)-1 { + glog.Errorln("Node not found: ", nodeName) + os.Exit(1) + } + } + + if err := profile.SaveConfig(clusterName, cfg); err != nil { + glog.Errorln("Error saving profile cluster configuration: ", err) + os.Exit(1) + } +} diff --git a/cmd/minikube/cmd/node/ssh.go b/cmd/minikube/cmd/node/ssh.go new file mode 100644 index 000000000000..18556338ada4 --- /dev/null +++ b/cmd/minikube/cmd/node/ssh.go @@ -0,0 +1,56 @@ +package node + +import ( + "fmt" + "os" + + "github.com/golang/glog" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "k8s.io/minikube/pkg/minikube/cluster" + cfg "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/machine" +) + +func ssh(cmd *cobra.Command, args []string) { + clusterName := viper.GetString(cfg.MachineProfile) + + if len(args) == 0 || args[0] == "" { + glog.Error("node_name is required.") + os.Exit(1) + } + + nodeName := args[0] + args = args[1:] + + node, err := getNode(clusterName, nodeName) + if err != nil { + glog.Error("Error loading node: ", err) + os.Exit(1) + } + + api, err := machine.NewAPIClient() + if err != nil { + fmt.Fprintf(os.Stderr, "Error getting client: %s\n", err) + os.Exit(1) + } + defer api.Close() + + machineName := getMachineName(clusterName, node) + host, err := cluster.CheckIfApiExistsAndLoadByName(machineName, api) + if err != nil { + fmt.Fprintf(os.Stderr, "Error getting host: %s\n", err) + os.Exit(1) + } + if host.Driver.DriverName() == "none" { + fmt.Println(`'none' driver does not support 'minikube ssh' command`) + os.Exit(0) + } + err = cluster.CreateSSHShellByName(machineName, api, args) + if err != nil { + glog.Errorln(errors.Wrap(err, "Error attempting to ssh/run-ssh-command")) + os.Exit(1) + } +} diff --git a/cmd/minikube/cmd/node/start.go b/cmd/minikube/cmd/node/start.go new file mode 100644 index 000000000000..eaf54dcc9485 --- /dev/null +++ b/cmd/minikube/cmd/node/start.go @@ -0,0 +1,98 @@ +package node + +import ( + "fmt" + "os" + + "github.com/golang/glog" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "k8s.io/minikube/cmd/minikube/profile" + cmdutil "k8s.io/minikube/cmd/util" + "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm" + cfg "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/machine" + "k8s.io/minikube/pkg/minikube/node" +) + +func startNode(cmd *cobra.Command, args []string) { + if len(args) == 0 || args[0] == "" { + glog.Error("node_name is required.") + os.Exit(1) + } + + nodeName := args[0] + clusterName := viper.GetString(cfg.MachineProfile) + + cfg, err := profile.LoadConfigFromFile(clusterName) + if err != nil { + glog.Errorln("Error loading profile config: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + fmt.Println("Starting nodes...") + + api, err := machine.NewAPIClient() + if err != nil { + glog.Errorf("Error getting client: %s\n", err) + os.Exit(1) + } + defer api.Close() + + for _, nodeCfg := range cfg.Nodes { + name := nodeCfg.Name + if name != nodeName { + continue + } + + fmt.Printf("Starting node: %s\n", name) + + n := node.NewNode(nodeCfg, cfg.MachineConfig, clusterName, api) + + if err := n.Start(); err != nil { + glog.Errorln("Error starting node machine: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + ip, err := n.IP() + if err != nil { + glog.Errorln("Error getting node's IP: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + runner, err := n.Runner() + if err != nil { + glog.Errorln("Error getting node's runner: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + b := kubeadm.NewKubeadmBootstrapperForRunner(n.MachineName(), ip, runner) + err = bootstrapNode(b, cfg.KubernetesConfig) + if err != nil { + glog.Errorln("Error bootstrapping node: ", err) + cmdutil.MaybeReportErrorAndExit(err) + } + + fmt.Printf("Node started. IP: %s\n", ip) + } +} + +func bootstrapNode(b *kubeadm.KubeadmBootstrapper, cfg bootstrapper.KubernetesConfig) error { + fmt.Println("Moving assets into node...") + if err := b.UpdateNode(cfg); err != nil { + return errors.Wrap(err, "Error updating node") + } + fmt.Println("Setting up certs...") + if err := b.SetupCerts(cfg); err != nil { + return errors.Wrap(err, "Error configuring authentication") + } + + fmt.Println("Joining node to cluster...") + if err := b.JoinNode(cfg); err != nil { + return errors.Wrap(err, "Error joining node to cluster") + } + return nil +} From f4de0149ca86f08220e2a852eb89f1585087a19e Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 18:00:10 -0500 Subject: [PATCH 12/42] Create base types --- pkg/minikube/types.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 pkg/minikube/types.go diff --git a/pkg/minikube/types.go b/pkg/minikube/types.go new file mode 100644 index 000000000000..89d031c03ad5 --- /dev/null +++ b/pkg/minikube/types.go @@ -0,0 +1,27 @@ +package minikube + +import ( + "k8s.io/minikube/pkg/minikube/bootstrapper" +) + +const ( + StatusStopped = "Stopped" + StatusRunning = "Running" + StatusNotCreated = "NotCreated" +) + +type NodeStatus string + +type NodeConfig struct { + Name string +} + +type Node interface { + Config() NodeConfig + Start() error + Stop() error + Status() (NodeStatus, error) + Runner() (bootstrapper.CommandRunner, error) + MachineName() string + IP() (string, error) +} From aed7c84da9d7ea7b2b83809758293af61521728b Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 18:01:00 -0500 Subject: [PATCH 13/42] Refactor functions to include machine name --- cmd/minikube/cmd/status.go | 2 +- cmd/minikube/cmd/stop.go | 4 +++- pkg/minikube/cluster/cluster.go | 8 ++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/minikube/cmd/status.go b/cmd/minikube/cmd/status.go index 6c74d7031e4a..0d020843384e 100755 --- a/cmd/minikube/cmd/status.go +++ b/cmd/minikube/cmd/status.go @@ -66,7 +66,7 @@ var statusCmd = &cobra.Command{ } defer api.Close() - ms, err := cluster.GetHostStatus(api) + ms, err := cluster.GetHostStatus(config.GetMachineName(), api) if err != nil { glog.Errorln("Error getting machine status:", err) cmdUtil.MaybeReportErrorAndExitWithCode(err, internalErrorCode) diff --git a/cmd/minikube/cmd/stop.go b/cmd/minikube/cmd/stop.go index 416e98259db6..8a2e89d20e50 100644 --- a/cmd/minikube/cmd/stop.go +++ b/cmd/minikube/cmd/stop.go @@ -23,7 +23,9 @@ import ( "github.com/spf13/cobra" cmdUtil "k8s.io/minikube/cmd/util" "k8s.io/minikube/pkg/minikube/cluster" + "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/machine" + ) // stopCmd represents the stop command @@ -41,7 +43,7 @@ itself, leaving all files intact. The cluster can be started again with the "sta } defer api.Close() - if err = cluster.StopHost(api); err != nil { + if err = cluster.StopHost(config.GetMachineName(), api); err != nil { fmt.Println("Error stopping machine: ", err) cmdUtil.MaybeReportErrorAndExit(err) } diff --git a/pkg/minikube/cluster/cluster.go b/pkg/minikube/cluster/cluster.go index 14e8f32b949f..406cb2c7fc10 100644 --- a/pkg/minikube/cluster/cluster.go +++ b/pkg/minikube/cluster/cluster.go @@ -153,9 +153,13 @@ func GetHostStatus(name string, api libmachine.API) (string, error) { return s.String(), nil } -// GetHostDriverIP gets the ip address of the current minikube cluster func GetHostDriverIP(api libmachine.API) (net.IP, error) { - host, err := CheckIfApiExistsAndLoad(api) + return GetHostDriverIpByName(cfg.GetMachineName(), api) +} + +// GetHostDriverIP gets the ip address of the current minikube cluster +func GetHostDriverIpByName(name string, api libmachine.API) (net.IP, error) { + host, err := CheckIfApiExistsAndLoadByName(name, api) if err != nil { return nil, err } From 834ffcce24699d016a8cbfb3eb4ae4490cf1b3d0 Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 18:01:56 -0500 Subject: [PATCH 14/42] Refactor kubeadm bootstrapper to not need libmachine.API --- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 59 +++++++++++--------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index 733017870733..a10370b37f5f 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -34,7 +34,6 @@ import ( "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/config" - "github.com/docker/machine/libmachine/host" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/machine" "k8s.io/minikube/pkg/minikube/sshutil" @@ -42,8 +41,9 @@ import ( ) type KubeadmBootstrapper struct { - host *host.Host - c bootstrapper.CommandRunner + c bootstrapper.CommandRunner + ip string + machineName string } func NewKubeadmBootstrapper(api libmachine.API) (*KubeadmBootstrapper, error) { @@ -66,12 +66,27 @@ func NewKubeadmBootstrapperForMachine(machineName string, api libmachine.API) (* } cmd = bootstrapper.NewSSHRunner(client) } + + ip, err := h.Driver.GetIP() + if err != nil { + return nil, errors.Wrap(err, "getting host IP") + } + return &KubeadmBootstrapper{ - host: h, - c: cmd, + c: cmd, + ip: ip, + machineName: machineName, }, nil } +func NewKubeadmBootstrapperForRunner(machineName, ip string, c bootstrapper.CommandRunner) *KubeadmBootstrapper { + return &KubeadmBootstrapper{ + c: c, + ip: ip, + machineName: machineName, + } +} + //TODO(r2d4): This should most likely check the health of the apiserver func (k *KubeadmBootstrapper) GetClusterStatus() (string, error) { statusCmd := `sudo systemctl is-active kubelet &>/dev/null && echo "Running" || echo "Stopped"` @@ -148,14 +163,14 @@ func (k *KubeadmBootstrapper) JoinNode(k8s bootstrapper.KubernetesConfig) error return errors.Wrapf(err, "kubeadm init error running command: %s", b.String()) } - err = k.c.Run(` + err = k.c.Run(` sudo systemctl daemon-reload && sudo systemctl enable kubelet && sudo systemctl start kubelet `) - if err != nil { - return errors.Wrap(err, "starting kubelet") - } + if err != nil { + return errors.Wrap(err, "starting kubelet") + } return nil } @@ -279,19 +294,18 @@ func NewKubeletConfig(hostname, ip string, k8s bootstrapper.KubernetesConfig) (s func (k *KubeadmBootstrapper) UpdateCluster(cfg bootstrapper.KubernetesConfig) error { if cfg.ShouldLoadCachedImages { // Make best effort to load any cached images - go machine.LoadImages(k.c, constants.GetKubeadmCachedImages(cfg.KubernetesVersion), constants.ImageCacheDir) + glog.Infoln("Loading cached images....") + err := machine.LoadImages(k.c, constants.GetKubeadmCachedImages(cfg.KubernetesVersion), constants.ImageCacheDir) + if err != nil { + glog.Errorf("Could not load all cached images: ", err) + } } kubeadmCfg, err := generateConfig(cfg) if err != nil { return errors.Wrap(err, "generating kubeadm cfg") } - ip, err := k.host.Driver.GetIP() - if err != nil { - return errors.Wrap(err, "getting node's IP") - } - - kubeletCfg, err := NewKubeletConfig("minikube", ip, cfg) + kubeletCfg, err := NewKubeletConfig("minikube", k.ip, cfg) if err != nil { return errors.Wrap(err, "generating kubelet config") } @@ -347,12 +361,7 @@ sudo systemctl start kubelet } func (k *KubeadmBootstrapper) UpdateNode(cfg bootstrapper.KubernetesConfig) error { - ip, err := k.host.Driver.GetIP() - if err != nil { - return errors.Wrap(err, "getting node's IP") - } - - kubeletCfg, err := NewKubeletConfig(k.host.Name, ip, cfg) + kubeletCfg, err := NewKubeletConfig(k.machineName, k.ip, cfg) if err != nil { return errors.Wrap(err, "generating kubelet config") } @@ -417,10 +426,10 @@ func generateConfig(k8s bootstrapper.KubernetesConfig) (string, error) { ExtraArgs []ComponentExtraArgs Token string }{ - CertDir: util.DefaultCertPath, - ServiceCIDR: util.DefaultServiceCIDR, + CertDir: util.DefaultCertPath, + ServiceCIDR: util.DefaultServiceCIDR, // TODO Make configurable - PodsCIDR: "10.244.0.0/16", + PodsCIDR: "10.244.0.0/16", AdvertiseAddress: k8s.NodeIP, APIServerPort: util.APIServerPort, KubernetesVersion: k8s.KubernetesVersion, From 274adb6b6c1d72676123860c1c40e16962894112 Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 18:02:47 -0500 Subject: [PATCH 15/42] Refactor cluster.Config struct --- pkg/minikube/cluster/types.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/minikube/cluster/types.go b/pkg/minikube/cluster/types.go index f5079526eac1..555ba8e88572 100644 --- a/pkg/minikube/cluster/types.go +++ b/pkg/minikube/cluster/types.go @@ -17,6 +17,7 @@ limitations under the License. package cluster import ( + "k8s.io/minikube/pkg/minikube" "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/util" ) @@ -46,11 +47,10 @@ type MachineConfig struct { // Config contains machine and k8s config type Config struct { + ClusterName string MachineConfig MachineConfig KubernetesConfig bootstrapper.KubernetesConfig - Nodes []Node + Nodes []minikube.NodeConfig } -type Node struct { - Name string } From 540cef4e8e2435c61818e85085cb5c55b061aa4b Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 18:02:55 -0500 Subject: [PATCH 16/42] Add image loading log message --- pkg/minikube/machine/cache_images.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go index dcf4ec447e0d..028e22b8d990 100644 --- a/pkg/minikube/machine/cache_images.go +++ b/pkg/minikube/machine/cache_images.go @@ -82,6 +82,7 @@ func CacheImages(images []string, cacheDir string) error { func LoadImages(cmd bootstrapper.CommandRunner, images []string, cacheDir string) error { var g errgroup.Group + glog.Infof("Loading cached images: %s", images) for _, image := range images { image := image g.Go(func() error { From 7bb4707e9205d257c79222bb6957cfcc10f599cc Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 18:03:07 -0500 Subject: [PATCH 17/42] Add Node implementation --- pkg/minikube/node/node.go | 134 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 pkg/minikube/node/node.go diff --git a/pkg/minikube/node/node.go b/pkg/minikube/node/node.go new file mode 100644 index 000000000000..ffb3add39bf4 --- /dev/null +++ b/pkg/minikube/node/node.go @@ -0,0 +1,134 @@ +package node + +import ( + "fmt" + + "github.com/docker/machine/libmachine" + "github.com/docker/machine/libmachine/state" + "github.com/pkg/errors" + "k8s.io/minikube/pkg/minikube" + "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/cluster" + "k8s.io/minikube/pkg/minikube/constants" + "k8s.io/minikube/pkg/minikube/sshutil" + "k8s.io/minikube/pkg/util" +) + +func NewNode( + config minikube.NodeConfig, + baseConfig cluster.MachineConfig, + clusterName string, + api libmachine.API, +) minikube.Node { + return &node{ + api: api, + config: config, + baseConfig: baseConfig, + clusterName: clusterName, + } +} + +type node struct { + api libmachine.API + config minikube.NodeConfig + baseConfig cluster.MachineConfig + clusterName string +} + +func (n *node) Config() minikube.NodeConfig { + return n.config +} + +func (n *node) IP() (string, error) { + host, err := cluster.CheckIfApiExistsAndLoadByName(n.MachineName(), n.api) + if err != nil { + return "", err + } + + ip, err := host.Driver.GetIP() + return ip, errors.Wrap(err, "Error getting IP") +} + +func (n *node) MachineName() string { + return fmt.Sprintf("%s-node-%s", n.clusterName, n.config.Name) +} + +func (n *node) Start() error { + _, err := cluster.StartHost(n.api, n.machineConfig()) + if err != nil { + return err + } + return nil +} + +func (n *node) Stop() error { + return fmt.Errorf("Not implemented yet") +} + +func (n *node) Status() (minikube.NodeStatus, error) { + s, err := n.status() + return s, errors.Wrap(err, "Error getting node status.") +} + +func (n *node) Runner() (bootstrapper.CommandRunner, error) { + h, err := n.api.Load(n.MachineName()) + if err != nil { + return nil, errors.Wrap(err, "Error loading host") + } + + // The none driver executes commands directly on the host + if h.Driver.DriverName() == constants.DriverNone { + return &bootstrapper.ExecRunner{}, nil + } + client, err := sshutil.NewSSHClient(h.Driver) + if err != nil { + return nil, errors.Wrap(err, "getting ssh client") + } + return bootstrapper.NewSSHRunner(client), nil +} + +func (n *node) machineConfig() cluster.MachineConfig { + cfg := n.baseConfig + cfg.Downloader = util.DefaultDownloader{} + cfg.MachineName = n.MachineName() + return cfg +} + +func (n *node) status() (minikube.NodeStatus, error) { + if exists, err := n.api.Exists(n.MachineName()); err == nil && !exists { + return minikube.StatusNotCreated, nil + } else if err != nil { + return minikube.NodeStatus(""), err + } + + host, err := n.api.Load(n.MachineName()) + if err != nil { + return minikube.NodeStatus(""), err + } + + s, err := host.Driver.GetState() + if err != nil { + return minikube.NodeStatus(""), err + } + + switch s { + case state.Running: + return minikube.StatusRunning, nil + case state.Starting: + return minikube.StatusRunning, nil + case state.Stopping: + return minikube.StatusRunning, nil + case state.Stopped: + return minikube.StatusStopped, nil + case state.Paused: + return minikube.StatusStopped, nil + case state.Saved: + return minikube.StatusStopped, nil + case state.Error: + return minikube.NodeStatus(""), errors.Errorf("Error state %s from libmachine", s) + case state.Timeout: + return minikube.NodeStatus(""), errors.Errorf("Error state %s from libmachine", s) + default: + return minikube.NodeStatus(""), errors.Errorf("Unknown state %s from libmachine", s) + } +} From f6b32544e89ad25c27ff3b5c2b18d631351bb64f Mon Sep 17 00:00:00 2001 From: pbitty Date: Wed, 7 Feb 2018 22:12:56 -0500 Subject: [PATCH 18/42] typo fix --- pkg/minikube/cluster/types.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/minikube/cluster/types.go b/pkg/minikube/cluster/types.go index 555ba8e88572..f17ba9aad2d2 100644 --- a/pkg/minikube/cluster/types.go +++ b/pkg/minikube/cluster/types.go @@ -52,5 +52,3 @@ type Config struct { KubernetesConfig bootstrapper.KubernetesConfig Nodes []minikube.NodeConfig } - -} From b27c72284f9aa9976920fcdc8dc6bfd176506687 Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 8 Feb 2018 01:12:19 -0500 Subject: [PATCH 19/42] Spacing cleanup --- cmd/minikube/cmd/start.go | 51 ++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 746bb3c06662..4567b5b09a88 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -26,14 +26,14 @@ import ( "strings" "time" - "github.com/elgs/gostrgen" "github.com/blang/semver" "github.com/docker/machine/libmachine/host" + "github.com/elgs/gostrgen" "github.com/golang/glog" "github.com/spf13/cobra" "github.com/spf13/viper" - "k8s.io/minikube/cmd/minikube/profile" cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config" + "k8s.io/minikube/cmd/minikube/profile" cmdutil "k8s.io/minikube/cmd/util" "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/cluster" @@ -102,7 +102,7 @@ func runStart(cmd *cobra.Command, args []string) { go machine.CacheImagesForBootstrapper(k8sVersion, clusterBootstrapper) } - // NOTE Instantiate docker-machine API + // NOTE Instantiate docker-machine API api, err := machine.NewAPIClient() if err != nil { fmt.Fprintf(os.Stderr, "Error getting client: %s\n", err) @@ -124,7 +124,7 @@ func runStart(cmd *cobra.Command, args []string) { validateK8sVersion(k8sVersion) } - // NOTE Create machine config + // NOTE Create machine config config := cluster.MachineConfig{ MachineName: cfg.GetMachineName(), MinikubeISO: viper.GetString(isoURL), @@ -153,7 +153,7 @@ func runStart(cmd *cobra.Command, args []string) { glog.Exitf("checking if machine exists: %s", err) } - // NOTE Start machine + // NOTE Start machine fmt.Printf("Starting local Kubernetes %s cluster...\n", viper.GetString(kubernetesVersion)) fmt.Println("Starting VM...") var host *host.Host @@ -170,7 +170,7 @@ func runStart(cmd *cobra.Command, args []string) { cmdutil.MaybeReportErrorAndExit(err) } - // NOTE Get machine IP + // NOTE Get machine IP fmt.Println("Getting VM IP address...") ip, err := host.Driver.GetIP() if err != nil { @@ -180,9 +180,9 @@ func runStart(cmd *cobra.Command, args []string) { selectedKubernetesVersion := viper.GetString(kubernetesVersion) - // NOTE Load cluster cfg + // NOTE Load cluster cfg // Load profile cluster config from file - profileName := viper.GetString(cfg.MachineProfile) + profileName := viper.GetString(cfg.MachineProfile) cc, err := profile.LoadConfigFromFile(profileName) if err != nil && !os.IsNotExist(err) { glog.Errorln("Error loading profile config: ", err) @@ -205,10 +205,10 @@ func runStart(cmd *cobra.Command, args []string) { } } - token, err := genBootstrapToken() - if err != nil { - glog.Exitf("Error generating bootstrap token: ", err) - } + token, err := genBootstrapToken() + if err != nil { + glog.Exitf("Error generating bootstrap token: ", err) + } kubernetesConfig := bootstrapper.KubernetesConfig{ KubernetesVersion: selectedKubernetesVersion, @@ -222,10 +222,10 @@ func runStart(cmd *cobra.Command, args []string) { ServiceCIDR: pkgutil.DefaultServiceCIDR, ExtraOptions: extraOptions, ShouldLoadCachedImages: shouldCacheImages, - BootstrapToken: token, + BootstrapToken: token, } - // NOTE Get bootstrapper + // NOTE Get bootstrapper k8sBootstrapper, err := GetClusterBootstrapper(api, clusterBootstrapper) if err != nil { glog.Exitf("Error getting cluster bootstrapper: %s", err) @@ -233,6 +233,7 @@ func runStart(cmd *cobra.Command, args []string) { // Write profile cluster configuration to file clusterConfig := cluster.Config{ + ClusterName: profileName, MachineConfig: config, KubernetesConfig: kubernetesConfig, } @@ -241,7 +242,7 @@ func runStart(cmd *cobra.Command, args []string) { glog.Errorln("Error saving profile cluster configuration: ", err) } - // NOTE Configure machine + // NOTE Configure machine fmt.Println("Moving files into cluster...") if err := k8sBootstrapper.UpdateCluster(kubernetesConfig); err != nil { glog.Errorln("Error updating cluster: ", err) @@ -415,14 +416,14 @@ func init() { } func genBootstrapToken() (string, error) { - first, err := gostrgen.RandGen(6, gostrgen.Lower | gostrgen.Digit, "", "") - if err != nil { - return "", nil - } - - second, err := gostrgen.RandGen(16, gostrgen.Lower | gostrgen.Digit, "", "") - if err != nil { - return "", nil - } - return fmt.Sprintf("%s.%s", first, second), nil + first, err := gostrgen.RandGen(6, gostrgen.Lower|gostrgen.Digit, "", "") + if err != nil { + return "", nil + } + + second, err := gostrgen.RandGen(16, gostrgen.Lower|gostrgen.Digit, "", "") + if err != nil { + return "", nil + } + return fmt.Sprintf("%s.%s", first, second), nil } From 3e52108b1cc5203a9ed7382a43e1ab89ba399d69 Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 8 Feb 2018 01:13:18 -0500 Subject: [PATCH 20/42] Migrate bootstrap tasks into new bootstrapper --- cmd/minikube/cmd/node/start.go | 40 ++-------------- .../bootstrapper/kubeadm/node_bootstrapper.go | 48 +++++++++++++++++++ pkg/minikube/node/node.go | 4 ++ pkg/minikube/types.go | 1 + 4 files changed, 56 insertions(+), 37 deletions(-) create mode 100644 pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go diff --git a/cmd/minikube/cmd/node/start.go b/cmd/minikube/cmd/node/start.go index eaf54dcc9485..7161b005a522 100644 --- a/cmd/minikube/cmd/node/start.go +++ b/cmd/minikube/cmd/node/start.go @@ -5,13 +5,11 @@ import ( "os" "github.com/golang/glog" - "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/viper" "k8s.io/minikube/cmd/minikube/profile" cmdutil "k8s.io/minikube/cmd/util" - "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm" cfg "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/machine" @@ -51,48 +49,16 @@ func startNode(cmd *cobra.Command, args []string) { fmt.Printf("Starting node: %s\n", name) n := node.NewNode(nodeCfg, cfg.MachineConfig, clusterName, api) - if err := n.Start(); err != nil { glog.Errorln("Error starting node machine: ", err) cmdutil.MaybeReportErrorAndExit(err) } - ip, err := n.IP() - if err != nil { - glog.Errorln("Error getting node's IP: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - runner, err := n.Runner() - if err != nil { - glog.Errorln("Error getting node's runner: ", err) - cmdutil.MaybeReportErrorAndExit(err) - } - - b := kubeadm.NewKubeadmBootstrapperForRunner(n.MachineName(), ip, runner) - err = bootstrapNode(b, cfg.KubernetesConfig) - if err != nil { + b := kubeadm.NewNodeBootstrapper(cfg.KubernetesConfig, os.Stdout) + if err := b.Bootstrap(n); err != nil { glog.Errorln("Error bootstrapping node: ", err) cmdutil.MaybeReportErrorAndExit(err) } - - fmt.Printf("Node started. IP: %s\n", ip) - } -} - -func bootstrapNode(b *kubeadm.KubeadmBootstrapper, cfg bootstrapper.KubernetesConfig) error { - fmt.Println("Moving assets into node...") - if err := b.UpdateNode(cfg); err != nil { - return errors.Wrap(err, "Error updating node") - } - fmt.Println("Setting up certs...") - if err := b.SetupCerts(cfg); err != nil { - return errors.Wrap(err, "Error configuring authentication") - } - - fmt.Println("Joining node to cluster...") - if err := b.JoinNode(cfg); err != nil { - return errors.Wrap(err, "Error joining node to cluster") + fmt.Printf("Node %s started and configured.\n", n.Name()) } - return nil } diff --git a/pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go b/pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go new file mode 100644 index 000000000000..f767028db590 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go @@ -0,0 +1,48 @@ +package kubeadm + +import ( + "fmt" + "io" + + "github.com/pkg/errors" + "k8s.io/minikube/pkg/minikube" + "k8s.io/minikube/pkg/minikube/bootstrapper" +) + +type NodeBootstrapper struct { + config bootstrapper.KubernetesConfig + ui io.Writer +} + +func NewNodeBootstrapper(c bootstrapper.KubernetesConfig, ui io.Writer) *NodeBootstrapper { + return &NodeBootstrapper{config: c, ui: ui} +} + +func (nb *NodeBootstrapper) Bootstrap(n minikube.Node) error { + ip, err := n.IP() + if err != nil { + return errors.Wrap(err, "Error getting node's IP") + } + + runner, err := n.Runner() + if err != nil { + return errors.Wrap(err, "Error getting node's runner") + } + + b := NewKubeadmBootstrapperForRunner(n.MachineName(), ip, runner) + + fmt.Fprintln(nb.ui, "Moving assets into node...") + if err := b.UpdateNode(nb.config); err != nil { + return errors.Wrap(err, "Error updating node") + } + fmt.Fprintln(nb.ui, "Setting up certs...") + if err := b.SetupCerts(nb.config); err != nil { + return errors.Wrap(err, "Error configuring authentication") + } + + fmt.Fprintln(nb.ui, "Joining node to cluster...") + if err := b.JoinNode(nb.config); err != nil { + return errors.Wrap(err, "Error joining node to cluster") + } + return nil +} diff --git a/pkg/minikube/node/node.go b/pkg/minikube/node/node.go index ffb3add39bf4..2b294a1f61c3 100644 --- a/pkg/minikube/node/node.go +++ b/pkg/minikube/node/node.go @@ -53,6 +53,10 @@ func (n *node) MachineName() string { return fmt.Sprintf("%s-node-%s", n.clusterName, n.config.Name) } +func (n *node) Name() string { + return n.config.Name +} + func (n *node) Start() error { _, err := cluster.StartHost(n.api, n.machineConfig()) if err != nil { diff --git a/pkg/minikube/types.go b/pkg/minikube/types.go index 89d031c03ad5..54ff39e7ea8f 100644 --- a/pkg/minikube/types.go +++ b/pkg/minikube/types.go @@ -23,5 +23,6 @@ type Node interface { Status() (NodeStatus, error) Runner() (bootstrapper.CommandRunner, error) MachineName() string + Name() string IP() (string, error) } From 1e82a22d20cf4dede0684ca7c2539d2ddf1f6901 Mon Sep 17 00:00:00 2001 From: pbitty Date: Thu, 8 Feb 2018 01:13:27 -0500 Subject: [PATCH 21/42] Add details to list command --- cmd/minikube/cmd/node/list.go | 47 ++++++++++++++++++++--------- cmd/minikube/profile/profile.go | 29 ++++++++++++++++++ pkg/minikube/constants/constants.go | 5 +++ 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/cmd/minikube/cmd/node/list.go b/cmd/minikube/cmd/node/list.go index e51f7bb4da06..8c80b7a6e13a 100644 --- a/cmd/minikube/cmd/node/list.go +++ b/cmd/minikube/cmd/node/list.go @@ -1,36 +1,53 @@ package node import ( + "fmt" "os" - "text/template" "github.com/golang/glog" "github.com/spf13/cobra" - "github.com/spf13/viper" "k8s.io/minikube/cmd/minikube/profile" cmdutil "k8s.io/minikube/cmd/util" - cfg "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube" + "k8s.io/minikube/pkg/minikube/machine" + "k8s.io/minikube/pkg/minikube/node" ) func list(cmd *cobra.Command, args []string) { - clusterName := viper.GetString(cfg.MachineProfile) - - cfg, err := profile.LoadConfigFromFile(clusterName) - if err != nil && !os.IsNotExist(err) { - glog.Errorln("Error loading profile config: ", err) + configs, err := profile.LoadClusterConfigs() + if err != nil { + glog.Errorln("Error loading cluster configs: ", err) cmdutil.MaybeReportErrorAndExit(err) } - tmpl, err := template.New("nodeeList").Parse("{{range .}}{{ .Name }}\n{{end}}") + api, err := machine.NewAPIClient() if err != nil { - glog.Errorln("Error creating nodeList template:", err) - os.Exit(internalErrorCode) + glog.Errorf("Error getting client: %s\n", err) + os.Exit(1) } + defer api.Close() - err = tmpl.Execute(os.Stdout, cfg.Nodes) - if err != nil { - glog.Errorln("Error executing nodeList template:", err) - os.Exit(internalErrorCode) + fmt.Printf("%-20s %-20s %-20s %-20s\n", "CLUSTER", "NODE", "STATUS", "IP") + for _, c := range configs { + for _, nc := range c.Nodes { + n := node.NewNode(nc, c.MachineConfig, c.ClusterName, api) + status, err := n.Status() + if err != nil { + glog.Errorf("Error getting status for node %s: %s", nc.Name, err) + cmdutil.MaybeReportErrorAndExit(err) + } + + ip := "" + if status == minikube.StatusRunning { + ip, err = n.IP() + if err != nil { + glog.Errorf("Error getting IP address for node %s: %s", nc.Name, err) + cmdutil.MaybeReportErrorAndExit(err) + } + } + + fmt.Printf("%-20s %-20s %-20s %-20s\n", c.ClusterName, nc.Name, status, ip) + } } } diff --git a/cmd/minikube/profile/profile.go b/cmd/minikube/profile/profile.go index 9543b7dd3194..6831800dda44 100644 --- a/cmd/minikube/profile/profile.go +++ b/cmd/minikube/profile/profile.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" + "github.com/pkg/errors" "github.com/spf13/viper" "k8s.io/minikube/pkg/minikube/cluster" cfg "k8s.io/minikube/pkg/minikube/config" @@ -90,3 +91,31 @@ func LoadConfigFromFile(profile string) (cluster.Config, error) { return cc, nil } + +func LoadClusterConfigs() ([]cluster.Config, error) { + files := constants.GetProfileFiles() + + configs := make([]cluster.Config, len(files)) + for i, f := range files { + c, err := loadConfigFromFile(f) + if err != nil { + return []cluster.Config{}, errors.Wrapf(err, "Error loading config from file: %s", f) + } + configs[i] = c + } + + return configs, nil +} + +func loadConfigFromFile(file string) (cluster.Config, error) { + var c cluster.Config + + reader, err := os.Open(file) + defer reader.Close() + if err != nil { + return c, err + } + + err = json.NewDecoder(reader).Decode(&c) + return c, err +} diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go index bf352badaba3..1f567e1c58e8 100644 --- a/pkg/minikube/constants/constants.go +++ b/pkg/minikube/constants/constants.go @@ -117,6 +117,11 @@ func GetProfileFile(profile string) string { return filepath.Join(GetMinipath(), "profiles", profile, "config.json") } +func GetProfileFiles() []string { + files, _ := filepath.Glob(filepath.Join(GetMinipath(), "profiles", "*", "config.json")) + return files +} + var LocalkubeDownloadURLPrefix = "https://storage.googleapis.com/minikube/k8sReleases/" var LocalkubeLinuxFilename = "localkube-linux-amd64" From e5e1c91f87fb3624316fd1af88e6a2ccc4bceea4 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 04:46:32 -0500 Subject: [PATCH 22/42] Put node commands in constructor functions --- cmd/minikube/cmd/node/add.go | 21 ++++++++++++++-- cmd/minikube/cmd/node/list.go | 9 +++++++ cmd/minikube/cmd/node/node.go | 44 ++++++--------------------------- cmd/minikube/cmd/node/remove.go | 9 +++++++ cmd/minikube/cmd/node/ssh.go | 9 +++++++ cmd/minikube/cmd/node/start.go | 9 +++++++ cmd/minikube/cmd/root.go | 2 +- 7 files changed, 64 insertions(+), 39 deletions(-) diff --git a/cmd/minikube/cmd/node/add.go b/cmd/minikube/cmd/node/add.go index f780ae714427..10362bfd8e13 100644 --- a/cmd/minikube/cmd/node/add.go +++ b/cmd/minikube/cmd/node/add.go @@ -16,20 +16,37 @@ import ( cfg "k8s.io/minikube/pkg/minikube/config" ) +func NewCmdAdd() *cobra.Command { + return &cobra.Command{ + Use: "add ", + Short: "Adds a node to the cluster", + Long: "Adds a node tot the cluster", + Run: add, + } +} + func add(cmd *cobra.Command, args []string) { // TODO Make clusterName into `--cluster=` flag clusterName := viper.GetString(cfg.MachineProfile) + nodeName := "" + if len(args) > 0 { + nodeName = args[0] + } + cfg, err := profile.LoadConfigFromFile(clusterName) if err != nil { glog.Errorln("Error loading profile config: ", err) cmdutil.MaybeReportErrorAndExit(err) } - s := rand.New(rand.NewSource(time.Now().UTC().UnixNano())) + if nodeName == "" { + s := rand.New(rand.NewSource(time.Now().UTC().UnixNano())) + nodeName = fmt.Sprintf("node-%d", s.Uint32()) + } node := minikube.NodeConfig{ - Name: fmt.Sprintf("node-%d", s.Uint32()), + Name: nodeName, } cfg.Nodes = append(cfg.Nodes, node) diff --git a/cmd/minikube/cmd/node/list.go b/cmd/minikube/cmd/node/list.go index 8c80b7a6e13a..d228f788676c 100644 --- a/cmd/minikube/cmd/node/list.go +++ b/cmd/minikube/cmd/node/list.go @@ -14,6 +14,15 @@ import ( "k8s.io/minikube/pkg/minikube/node" ) +func NewCmdList() *cobra.Command { + return &cobra.Command{ + Use: "list", + Short: "Lists all nodes", + Long: "Lists all nodes", + Run: list, + } +} + func list(cmd *cobra.Command, args []string) { configs, err := profile.LoadClusterConfigs() if err != nil { diff --git a/cmd/minikube/cmd/node/node.go b/cmd/minikube/cmd/node/node.go index 16fb26765b1f..8dfda2525e0a 100644 --- a/cmd/minikube/cmd/node/node.go +++ b/cmd/minikube/cmd/node/node.go @@ -13,12 +13,8 @@ import ( const internalErrorCode = -1 -var ( - NodeCmd *cobra.Command -) - -func init() { - NodeCmd = &cobra.Command{ +func NewCmdNode() *cobra.Command { + cmd := &cobra.Command{ Use: "node SUBCOMMAND [flags]", Short: "Control a minikube cluster's nodes", Long: `Control a cluster's nodes using subcommands like "minikube node add "`, @@ -26,36 +22,12 @@ func init() { cmd.Help() }, } - NodeCmd.AddCommand(&cobra.Command{ - Use: "add [flags]", - Short: "Adds a node to the cluster", - Long: "Adds a node tot the cluster", - Run: add, - }) - NodeCmd.AddCommand(&cobra.Command{ - Use: "list", - Short: "Lists all nodes", - Long: "Lists all nodes", - Run: list, - }) - NodeCmd.AddCommand(&cobra.Command{ - Use: "remove ", - Short: "Removes a node from the cluster", - Long: "Removes a node from the cluster", - Run: remove, - }) - NodeCmd.AddCommand(&cobra.Command{ - Use: "ssh", - Short: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'", - Long: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.", - Run: ssh, - }) - NodeCmd.AddCommand(&cobra.Command{ - Use: "start", - Short: "Starts all nodes", - Long: "Starts all nodes", - Run: startNode, - }) + cmd.AddCommand(NewCmdAdd()) + cmd.AddCommand(NewCmdList()) + cmd.AddCommand(NewCmdRemove()) + cmd.AddCommand(NewCmdSsh()) + cmd.AddCommand(NewCmdStart()) + return cmd } func getMachineName(clusterName string, node minikube.NodeConfig) string { diff --git a/cmd/minikube/cmd/node/remove.go b/cmd/minikube/cmd/node/remove.go index ed037e108aab..8f08f2c155cb 100644 --- a/cmd/minikube/cmd/node/remove.go +++ b/cmd/minikube/cmd/node/remove.go @@ -14,6 +14,15 @@ import ( "k8s.io/minikube/pkg/minikube/machine" ) +func NewCmdRemove() *cobra.Command { + return &cobra.Command{ + Use: "remove ", + Short: "Removes a node from the cluster", + Long: "Removes a node from the cluster", + Run: remove, + } +} + func remove(cmd *cobra.Command, args []string) { clusterName := viper.GetString(cfg.MachineProfile) diff --git a/cmd/minikube/cmd/node/ssh.go b/cmd/minikube/cmd/node/ssh.go index 18556338ada4..bd7d4f528299 100644 --- a/cmd/minikube/cmd/node/ssh.go +++ b/cmd/minikube/cmd/node/ssh.go @@ -14,6 +14,15 @@ import ( "k8s.io/minikube/pkg/minikube/machine" ) +func NewCmdSsh() *cobra.Command { + return &cobra.Command{ + Use: "ssh", + Short: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'", + Long: "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.", + Run: ssh, + } +} + func ssh(cmd *cobra.Command, args []string) { clusterName := viper.GetString(cfg.MachineProfile) diff --git a/cmd/minikube/cmd/node/start.go b/cmd/minikube/cmd/node/start.go index 7161b005a522..fbc4fcdd3fb2 100644 --- a/cmd/minikube/cmd/node/start.go +++ b/cmd/minikube/cmd/node/start.go @@ -16,6 +16,15 @@ import ( "k8s.io/minikube/pkg/minikube/node" ) +func NewCmdStart() *cobra.Command { + return &cobra.Command{ + Use: "start", + Short: "Starts all nodes", + Long: "Starts all nodes", + Run: startNode, + } +} + func startNode(cmd *cobra.Command, args []string) { if len(args) == 0 || args[0] == "" { glog.Error("node_name is required.") diff --git a/cmd/minikube/cmd/root.go b/cmd/minikube/cmd/root.go index 309c0bea11e4..e363971b28d3 100755 --- a/cmd/minikube/cmd/root.go +++ b/cmd/minikube/cmd/root.go @@ -132,7 +132,7 @@ func init() { RootCmd.AddCommand(configCmd.ConfigCmd) RootCmd.AddCommand(configCmd.AddonsCmd) RootCmd.AddCommand(configCmd.ProfileCmd) - RootCmd.AddCommand(nodeCmd.NodeCmd) + RootCmd.AddCommand(nodeCmd.NewCmdNode()) pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) viper.BindPFlags(RootCmd.PersistentFlags()) From 190f9e0d8b199f250cc95cf18dbe87299e04c870 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 04:58:58 -0500 Subject: [PATCH 23/42] Use sequence-numbered nodes --- cmd/minikube/cmd/node/add.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cmd/minikube/cmd/node/add.go b/cmd/minikube/cmd/node/add.go index 10362bfd8e13..f8c95c6afba0 100644 --- a/cmd/minikube/cmd/node/add.go +++ b/cmd/minikube/cmd/node/add.go @@ -2,9 +2,7 @@ package node import ( "fmt" - "math/rand" "os" - "time" "github.com/golang/glog" "github.com/spf13/cobra" @@ -41,8 +39,7 @@ func add(cmd *cobra.Command, args []string) { } if nodeName == "" { - s := rand.New(rand.NewSource(time.Now().UTC().UnixNano())) - nodeName = fmt.Sprintf("node-%d", s.Uint32()) + nodeName = fmt.Sprintf("node-%d", len(cfg.Nodes)+1) } node := minikube.NodeConfig{ From ba0a056c9999eee185a9c5cdeae42cde232a7b65 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 05:30:10 -0500 Subject: [PATCH 24/42] Move bootstrap CommandRunner code to own package --- pkg/minikube/bootstrapper/certs.go | 3 ++- pkg/minikube/bootstrapper/certs_test.go | 3 ++- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 13 +++++++------ pkg/minikube/bootstrapper/localkube/localkube.go | 9 +++++---- .../bootstrapper/localkube/localkube_test.go | 9 +++++---- .../bootstrapper/{ => runner}/command_runner.go | 2 +- .../bootstrapper/{ => runner}/exec_runner.go | 2 +- .../bootstrapper/{ => runner}/fake_runner.go | 2 +- .../bootstrapper/{ => runner}/ssh_runner.go | 2 +- pkg/minikube/machine/cache_images.go | 7 ++++--- pkg/minikube/machine/client.go | 8 ++++---- pkg/minikube/types.go | 4 ++-- pkg/provision/buildroot.go | 6 +++--- 13 files changed, 38 insertions(+), 32 deletions(-) rename pkg/minikube/bootstrapper/{ => runner}/command_runner.go (98%) rename pkg/minikube/bootstrapper/{ => runner}/exec_runner.go (99%) rename pkg/minikube/bootstrapper/{ => runner}/fake_runner.go (99%) rename pkg/minikube/bootstrapper/{ => runner}/ssh_runner.go (99%) diff --git a/pkg/minikube/bootstrapper/certs.go b/pkg/minikube/bootstrapper/certs.go index f2cdf52f450e..bb20d2714009 100644 --- a/pkg/minikube/bootstrapper/certs.go +++ b/pkg/minikube/bootstrapper/certs.go @@ -28,6 +28,7 @@ import ( "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/tools/clientcmd/api/latest" "k8s.io/minikube/pkg/minikube/assets" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/util" "k8s.io/minikube/pkg/util/kubeconfig" @@ -41,7 +42,7 @@ var ( ) // SetupCerts gets the generated credentials required to talk to the APIServer. -func SetupCerts(cmd CommandRunner, k8s KubernetesConfig) error { +func SetupCerts(cmd runner.CommandRunner, k8s KubernetesConfig) error { localPath := constants.GetMinipath() glog.Infof("Setting up certificates for IP: %s\n", k8s.NodeIP) diff --git a/pkg/minikube/bootstrapper/certs_test.go b/pkg/minikube/bootstrapper/certs_test.go index 94e5254d7064..1fa9ccabde80 100644 --- a/pkg/minikube/bootstrapper/certs_test.go +++ b/pkg/minikube/bootstrapper/certs_test.go @@ -21,6 +21,7 @@ import ( "path/filepath" "testing" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/tests" "k8s.io/minikube/pkg/util" @@ -30,7 +31,7 @@ func TestSetupCerts(t *testing.T) { tempDir := tests.MakeTempDir() defer os.RemoveAll(tempDir) - f := NewFakeCommandRunner() + f := runner.NewFakeCommandRunner() k8s := KubernetesConfig{ APIServerName: constants.APIServerName, DNSDomain: constants.ClusterDNSDomain, diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index a10370b37f5f..bb489083f3fa 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -32,7 +32,8 @@ import ( "github.com/pkg/errors" "golang.org/x/sync/errgroup" "k8s.io/minikube/pkg/minikube/assets" - "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/machine" @@ -41,7 +42,7 @@ import ( ) type KubeadmBootstrapper struct { - c bootstrapper.CommandRunner + c runner.CommandRunner ip string machineName string } @@ -55,16 +56,16 @@ func NewKubeadmBootstrapperForMachine(machineName string, api libmachine.API) (* if err != nil { return nil, errors.Wrap(err, "getting api client") } - var cmd bootstrapper.CommandRunner + var cmd runner.CommandRunner // The none driver executes commands directly on the host if h.Driver.DriverName() == constants.DriverNone { - cmd = &bootstrapper.ExecRunner{} + cmd = &runner.ExecRunner{} } else { client, err := sshutil.NewSSHClient(h.Driver) if err != nil { return nil, errors.Wrap(err, "getting ssh client") } - cmd = bootstrapper.NewSSHRunner(client) + cmd = runner.NewSSHRunner(client) } ip, err := h.Driver.GetIP() @@ -79,7 +80,7 @@ func NewKubeadmBootstrapperForMachine(machineName string, api libmachine.API) (* }, nil } -func NewKubeadmBootstrapperForRunner(machineName, ip string, c bootstrapper.CommandRunner) *KubeadmBootstrapper { +func NewKubeadmBootstrapperForRunner(machineName, ip string, c runner.CommandRunner) *KubeadmBootstrapper { return &KubeadmBootstrapper{ c: c, ip: ip, diff --git a/pkg/minikube/bootstrapper/localkube/localkube.go b/pkg/minikube/bootstrapper/localkube/localkube.go index a91a811aea7a..a2f948d25d4f 100644 --- a/pkg/minikube/bootstrapper/localkube/localkube.go +++ b/pkg/minikube/bootstrapper/localkube/localkube.go @@ -22,6 +22,7 @@ import ( "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/machine" @@ -33,7 +34,7 @@ import ( ) type LocalkubeBootstrapper struct { - cmd bootstrapper.CommandRunner + cmd runner.CommandRunner } func NewLocalkubeBootstrapper(api libmachine.API) (*LocalkubeBootstrapper, error) { @@ -41,16 +42,16 @@ func NewLocalkubeBootstrapper(api libmachine.API) (*LocalkubeBootstrapper, error if err != nil { return nil, errors.Wrap(err, "getting api client") } - var cmd bootstrapper.CommandRunner + var cmd runner.CommandRunner // The none driver executes commands directly on the host if h.Driver.DriverName() == constants.DriverNone { - cmd = &bootstrapper.ExecRunner{} + cmd = &runner.ExecRunner{} } else { client, err := sshutil.NewSSHClient(h.Driver) if err != nil { return nil, errors.Wrap(err, "getting ssh client") } - cmd = bootstrapper.NewSSHRunner(client) + cmd = runner.NewSSHRunner(client) } return &LocalkubeBootstrapper{ cmd: cmd, diff --git a/pkg/minikube/bootstrapper/localkube/localkube_test.go b/pkg/minikube/bootstrapper/localkube/localkube_test.go index e7b346919fe6..6cd2ca14a16f 100644 --- a/pkg/minikube/bootstrapper/localkube/localkube_test.go +++ b/pkg/minikube/bootstrapper/localkube/localkube_test.go @@ -20,6 +20,7 @@ import ( "testing" "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/constants" ) @@ -46,7 +47,7 @@ func TestStartCluster(t *testing.T) { for _, test := range cases { t.Run(test.description, func(t *testing.T) { t.Parallel() - f := bootstrapper.NewFakeCommandRunner() + f := runner.NewFakeCommandRunner() f.SetCommandToOutput(map[string]string{test.startCmd: "ok"}) l := LocalkubeBootstrapper{f} err := l.StartCluster(bootstrapper.KubernetesConfig{}) @@ -96,7 +97,7 @@ func TestUpdateCluster(t *testing.T) { for _, test := range cases { t.Run(test.description, func(t *testing.T) { t.Parallel() - f := bootstrapper.NewFakeCommandRunner() + f := runner.NewFakeCommandRunner() l := LocalkubeBootstrapper{f} err := l.UpdateCluster(test.k8s) if err != nil && !test.shouldErr { @@ -149,7 +150,7 @@ func TestGetLocalkubeStatus(t *testing.T) { for _, test := range cases { t.Run(test.description, func(t *testing.T) { t.Parallel() - f := bootstrapper.NewFakeCommandRunner() + f := runner.NewFakeCommandRunner() f.SetCommandToOutput(test.statusCmdMap) l := LocalkubeBootstrapper{f} actualStatus, err := l.GetClusterStatus() @@ -203,7 +204,7 @@ func TestGetHostLogs(t *testing.T) { for _, test := range cases { t.Run(test.description, func(t *testing.T) { t.Parallel() - f := bootstrapper.NewFakeCommandRunner() + f := runner.NewFakeCommandRunner() f.SetCommandToOutput(test.logsCmdMap) l := LocalkubeBootstrapper{f} _, err := l.GetClusterLogs(test.follow) diff --git a/pkg/minikube/bootstrapper/command_runner.go b/pkg/minikube/bootstrapper/runner/command_runner.go similarity index 98% rename from pkg/minikube/bootstrapper/command_runner.go rename to pkg/minikube/bootstrapper/runner/command_runner.go index cb019243276a..466c086f8925 100644 --- a/pkg/minikube/bootstrapper/command_runner.go +++ b/pkg/minikube/bootstrapper/runner/command_runner.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package bootstrapper +package runner import ( "fmt" diff --git a/pkg/minikube/bootstrapper/exec_runner.go b/pkg/minikube/bootstrapper/runner/exec_runner.go similarity index 99% rename from pkg/minikube/bootstrapper/exec_runner.go rename to pkg/minikube/bootstrapper/runner/exec_runner.go index 063748254c30..50f118a363a3 100644 --- a/pkg/minikube/bootstrapper/exec_runner.go +++ b/pkg/minikube/bootstrapper/runner/exec_runner.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package bootstrapper +package runner import ( "io" diff --git a/pkg/minikube/bootstrapper/fake_runner.go b/pkg/minikube/bootstrapper/runner/fake_runner.go similarity index 99% rename from pkg/minikube/bootstrapper/fake_runner.go rename to pkg/minikube/bootstrapper/runner/fake_runner.go index 79aebe6f7a60..ae379ec6b611 100644 --- a/pkg/minikube/bootstrapper/fake_runner.go +++ b/pkg/minikube/bootstrapper/runner/fake_runner.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package bootstrapper +package runner import ( "bytes" diff --git a/pkg/minikube/bootstrapper/ssh_runner.go b/pkg/minikube/bootstrapper/runner/ssh_runner.go similarity index 99% rename from pkg/minikube/bootstrapper/ssh_runner.go rename to pkg/minikube/bootstrapper/runner/ssh_runner.go index 74119ee5c5e7..2ef6238b5243 100644 --- a/pkg/minikube/bootstrapper/ssh_runner.go +++ b/pkg/minikube/bootstrapper/runner/ssh_runner.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package bootstrapper +package runner import ( "fmt" diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go index 028e22b8d990..dbfb516f05e5 100644 --- a/pkg/minikube/machine/cache_images.go +++ b/pkg/minikube/machine/cache_images.go @@ -28,6 +28,7 @@ import ( "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/sshutil" @@ -80,7 +81,7 @@ func CacheImages(images []string, cacheDir string) error { return nil } -func LoadImages(cmd bootstrapper.CommandRunner, images []string, cacheDir string) error { +func LoadImages(cmd runner.CommandRunner, images []string, cacheDir string) error { var g errgroup.Group glog.Infof("Loading cached images: %s", images) for _, image := range images { @@ -119,7 +120,7 @@ func CacheAndLoadImages(images []string) error { if err != nil { return err } - cmdRunner, err := bootstrapper.NewSSHRunner(client), nil + cmdRunner, err := runner.NewSSHRunner(client), nil if err != nil { return err } @@ -191,7 +192,7 @@ func getWindowsVolumeNameCmd(d string) (string, error) { return vname, nil } -func LoadFromCacheBlocking(cmd bootstrapper.CommandRunner, src string) error { +func LoadFromCacheBlocking(cmd runner.CommandRunner, src string) error { glog.Infoln("Loading image from cache at ", src) filename := filepath.Base(src) for { diff --git a/pkg/minikube/machine/client.go b/pkg/minikube/machine/client.go index 56e4906c1434..7cdc577cb33f 100644 --- a/pkg/minikube/machine/client.go +++ b/pkg/minikube/machine/client.go @@ -25,7 +25,7 @@ import ( "path/filepath" "time" - "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/sshutil" "k8s.io/minikube/pkg/provision" @@ -154,16 +154,16 @@ func (api *LocalClient) Load(name string) (*host.Host, error) { return h, nil } -func GetCommandRunner(h *host.Host) (bootstrapper.CommandRunner, error) { +func GetCommandRunner(h *host.Host) (runner.CommandRunner, error) { if h.DriverName != constants.DriverNone { client, err := sshutil.NewSSHClient(h.Driver) if err != nil { return nil, errors.Wrap(err, "getting ssh client for bootstrapper") } - return bootstrapper.NewSSHRunner(client), nil + return runner.NewSSHRunner(client), nil } - return &bootstrapper.ExecRunner{}, nil + return &runner.ExecRunner{}, nil } func (api *LocalClient) Close() error { diff --git a/pkg/minikube/types.go b/pkg/minikube/types.go index 54ff39e7ea8f..c30e89d01126 100644 --- a/pkg/minikube/types.go +++ b/pkg/minikube/types.go @@ -1,7 +1,7 @@ package minikube import ( - "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" ) const ( @@ -21,7 +21,7 @@ type Node interface { Start() error Stop() error Status() (NodeStatus, error) - Runner() (bootstrapper.CommandRunner, error) + Runner() (runner.CommandRunner, error) MachineName() string Name() string IP() (string, error) diff --git a/pkg/provision/buildroot.go b/pkg/provision/buildroot.go index 5534caf187bb..6f5b918b3b65 100755 --- a/pkg/provision/buildroot.go +++ b/pkg/provision/buildroot.go @@ -36,7 +36,7 @@ import ( "github.com/docker/machine/libmachine/swarm" "github.com/pkg/errors" "k8s.io/minikube/pkg/minikube/assets" - "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/sshutil" "k8s.io/minikube/pkg/util" ) @@ -224,7 +224,7 @@ func configureAuth(p *BuildrootProvisioner) error { return errors.Wrap(err, "error getting ip during provisioning") } - execRunner := &bootstrapper.ExecRunner{} + execRunner := &runner.ExecRunner{} hostCerts := map[string]string{ authOptions.CaCertPath: path.Join(authOptions.StorePath, "ca.pem"), authOptions.ClientCertPath: path.Join(authOptions.StorePath, "cert.pem"), @@ -275,7 +275,7 @@ func configureAuth(p *BuildrootProvisioner) error { if err != nil { return errors.Wrap(err, "provisioning: error getting ssh client") } - sshRunner := bootstrapper.NewSSHRunner(sshClient) + sshRunner := runner.NewSSHRunner(sshClient) for src, dst := range remoteCerts { f, err := assets.NewFileAsset(src, path.Dir(dst), filepath.Base(dst), "0640") if err != nil { From c706e3fa3c619559691ab9a522ef1d144562219d Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 07:58:57 -0500 Subject: [PATCH 25/42] Improve node list output --- cmd/minikube/cmd/node/list.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/minikube/cmd/node/list.go b/cmd/minikube/cmd/node/list.go index d228f788676c..16911f040e97 100644 --- a/cmd/minikube/cmd/node/list.go +++ b/cmd/minikube/cmd/node/list.go @@ -37,14 +37,16 @@ func list(cmd *cobra.Command, args []string) { } defer api.Close() - fmt.Printf("%-20s %-20s %-20s %-20s\n", "CLUSTER", "NODE", "STATUS", "IP") + fmt.Printf("%-20s %-20s %-16s %-20s\n", "CLUSTER", "NODE", "IP", "STATUS") + + nodesFound := false for _, c := range configs { for _, nc := range c.Nodes { + nodesFound = true n := node.NewNode(nc, c.MachineConfig, c.ClusterName, api) status, err := n.Status() if err != nil { - glog.Errorf("Error getting status for node %s: %s", nc.Name, err) - cmdutil.MaybeReportErrorAndExit(err) + status = minikube.NodeStatus("Error: " + err.Error()) } ip := "" @@ -56,7 +58,11 @@ func list(cmd *cobra.Command, args []string) { } } - fmt.Printf("%-20s %-20s %-20s %-20s\n", c.ClusterName, nc.Name, status, ip) + fmt.Printf("%-20s %-20s %-16s %-20s\n", c.ClusterName, nc.Name, ip, status) } } + + if !nodesFound { + fmt.Println("No nodes found.") + } } From cc46239079c8fe07babde5990b0c106e274a5121 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 07:59:22 -0500 Subject: [PATCH 26/42] Allow starting arbitrary set of nodes --- cmd/minikube/cmd/node/start.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/cmd/minikube/cmd/node/start.go b/cmd/minikube/cmd/node/start.go index fbc4fcdd3fb2..e38195e832ef 100644 --- a/cmd/minikube/cmd/node/start.go +++ b/cmd/minikube/cmd/node/start.go @@ -18,9 +18,9 @@ import ( func NewCmdStart() *cobra.Command { return &cobra.Command{ - Use: "start", - Short: "Starts all nodes", - Long: "Starts all nodes", + Use: "start [node_name [node_name] ...]", + Short: "Starts nodes", + Long: "Starts nodes", Run: startNode, } } @@ -31,7 +31,7 @@ func startNode(cmd *cobra.Command, args []string) { os.Exit(1) } - nodeName := args[0] + nodeNames := args clusterName := viper.GetString(cfg.MachineProfile) cfg, err := profile.LoadConfigFromFile(clusterName) @@ -51,7 +51,7 @@ func startNode(cmd *cobra.Command, args []string) { for _, nodeCfg := range cfg.Nodes { name := nodeCfg.Name - if name != nodeName { + if len(nodeNames) > 0 && !contains(nodeNames, name) { continue } @@ -63,7 +63,7 @@ func startNode(cmd *cobra.Command, args []string) { cmdutil.MaybeReportErrorAndExit(err) } - b := kubeadm.NewNodeBootstrapper(cfg.KubernetesConfig, os.Stdout) + b := kubeadm.NewWorkerBootstrapper(cfg.KubernetesConfig, os.Stdout) if err := b.Bootstrap(n); err != nil { glog.Errorln("Error bootstrapping node: ", err) cmdutil.MaybeReportErrorAndExit(err) @@ -71,3 +71,12 @@ func startNode(cmd *cobra.Command, args []string) { fmt.Printf("Node %s started and configured.\n", n.Name()) } } + +func contains(s []string, v string) bool { + for _, str := range s { + if str == v { + return true + } + } + return false +} From 8abdbf9d4a5c6e029281b24cc962dccfa0718f89 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 08:00:03 -0500 Subject: [PATCH 27/42] Create new Bootstrapper interface --- .../kubeadm/{node_bootstrapper.go => worker.go} | 8 ++++---- pkg/minikube/types.go | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) rename pkg/minikube/bootstrapper/kubeadm/{node_bootstrapper.go => worker.go} (79%) diff --git a/pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go b/pkg/minikube/bootstrapper/kubeadm/worker.go similarity index 79% rename from pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go rename to pkg/minikube/bootstrapper/kubeadm/worker.go index f767028db590..abcc25c2da8b 100644 --- a/pkg/minikube/bootstrapper/kubeadm/node_bootstrapper.go +++ b/pkg/minikube/bootstrapper/kubeadm/worker.go @@ -9,16 +9,16 @@ import ( "k8s.io/minikube/pkg/minikube/bootstrapper" ) -type NodeBootstrapper struct { +type WorkerBootstrapper struct { config bootstrapper.KubernetesConfig ui io.Writer } -func NewNodeBootstrapper(c bootstrapper.KubernetesConfig, ui io.Writer) *NodeBootstrapper { - return &NodeBootstrapper{config: c, ui: ui} +func NewWorkerBootstrapper(c bootstrapper.KubernetesConfig, ui io.Writer) minikube.Bootstrapper { + return &WorkerBootstrapper{config: c, ui: ui} } -func (nb *NodeBootstrapper) Bootstrap(n minikube.Node) error { +func (nb *WorkerBootstrapper) Bootstrap(n minikube.Node) error { ip, err := n.IP() if err != nil { return errors.Wrap(err, "Error getting node's IP") diff --git a/pkg/minikube/types.go b/pkg/minikube/types.go index c30e89d01126..4c91423bbdac 100644 --- a/pkg/minikube/types.go +++ b/pkg/minikube/types.go @@ -26,3 +26,7 @@ type Node interface { Name() string IP() (string, error) } + +type Bootstrapper interface { + Bootstrap(Node) error +} From ac385b87419488939d2a61fe7619c2baa5b897c8 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 08:00:18 -0500 Subject: [PATCH 28/42] Fix node code --- pkg/minikube/node/node.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/minikube/node/node.go b/pkg/minikube/node/node.go index 2b294a1f61c3..124fa8969674 100644 --- a/pkg/minikube/node/node.go +++ b/pkg/minikube/node/node.go @@ -7,7 +7,7 @@ import ( "github.com/docker/machine/libmachine/state" "github.com/pkg/errors" "k8s.io/minikube/pkg/minikube" - "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/cluster" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/sshutil" @@ -50,7 +50,7 @@ func (n *node) IP() (string, error) { } func (n *node) MachineName() string { - return fmt.Sprintf("%s-node-%s", n.clusterName, n.config.Name) + return fmt.Sprintf("%s-%s", n.clusterName, n.config.Name) } func (n *node) Name() string { @@ -71,24 +71,24 @@ func (n *node) Stop() error { func (n *node) Status() (minikube.NodeStatus, error) { s, err := n.status() - return s, errors.Wrap(err, "Error getting node status.") + return s, errors.Wrap(err, "getting node status") } -func (n *node) Runner() (bootstrapper.CommandRunner, error) { +func (n *node) Runner() (runner.CommandRunner, error) { h, err := n.api.Load(n.MachineName()) if err != nil { - return nil, errors.Wrap(err, "Error loading host") + return nil, errors.Wrap(err, "loading host") } // The none driver executes commands directly on the host if h.Driver.DriverName() == constants.DriverNone { - return &bootstrapper.ExecRunner{}, nil + return &runner.ExecRunner{}, nil } client, err := sshutil.NewSSHClient(h.Driver) if err != nil { return nil, errors.Wrap(err, "getting ssh client") } - return bootstrapper.NewSSHRunner(client), nil + return runner.NewSSHRunner(client), nil } func (n *node) machineConfig() cluster.MachineConfig { From 9f1df325b54b12e20f3f2fd8dfef54b754170e13 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 08:00:27 -0500 Subject: [PATCH 29/42] Update machineName schema --- cmd/minikube/cmd/node/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/node/node.go b/cmd/minikube/cmd/node/node.go index 8dfda2525e0a..2459c6a8bac0 100644 --- a/cmd/minikube/cmd/node/node.go +++ b/cmd/minikube/cmd/node/node.go @@ -31,7 +31,7 @@ func NewCmdNode() *cobra.Command { } func getMachineName(clusterName string, node minikube.NodeConfig) string { - return fmt.Sprintf("%s-node-%s", clusterName, node.Name) + return fmt.Sprintf("%s-%s", clusterName, node.Name) } func getNode(clusterName, nodeName string) (minikube.NodeConfig, error) { From 5d084b0f718f54166eb326c85b440852788f06ef Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 08:00:59 -0500 Subject: [PATCH 30/42] Add demo directory --- demo/demo-magic.sh | 166 ++++++++++++++++++++++ demo/demo.sh | 48 +++++++ demo/hello-from.yml | 43 ++++++ kube-flannel.yml => demo/kube-flannel.yml | 3 + hello.yml | 37 ----- 5 files changed, 260 insertions(+), 37 deletions(-) create mode 100644 demo/demo-magic.sh create mode 100755 demo/demo.sh create mode 100644 demo/hello-from.yml rename kube-flannel.yml => demo/kube-flannel.yml (97%) delete mode 100644 hello.yml diff --git a/demo/demo-magic.sh b/demo/demo-magic.sh new file mode 100644 index 000000000000..fed89cfed156 --- /dev/null +++ b/demo/demo-magic.sh @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +############################################################################### +# +# demo-magic.sh +# +# Copyright (c) 2015 Paxton Hare +# +# This script lets you script demos in bash. It runs through your demo script when you press +# ENTER. It simulates typing and runs commands. +# +############################################################################### + +# the speed to "type" the text +TYPE_SPEED=20 + +# no wait after "p" or "pe" +NO_WAIT=false + +# if > 0, will pause for this amount of seconds before automatically proceeding with any p or pe +PROMPT_TIMEOUT=0 + +# handy color vars for pretty prompts +BLACK="\033[0;30m" +BLUE="\033[0;34m" +GREEN="\033[0;32m" +CYAN="\033[0;36m" +RED="\033[0;31m" +PURPLE="\033[0;35m" +BROWN="\033[0;33m" +WHITE="\033[1;37m" +COLOR_RESET="\033[0m" + +## +# prints the script usage +## +function usage() { + echo -e "" + echo -e "Usage: $0 [options]" + echo -e "" + echo -e "\tWhere options is one or more of:" + echo -e "\t-h\tPrints Help text" + echo -e "\t-d\tDebug mode. Disables simulated typing" + echo -e "\t-n\tNo wait" + echo -e "\t-w\tWaits max the given amount of seconds before proceeding with demo (e.g. `-w5`)" + echo -e "" +} + +## +# wait for user to press ENTER +# if $PROMPT_TIMEOUT > 0 this will be used as the max time for proceeding automatically +## +function wait() { + if [[ "$PROMPT_TIMEOUT" == "0" ]]; then + read -rs + else + read -rst "$PROMPT_TIMEOUT" + fi +} + +## +# print command only. Useful for when you want to pretend to run a command +# +# takes 1 param - the string command to print +# +# usage: p "ls -l" +# +## +function p() { + cmd=$1 + + # render the prompt + x=$(PS1="$DEMO_PROMPT" "$BASH" --norc -i &1 | sed -n '${s/^\(.*\)exit$/\1/p;}') + printf "$x" + + # wait for the user to press a key before typing the command + if !($NO_WAIT); then + wait + fi + + if [[ -z $TYPE_SPEED ]]; then + echo -en "\033[0m$cmd" + else + echo -en "\033[0m$cmd" | pv -qL $[$TYPE_SPEED+(-2 + RANDOM%5)]; + fi + + # wait for the user to press a key before moving on + if !($NO_WAIT); then + wait + fi + echo "" +} + +## +# Prints and executes a command +# +# takes 1 parameter - the string command to run +# +# usage: pe "ls -l" +# +## +function pe() { + # print the command + p "$@" + + # execute the command + eval "$@" +} + +## +# Enters script into interactive mode +# +# and allows newly typed commands to be executed within the script +# +# usage : cmd +# +## +function cmd() { + # render the prompt + x=$(PS1="$DEMO_PROMPT" "$BASH" --norc -i &1 | sed -n '${s/^\(.*\)exit$/\1/p;}') + printf "$x\033[0m" + read command + eval "${command}" +} + + +function check_pv() { + command -v pv >/dev/null 2>&1 || { + + echo "" + echo -e "${RED}##############################################################" + echo "# HOLD IT!! I require pv but it's not installed. Aborting." >&2; + echo -e "${RED}##############################################################" + echo "" + echo -e "${COLOR_RESET}Installing pv:" + echo "" + echo -e "${BLUE}Mac:${COLOR_RESET} $ brew install pv" + echo "" + echo -e "${BLUE}Other:${COLOR_RESET} http://www.ivarch.com/programs/pv.shtml" + echo -e "${COLOR_RESET}" + exit 1; + } +} + +check_pv +# +# handle some default params +# -h for help +# -d for disabling simulated typing +# +while getopts ":dhnw:" opt; do + case $opt in + h) + usage + exit 1 + ;; + d) + unset TYPE_SPEED + ;; + n) + NO_WAIT=true + ;; + w) + PROMPT_TIMEOUT=$OPTARG + esac +done diff --git a/demo/demo.sh b/demo/demo.sh new file mode 100755 index 000000000000..614af6f8caee --- /dev/null +++ b/demo/demo.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +. demo-magic.sh -n + +TYPE_SPEED=15 +DEMO_PROMPT="${GREEN}➜ ${CYAN}\W $ " + +p "# In this demo I will start up a 4-node minikube cluster." +p "# Three workers and one server" +p "" + +p "# Start minikube master ..." +pe "out/minikube start" + +p "# Add some nodes ..." +pe "out/minikube node add" +pe "out/minikube node add" +pe "out/minikube node add" + +p "# Start nodes ..." +pe "out/minikube node start" + +PROMPT_TIMEOUT=10 +wait + +pe "kubectl get nodes" + +p "# Installing Pod network ..." +pe "kubectl apply -f kube-flannel.yml" + +p "# Wait for flannel to start ..." +pe "kubectl --namespace=kube-system rollout status ds/kube-flannel-ds" + +p "# Deploy our pods ..." +pe "cat hello-from.yml" +pe "kubectl apply -f hello-from.yml" + +pe "kubectl rollout status deployment/hello-from" + +pe "# Note Pod IPs ..." +pe "kubectl get pod -o wide" + +pe "out/minikube service list" + +ip=$(out/minikube ip) +pe "for i in \$(seq 1 10); do curl http://$ip:31000; echo; done" + +p "# Yay" diff --git a/demo/hello-from.yml b/demo/hello-from.yml new file mode 100644 index 000000000000..544de46f2043 --- /dev/null +++ b/demo/hello-from.yml @@ -0,0 +1,43 @@ +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: hello-from +spec: + replicas: 4 + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 100% + template: + metadata: + labels: + app: hello-from + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: [{ key: app, operator: In, values: [hello-from] }] + topologyKey: "kubernetes.io/hostname" + containers: + - name: hello-from + image: pbitty/hello-from:latest + ports: + - name: http + containerPort: 80 + terminationGracePeriodSeconds: 1 +--- +apiVersion: v1 +kind: Service +metadata: + name: hello-from +spec: + type: NodePort + selector: + app: hello-from + ports: + - protocol: TCP + nodePort: 31000 + port: 80 + targetPort: http diff --git a/kube-flannel.yml b/demo/kube-flannel.yml similarity index 97% rename from kube-flannel.yml rename to demo/kube-flannel.yml index bc359d577bb6..aabbbdb9e1c9 100644 --- a/kube-flannel.yml +++ b/demo/kube-flannel.yml @@ -77,6 +77,9 @@ metadata: tier: node app: flannel spec: + updateStrategy: + type: RollingUpdate + minReadySeconds: 5 template: metadata: labels: diff --git a/hello.yml b/hello.yml deleted file mode 100644 index 37e0a8680ec2..000000000000 --- a/hello.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -apiVersion: extensions/v1beta1 -kind: DaemonSet -metadata: - name: hello - labels: - app: hello -spec: - selector: - matchLabels: - app: hello - template: - metadata: - labels: - app: hello - spec: - tolerations: - - key: node-role.kubernetes.io/master - containers: - - name: main - image: strm/helloworld-http - ports: - - containerPort: 80 - name: http - terminationGracePeriodSeconds: 1 ---- -apiVersion: v1 -kind: Service -metadata: - name: hello -spec: - selector: - app: hello - ports: - - protocol: TCP - port: 80 - targetPort: http From 5539bc7a7e141705bf2dd84823e9e28264fc74f6 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 08:02:36 -0500 Subject: [PATCH 31/42] List nodes throughout demo --- demo/demo.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/demo/demo.sh b/demo/demo.sh index 614af6f8caee..30a9a2196cbd 100755 --- a/demo/demo.sh +++ b/demo/demo.sh @@ -12,14 +12,21 @@ p "" p "# Start minikube master ..." pe "out/minikube start" +pe "out/minikube nodes list" + p "# Add some nodes ..." pe "out/minikube node add" pe "out/minikube node add" pe "out/minikube node add" +pe "out/minikube nodes list" + + p "# Start nodes ..." pe "out/minikube node start" +pe "out/minikube nodes list" + PROMPT_TIMEOUT=10 wait From b49a1229fa05f0bfe77718f2a67f83db2a748fc0 Mon Sep 17 00:00:00 2001 From: pbitty Date: Fri, 9 Feb 2018 18:00:42 -0500 Subject: [PATCH 32/42] node start command cleanup --- cmd/minikube/cmd/node/start.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/node/start.go b/cmd/minikube/cmd/node/start.go index e38195e832ef..b2b1f1269807 100644 --- a/cmd/minikube/cmd/node/start.go +++ b/cmd/minikube/cmd/node/start.go @@ -51,7 +51,7 @@ func startNode(cmd *cobra.Command, args []string) { for _, nodeCfg := range cfg.Nodes { name := nodeCfg.Name - if len(nodeNames) > 0 && !contains(nodeNames, name) { + if isExcluded(nodeNames, name) { continue } @@ -72,6 +72,10 @@ func startNode(cmd *cobra.Command, args []string) { } } +func isExcluded(nodeNames []string, nodeName string) bool { + return len(nodeNames) > 0 && !contains(nodeNames, nodeName) +} + func contains(s []string, v string) bool { for _, str := range s { if str == v { From 266c1280559466715a44810c8e803d1c1d030c83 Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 11:39:05 -0500 Subject: [PATCH 33/42] Allow all nodes to be started with one command --- cmd/minikube/cmd/node/start.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cmd/minikube/cmd/node/start.go b/cmd/minikube/cmd/node/start.go index b2b1f1269807..7fdfd47d0dbe 100644 --- a/cmd/minikube/cmd/node/start.go +++ b/cmd/minikube/cmd/node/start.go @@ -26,11 +26,6 @@ func NewCmdStart() *cobra.Command { } func startNode(cmd *cobra.Command, args []string) { - if len(args) == 0 || args[0] == "" { - glog.Error("node_name is required.") - os.Exit(1) - } - nodeNames := args clusterName := viper.GetString(cfg.MachineProfile) From bb8f0fe2c98764d2d3cdac29bb137017bc45f0e0 Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 11:47:59 -0500 Subject: [PATCH 34/42] Hide load images error, since it is ignored anyway --- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index bb489083f3fa..9df4f06a5add 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -298,7 +298,7 @@ func (k *KubeadmBootstrapper) UpdateCluster(cfg bootstrapper.KubernetesConfig) e glog.Infoln("Loading cached images....") err := machine.LoadImages(k.c, constants.GetKubeadmCachedImages(cfg.KubernetesVersion), constants.ImageCacheDir) if err != nil { - glog.Errorf("Could not load all cached images: ", err) + glog.Infoln("Could not load all cached images, ignoring and continuing. Error: ", err) } } kubeadmCfg, err := generateConfig(cfg) From 08d420f1daa16839eee73e37bf72587b6c6e680d Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 11:48:34 -0500 Subject: [PATCH 35/42] Add demo code --- demo/demo.sh | 57 ++++++++++++------- demo/{hello-from.yml => hello-deployment.yml} | 19 +------ demo/hello-svc.yml | 14 +++++ demo/minikube | 1 + 4 files changed, 56 insertions(+), 35 deletions(-) rename demo/{hello-from.yml => hello-deployment.yml} (72%) create mode 100644 demo/hello-svc.yml create mode 120000 demo/minikube diff --git a/demo/demo.sh b/demo/demo.sh index 30a9a2196cbd..d1ef77e27b79 100755 --- a/demo/demo.sh +++ b/demo/demo.sh @@ -1,55 +1,74 @@ #!/usr/bin/env bash +set -e -. demo-magic.sh -n +cd "$(dirname $0)" || exit + +source demo-magic.sh -n TYPE_SPEED=15 -DEMO_PROMPT="${GREEN}➜ ${CYAN}\W $ " +DEMO_PROMPT="${CYAN}$ " p "# In this demo I will start up a 4-node minikube cluster." p "# Three workers and one server" p "" p "# Start minikube master ..." -pe "out/minikube start" +pe "./minikube start" -pe "out/minikube nodes list" +p "" +pe "./minikube node list" +p "" p "# Add some nodes ..." -pe "out/minikube node add" -pe "out/minikube node add" -pe "out/minikube node add" - -pe "out/minikube nodes list" +pe "./minikube node add" +pe "./minikube node add" +pe "./minikube node add" +p "" +pe "./minikube node list" +p "" p "# Start nodes ..." -pe "out/minikube node start" +pe "./minikube node start" -pe "out/minikube nodes list" +p "" +pe "./minikube node list" -PROMPT_TIMEOUT=10 -wait +sleep 10 +p "" pe "kubectl get nodes" +p "" p "# Installing Pod network ..." pe "kubectl apply -f kube-flannel.yml" +p "" p "# Wait for flannel to start ..." pe "kubectl --namespace=kube-system rollout status ds/kube-flannel-ds" +p "" p "# Deploy our pods ..." -pe "cat hello-from.yml" -pe "kubectl apply -f hello-from.yml" +pe "cat hello-deployment.yml" +pe "kubectl apply -f hello-deployment.yml" + +p "" +pe "kubectl rollout status deployment/hello" -pe "kubectl rollout status deployment/hello-from" +p "" +p "# Deploy our service ..." +pe "cat hello-svc.yml" +pe "kubectl apply -f hello-svc.yml" +p "" pe "# Note Pod IPs ..." pe "kubectl get pod -o wide" -pe "out/minikube service list" +p "" +pe "./minikube service list" -ip=$(out/minikube ip) -pe "for i in \$(seq 1 10); do curl http://$ip:31000; echo; done" +p "" +ip=$(./minikube ip) +pe "for i in \$(seq 1 10); do curl http://$ip:31000; echo; sleep 0.4; done" p "# Yay" diff --git a/demo/hello-from.yml b/demo/hello-deployment.yml similarity index 72% rename from demo/hello-from.yml rename to demo/hello-deployment.yml index 544de46f2043..09f2d67ab816 100644 --- a/demo/hello-from.yml +++ b/demo/hello-deployment.yml @@ -2,7 +2,7 @@ apiVersion: apps/v1beta1 kind: Deployment metadata: - name: hello-from + name: hello spec: replicas: 4 strategy: @@ -12,9 +12,10 @@ spec: template: metadata: labels: - app: hello-from + app: hello spec: affinity: + # ⬇⬇⬇ This ensures pods will land on separate hosts podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: @@ -27,17 +28,3 @@ spec: - name: http containerPort: 80 terminationGracePeriodSeconds: 1 ---- -apiVersion: v1 -kind: Service -metadata: - name: hello-from -spec: - type: NodePort - selector: - app: hello-from - ports: - - protocol: TCP - nodePort: 31000 - port: 80 - targetPort: http diff --git a/demo/hello-svc.yml b/demo/hello-svc.yml new file mode 100644 index 000000000000..9109a339a4a6 --- /dev/null +++ b/demo/hello-svc.yml @@ -0,0 +1,14 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: hello +spec: + type: NodePort + selector: + app: hello + ports: + - protocol: TCP + nodePort: 31000 + port: 80 + targetPort: http diff --git a/demo/minikube b/demo/minikube new file mode 120000 index 000000000000..b1b179796b64 --- /dev/null +++ b/demo/minikube @@ -0,0 +1 @@ +../out/minikube \ No newline at end of file From f23ae36e6c04148caef0bbe545d41b38975d8ad7 Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 12:03:27 -0500 Subject: [PATCH 36/42] Add PoC notes --- multi-node-poc.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ multi-node.md | 48 ------------------------------------- 2 files changed, 60 insertions(+), 48 deletions(-) create mode 100644 multi-node-poc.md delete mode 100644 multi-node.md diff --git a/multi-node-poc.md b/multi-node-poc.md new file mode 100644 index 000000000000..0ce2a8e29529 --- /dev/null +++ b/multi-node-poc.md @@ -0,0 +1,60 @@ +# multi-node PoC + +## How to use + +* Check out this branch +* Build minikube using `make out/minikube` (see [Build Guide](docs/contributors/build_guide.md) for more info) +* Run custom binary for all operations, eg: + + ```shell + out/minikube start + out/minikube node add node-1 + out/minikube node start + ``` + +## Current setup and limitations + +### Features + +* Pods can communicate across nodes +* Nodes get non-overlapping subnets for pod IPs +* Theoretically, various CNIs can be used + +### Limitations + +* Tested only with this combination: + * `minikube-darwin-amd64` build, based off v0.24.1 revision + * virtualbox driver + * kubernetes v1.8.0 + * flanneld CNI plugin v0.9.1 +* Only works with `kubeadm` bootstrapper (using `kubeadm join` command) +* Code is hacked-in, minimal refactoring done + * A much cleaner refactoring would be needed to implement in a sustainable way +* CNI (in this case, flannel) is deployed manually, out-of-band (see [kube-flannel.yml](demo/kube-flannel.yml)) +* Pods must be started only after CNI is up and running, otherwise they get a host-local IP instead of a cluster-routable one. +* Hard-coded pod subnets in CNI config (set up for `flannel`) + * Same subnet must be used in `controller-manager` config _AND_ in `flannel` config + * Currently hard-coded to `10.244.0.0/16` for flannel +* Some components are explicitly told to use `eth1` address, as `eth0` is not externally routable in the Virtualbox config provided by `libmachine`: + * `kubelet` + * `flannel` +* All nodes share the same configuration, including CPU, disk, and memory capacity + +### Bugs + +* Deleting the cluster with `minikube delete` will not delete node data and will cause subsequent node starts to crash if the nodes have the same name. + +To fix this you must: + +* Remove the nodes one by one with `minikube node remove ` _before_ deleting the minikube cluster + +_or_ + +* Delete Virtualbox VMs manually +* Delete the machine data folders manually with: + + ```shell + rm -r ~/.minikube/machines/minikube-*/ + ``` + + where your minikube config path is `~/.minikube` and the minikube profile name is `minikube` (the default) diff --git a/multi-node.md b/multi-node.md deleted file mode 100644 index b157f99dca55..000000000000 --- a/multi-node.md +++ /dev/null @@ -1,48 +0,0 @@ - -## Current setup and limitations - -* tested only with virtualbox -* pods can communicate across nodes -* nodes get non-overlapping subnets for pod IPs -* CNI is deployed manually, out-of-band -* hard-coded pod subnets in CNI config (set up for `flannel`) -* some components are explicitly told to use `eth1` -* code is hacked-in, minimal refactoring done - - -## TODO: - -* Parameterize machine name -* Start worker nodes -* Configure worker nodes - -## Usage - -## Add node - -``` -minikube node add [--cluster=default] --name=[] -``` - -``` -minikube node start -``` - -### Cluster - -* create -* delete -* add node - -### Node - -* create -* delete -* start -* stop - -### Bootstrapper - -* configure -* start -* restart From a584b696dd08e697af8f4f1536622496c1ecdad5 Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 12:48:28 -0500 Subject: [PATCH 37/42] Tweak demo --- demo/demo.sh | 23 ++++++++++++----------- demo/minikube | 1 - 2 files changed, 12 insertions(+), 12 deletions(-) delete mode 120000 demo/minikube diff --git a/demo/demo.sh b/demo/demo.sh index d1ef77e27b79..c36f5cb77769 100755 --- a/demo/demo.sh +++ b/demo/demo.sh @@ -5,34 +5,35 @@ cd "$(dirname $0)" || exit source demo-magic.sh -n -TYPE_SPEED=15 DEMO_PROMPT="${CYAN}$ " +MINIKUBE_CMD="../out/minikube" +TYPE_SPEED=15 p "# In this demo I will start up a 4-node minikube cluster." p "# Three workers and one server" p "" p "# Start minikube master ..." -pe "./minikube start" +pe "$MINIKUBE_CMD start" p "" -pe "./minikube node list" +pe "$MINIKUBE_CMD node list" p "" p "# Add some nodes ..." -pe "./minikube node add" -pe "./minikube node add" -pe "./minikube node add" +pe "$MINIKUBE_CMD node add" +pe "$MINIKUBE_CMD node add" +pe "$MINIKUBE_CMD node add" p "" -pe "./minikube node list" +pe "$MINIKUBE_CMD node list" p "" p "# Start nodes ..." -pe "./minikube node start" +pe "$MINIKUBE_CMD node start" p "" -pe "./minikube node list" +pe "$MINIKUBE_CMD node list" sleep 10 @@ -65,10 +66,10 @@ pe "# Note Pod IPs ..." pe "kubectl get pod -o wide" p "" -pe "./minikube service list" +pe "$MINIKUBE_CMD service list" p "" -ip=$(./minikube ip) +ip=$($MINIKUBE_CMD ip) pe "for i in \$(seq 1 10); do curl http://$ip:31000; echo; sleep 0.4; done" p "# Yay" diff --git a/demo/minikube b/demo/minikube deleted file mode 120000 index b1b179796b64..000000000000 --- a/demo/minikube +++ /dev/null @@ -1 +0,0 @@ -../out/minikube \ No newline at end of file From 1b87e55969e91426dac9950ef0ae6a7ba1414a86 Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 22:53:59 -0500 Subject: [PATCH 38/42] Add design concerns to doc --- multi-node-poc.md | 93 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 10 deletions(-) diff --git a/multi-node-poc.md b/multi-node-poc.md index 0ce2a8e29529..c1829ee1fcc7 100644 --- a/multi-node-poc.md +++ b/multi-node-poc.md @@ -18,7 +18,7 @@ * Pods can communicate across nodes * Nodes get non-overlapping subnets for pod IPs -* Theoretically, various CNIs can be used +* Theoretically, different CNIs can be used ### Limitations @@ -42,19 +42,92 @@ ### Bugs +* kube-dns Pods need to be deleted and re-created after CNI is installed + + This is because they will not have be in the right subnet when they are first started. + * Deleting the cluster with `minikube delete` will not delete node data and will cause subsequent node starts to crash if the nodes have the same name. -To fix this you must: + To fix this you must: -* Remove the nodes one by one with `minikube node remove ` _before_ deleting the minikube cluster + * Remove the nodes one by one with `minikube node remove ` _before_ deleting the minikube cluster -_or_ + _or_ -* Delete Virtualbox VMs manually -* Delete the machine data folders manually with: + * Delete Virtualbox VMs manually + * Delete the machine data folders manually with: - ```shell - rm -r ~/.minikube/machines/minikube-*/ - ``` + ```shell + rm -r ~/.minikube/machines/minikube-*/ + ``` + + where your minikube config path is `~/.minikube` and the minikube profile name is `minikube` (the default) + +## Design concerns + +### UX + +* What should commands look like? + + `minikube node [subcommand]` ? + + Where `subcommand` is: + + * add + * remove + * start + * stop + * ssh + * docker-env + * status + * list + +### Drivers + +* Can all drivers (except `none`) support multi-node? Would it require a lot of custom code for each driver? + + From my experience with the Virtualbox setup, the main requirement is that each node have a unique IP that is routable among all nodes. Most network plugins require layer 2 connectivity between the nodes. This should not be a problem in a local VM network. + +### Local docker images + +* A useful pattern with a single node is to be able to run `eval "$(minikube docker-env)"` and push images directly to the local docker node's daemon. With multiple nodes this becomes trickier. + + There may be some clever solutions to this, but the simplest one is probably just some documentation or helper scrips that allow one to run `docker push` (or other commands) against all the nodes in a loop. + +### Networking + +Multi-node networking requires: + +* subnet allocation for each node +* out-of-band network control/routing plane via CNI or out-of-band agents + +For single-node setups, this is not required. + +* What's a good way to accommodate multi-node without increasing complexity for single-node setups? + + Perhaps multi-node networking could be installed by minikube only after a worker node is added, so for single-node setups no extra complexity is introduced? + +* Should minikube be responsible for configuring the network? + + In my opinion, yes, but it should be overrideable by the user. + +* How should we set up networking? CNI plugin, or out-of-band daemon? + + From what I understand, CNI allows the kubelet to set up networking on-demand, whereas an out-of-band daemon needs to hook into docker's configuration and set up `docker0`'s subnet at startup. + + It seems like CNI would be easier to implement, as it can be deployed as a daemonset via the Kube API. + +* How do we ensure that networking is set up before any other pods are deployed? + + A taint might help with this. It could be removed after CNI is installed + +* How do we transition into multi-node networking from single-node if Pods are already running with node-local subnets? + + This is not an issue if CNI is always installed, and there is no distinction between single-node and multi-node networking. + + +### Bootstrappers + +* Do we support both `localkube` and `kubeadm`? - where your minikube config path is `~/.minikube` and the minikube profile name is `minikube` (the default) +kubeadm is designed for multi-node whereas localkube is not. Is it reasonable to say that multi-node is only supported by `kubeadm`? From ec28c4bc35a367c0c2bf8d4b0d0889dbbf3d258e Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 22:58:18 -0500 Subject: [PATCH 39/42] Rename doc --- multi-node-poc.md => multi-node-prototype.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename multi-node-poc.md => multi-node-prototype.md (99%) diff --git a/multi-node-poc.md b/multi-node-prototype.md similarity index 99% rename from multi-node-poc.md rename to multi-node-prototype.md index c1829ee1fcc7..77970d8292c4 100644 --- a/multi-node-poc.md +++ b/multi-node-prototype.md @@ -1,4 +1,4 @@ -# multi-node PoC +# multi-node prototype ## How to use From ca131c79f4fc50a693ac1765d11e4bb728b84e67 Mon Sep 17 00:00:00 2001 From: pbitty Date: Sat, 10 Feb 2018 23:08:06 -0500 Subject: [PATCH 40/42] Move demo and docs --- multi-node-prototype.md => docs/multi-node-prototype.md | 0 {demo => multi-node-demo}/demo-magic.sh | 0 {demo => multi-node-demo}/demo.sh | 0 {demo => multi-node-demo}/hello-deployment.yml | 0 {demo => multi-node-demo}/hello-svc.yml | 0 {demo => multi-node-demo}/kube-flannel.yml | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename multi-node-prototype.md => docs/multi-node-prototype.md (100%) rename {demo => multi-node-demo}/demo-magic.sh (100%) rename {demo => multi-node-demo}/demo.sh (100%) rename {demo => multi-node-demo}/hello-deployment.yml (100%) rename {demo => multi-node-demo}/hello-svc.yml (100%) rename {demo => multi-node-demo}/kube-flannel.yml (100%) diff --git a/multi-node-prototype.md b/docs/multi-node-prototype.md similarity index 100% rename from multi-node-prototype.md rename to docs/multi-node-prototype.md diff --git a/demo/demo-magic.sh b/multi-node-demo/demo-magic.sh similarity index 100% rename from demo/demo-magic.sh rename to multi-node-demo/demo-magic.sh diff --git a/demo/demo.sh b/multi-node-demo/demo.sh similarity index 100% rename from demo/demo.sh rename to multi-node-demo/demo.sh diff --git a/demo/hello-deployment.yml b/multi-node-demo/hello-deployment.yml similarity index 100% rename from demo/hello-deployment.yml rename to multi-node-demo/hello-deployment.yml diff --git a/demo/hello-svc.yml b/multi-node-demo/hello-svc.yml similarity index 100% rename from demo/hello-svc.yml rename to multi-node-demo/hello-svc.yml diff --git a/demo/kube-flannel.yml b/multi-node-demo/kube-flannel.yml similarity index 100% rename from demo/kube-flannel.yml rename to multi-node-demo/kube-flannel.yml From 65d1bf72c1eaf5ce5ce05dee0cc25f00c5d1e21f Mon Sep 17 00:00:00 2001 From: pbitty Date: Sun, 11 Feb 2018 08:35:53 -0500 Subject: [PATCH 41/42] Run gofmt --- cmd/minikube/cmd/stop.go | 3 +-- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cmd/minikube/cmd/stop.go b/cmd/minikube/cmd/stop.go index 8a2e89d20e50..8359f7342433 100644 --- a/cmd/minikube/cmd/stop.go +++ b/cmd/minikube/cmd/stop.go @@ -23,9 +23,8 @@ import ( "github.com/spf13/cobra" cmdUtil "k8s.io/minikube/cmd/util" "k8s.io/minikube/pkg/minikube/cluster" - "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/machine" - ) // stopCmd represents the stop command diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index 9df4f06a5add..60996058b0df 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -32,7 +32,7 @@ import ( "github.com/pkg/errors" "golang.org/x/sync/errgroup" "k8s.io/minikube/pkg/minikube/assets" - "k8s.io/minikube/pkg/minikube/bootstrapper" + "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/bootstrapper/runner" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" @@ -82,10 +82,10 @@ func NewKubeadmBootstrapperForMachine(machineName string, api libmachine.API) (* func NewKubeadmBootstrapperForRunner(machineName, ip string, c runner.CommandRunner) *KubeadmBootstrapper { return &KubeadmBootstrapper{ - c: c, - ip: ip, - machineName: machineName, - } + c: c, + ip: ip, + machineName: machineName, + } } //TODO(r2d4): This should most likely check the health of the apiserver From c9879732ab22cd589bb40d4838fd4d0ce00ca52d Mon Sep 17 00:00:00 2001 From: pbitty Date: Sun, 11 Feb 2018 09:02:45 -0500 Subject: [PATCH 42/42] Add Motivation section to doc --- docs/multi-node-prototype.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/multi-node-prototype.md b/docs/multi-node-prototype.md index 77970d8292c4..bf883bdf727d 100644 --- a/docs/multi-node-prototype.md +++ b/docs/multi-node-prototype.md @@ -1,5 +1,27 @@ # multi-node prototype +## Motivation + +This was inspired by the requests in https://github.com/kubernetes/minikube/issues/94. Having multiple Kubernetes nodes in minikube allows one to test and play around with Kubernetes features that are not available in a single-node cluster. + +Some examples: + +* Scheduling behavior based on + * Resource allocation + * Node selector + * Anti-affinity + * Taints + +* Networking layer + * Experimenting with different CNI plugins and configurations + +* Self-healing + * Simulating node failure + +* Developing Kube components + * Use a multi-node cluster to reproduce kube bugs + * Deploy custom binaries built locally? + ## How to use * Check out this branch