2017-11-20 22:23:50 +00:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
2019-05-28 18:51:53 +00:00
|
|
|
"context"
|
2017-11-20 22:23:50 +00:00
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
2018-08-30 20:55:24 +00:00
|
|
|
"reflect"
|
2017-11-20 22:23:50 +00:00
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
2019-10-09 20:12:18 +00:00
|
|
|
"github.com/rancher/rke/metadata"
|
|
|
|
|
2017-11-20 22:23:50 +00:00
|
|
|
"github.com/rancher/rke/cluster"
|
2018-02-06 19:25:54 +00:00
|
|
|
"github.com/rancher/rke/pki"
|
2017-11-20 22:23:50 +00:00
|
|
|
"github.com/rancher/rke/services"
|
2020-07-11 16:24:19 +00:00
|
|
|
v3 "github.com/rancher/rke/types"
|
2017-11-20 22:23:50 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/urfave/cli"
|
2017-12-05 16:55:58 +00:00
|
|
|
"gopkg.in/yaml.v2"
|
2017-11-20 22:23:50 +00:00
|
|
|
)
|
|
|
|
|
2017-12-05 01:29:29 +00:00
|
|
|
const (
|
2017-12-09 11:53:38 +00:00
|
|
|
comments = `# If you intened to deploy Kubernetes in an air-gapped environment,
|
2017-12-05 01:29:29 +00:00
|
|
|
# please consult the documentation on how to configure custom RKE images.`
|
|
|
|
)
|
|
|
|
|
2017-11-20 22:23:50 +00:00
|
|
|
func ConfigCommand() cli.Command {
|
|
|
|
return cli.Command{
|
2017-12-21 19:03:47 +00:00
|
|
|
Name: "config",
|
|
|
|
Usage: "Setup cluster configuration",
|
|
|
|
Action: clusterConfig,
|
2017-11-20 22:23:50 +00:00
|
|
|
Flags: []cli.Flag{
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "name,n",
|
|
|
|
Usage: "Name of the configuration file",
|
2018-02-06 19:25:54 +00:00
|
|
|
Value: pki.ClusterConfig,
|
2017-11-20 22:23:50 +00:00
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "empty,e",
|
|
|
|
Usage: "Generate Empty configuration file",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "print,p",
|
|
|
|
Usage: "Print configuration",
|
|
|
|
},
|
2018-08-30 20:55:24 +00:00
|
|
|
cli.BoolFlag{
|
2019-08-23 19:51:34 +00:00
|
|
|
Name: "system-images,s",
|
2018-08-30 20:55:24 +00:00
|
|
|
Usage: "Generate the default system images",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
2019-08-23 19:51:34 +00:00
|
|
|
Name: "list-version,l",
|
|
|
|
Usage: "List the default kubernetes version",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "all,a",
|
|
|
|
Usage: "Used with -s and -l, get all available versions",
|
2018-08-30 20:55:24 +00:00
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "version",
|
|
|
|
Usage: "Generate the default system images for specific k8s versions",
|
|
|
|
},
|
2017-11-20 22:23:50 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getConfig(reader *bufio.Reader, text, def string) (string, error) {
|
|
|
|
for {
|
2017-11-28 17:45:24 +00:00
|
|
|
if def == "" {
|
2017-12-21 19:03:47 +00:00
|
|
|
fmt.Printf("[+] %s [%s]: ", text, "none")
|
2017-11-28 17:45:24 +00:00
|
|
|
} else {
|
2017-12-21 19:03:47 +00:00
|
|
|
fmt.Printf("[+] %s [%s]: ", text, def)
|
2017-11-28 17:45:24 +00:00
|
|
|
}
|
2017-11-20 22:23:50 +00:00
|
|
|
input, err := reader.ReadString('\n')
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
input = strings.TrimSpace(input)
|
|
|
|
|
|
|
|
if input != "" {
|
|
|
|
return input, nil
|
|
|
|
}
|
|
|
|
return def, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-05 16:55:58 +00:00
|
|
|
func writeConfig(cluster *v3.RancherKubernetesEngineConfig, configFile string, print bool) error {
|
2017-11-20 22:23:50 +00:00
|
|
|
yamlConfig, err := yaml.Marshal(*cluster)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
logrus.Debugf("Deploying cluster configuration file: %s", configFile)
|
|
|
|
|
2017-12-05 01:29:29 +00:00
|
|
|
configString := fmt.Sprintf("%s\n%s", comments, string(yamlConfig))
|
2017-11-20 22:23:50 +00:00
|
|
|
if print {
|
2017-12-05 01:29:29 +00:00
|
|
|
fmt.Printf("Configuration File: \n%s", configString)
|
2017-11-20 22:23:50 +00:00
|
|
|
return nil
|
|
|
|
}
|
2017-12-05 01:29:29 +00:00
|
|
|
return ioutil.WriteFile(configFile, []byte(configString), 0640)
|
2017-11-20 22:23:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func clusterConfig(ctx *cli.Context) error {
|
2019-10-09 20:12:18 +00:00
|
|
|
if metadata.K8sVersionToRKESystemImages == nil {
|
|
|
|
err := metadata.InitMetadata(context.Background())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2019-05-28 18:51:53 +00:00
|
|
|
}
|
2019-10-09 20:12:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ctx.Bool("system-images") {
|
2018-08-30 20:55:24 +00:00
|
|
|
return generateSystemImagesList(ctx.String("version"), ctx.Bool("all"))
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
|
|
|
|
if ctx.Bool("list-version") {
|
|
|
|
if metadata.K8sVersionToRKESystemImages == nil {
|
|
|
|
err := metadata.InitMetadata(context.Background())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return generateK8sVersionList(ctx.Bool("all"))
|
|
|
|
}
|
|
|
|
|
2017-11-20 22:23:50 +00:00
|
|
|
configFile := ctx.String("name")
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig := v3.RancherKubernetesEngineConfig{}
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2019-08-23 19:51:34 +00:00
|
|
|
// Get engineConfig config from user
|
2017-11-20 22:23:50 +00:00
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
|
|
|
|
// Generate empty configuration file
|
|
|
|
if ctx.Bool("empty") {
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Nodes = make([]v3.RKEConfigNode, 1)
|
|
|
|
return writeConfig(&engineConfig, configFile, ctx.Bool("print"))
|
2017-11-20 22:23:50 +00:00
|
|
|
}
|
|
|
|
|
2017-12-02 17:07:47 +00:00
|
|
|
sshKeyPath, err := getConfig(reader, "Cluster Level SSH Private Key Path", "~/.ssh/id_rsa")
|
2017-11-28 17:45:24 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.SSHKeyPath = sshKeyPath
|
2017-11-28 17:45:24 +00:00
|
|
|
|
2017-11-20 22:23:50 +00:00
|
|
|
// Get number of hosts
|
2017-12-21 19:03:47 +00:00
|
|
|
numberOfHostsString, err := getConfig(reader, "Number of Hosts", "1")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
numberOfHostsInt, err := strconv.Atoi(numberOfHostsString)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get Hosts config
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Nodes = make([]v3.RKEConfigNode, 0)
|
2017-11-20 22:23:50 +00:00
|
|
|
for i := 0; i < numberOfHostsInt; i++ {
|
2019-08-23 19:51:34 +00:00
|
|
|
hostCfg, err := getHostConfig(reader, i, engineConfig.SSHKeyPath)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Nodes = append(engineConfig.Nodes, *hostCfg)
|
2017-11-20 22:23:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get Network config
|
|
|
|
networkConfig, err := getNetworkConfig(reader)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Network = *networkConfig
|
2017-11-20 22:23:50 +00:00
|
|
|
|
|
|
|
// Get Authentication Config
|
2017-12-14 21:56:19 +00:00
|
|
|
authnConfig, err := getAuthnConfig(reader)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Authentication = *authnConfig
|
2017-12-14 21:56:19 +00:00
|
|
|
|
|
|
|
// Get Authorization config
|
|
|
|
authzConfig, err := getAuthzConfig(reader)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Authorization = *authzConfig
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2018-06-18 20:11:47 +00:00
|
|
|
// Get k8s/system images
|
|
|
|
systemImages, err := getSystemImagesConfig(reader)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.SystemImages = *systemImages
|
2018-06-18 20:11:47 +00:00
|
|
|
|
2017-11-20 22:23:50 +00:00
|
|
|
// Get Services Config
|
|
|
|
serviceConfig, err := getServiceConfig(reader)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.Services = *serviceConfig
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2018-04-03 15:47:52 +00:00
|
|
|
//Get addon manifests
|
|
|
|
addonsInclude, err := getAddonManifests(reader)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(addonsInclude) > 0 {
|
2019-08-23 19:51:34 +00:00
|
|
|
engineConfig.AddonsInclude = append(engineConfig.AddonsInclude, addonsInclude...)
|
2018-04-03 15:47:52 +00:00
|
|
|
}
|
|
|
|
|
2019-08-23 19:51:34 +00:00
|
|
|
return writeConfig(&engineConfig, configFile, ctx.Bool("print"))
|
2017-11-20 22:23:50 +00:00
|
|
|
}
|
|
|
|
|
2017-12-21 19:03:47 +00:00
|
|
|
func getHostConfig(reader *bufio.Reader, index int, clusterSSHKeyPath string) (*v3.RKEConfigNode, error) {
|
2017-12-05 16:55:58 +00:00
|
|
|
host := v3.RKEConfigNode{}
|
2017-12-02 17:07:47 +00:00
|
|
|
|
2017-11-28 17:45:24 +00:00
|
|
|
address, err := getConfig(reader, fmt.Sprintf("SSH Address of host (%d)", index+1), "")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-11-28 17:45:24 +00:00
|
|
|
host.Address = address
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2018-01-19 18:42:42 +00:00
|
|
|
port, err := getConfig(reader, fmt.Sprintf("SSH Port of host (%d)", index+1), cluster.DefaultSSHPort)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
host.Port = port
|
|
|
|
|
2017-12-02 17:07:47 +00:00
|
|
|
sshKeyPath, err := getConfig(reader, fmt.Sprintf("SSH Private Key Path of host (%s)", address), "")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-12-21 19:03:47 +00:00
|
|
|
if len(sshKeyPath) == 0 {
|
|
|
|
fmt.Printf("[-] You have entered empty SSH key path, trying fetch from SSH key parameter\n")
|
|
|
|
sshKey, err := getConfig(reader, fmt.Sprintf("SSH Private Key of host (%s)", address), "")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(sshKey) == 0 {
|
|
|
|
fmt.Printf("[-] You have entered empty SSH key, defaulting to cluster level SSH key: %s\n", clusterSSHKeyPath)
|
|
|
|
host.SSHKeyPath = clusterSSHKeyPath
|
|
|
|
} else {
|
|
|
|
host.SSHKey = sshKey
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
host.SSHKeyPath = sshKeyPath
|
2017-12-02 17:07:47 +00:00
|
|
|
}
|
|
|
|
|
2017-11-28 17:45:24 +00:00
|
|
|
sshUser, err := getConfig(reader, fmt.Sprintf("SSH User of host (%s)", address), "ubuntu")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-11-28 17:45:24 +00:00
|
|
|
host.User = sshUser
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2018-07-21 11:41:18 +00:00
|
|
|
isControlHost, err := getConfig(reader, fmt.Sprintf("Is host (%s) a Control Plane host (y/n)?", address), "y")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if isControlHost == "y" || isControlHost == "Y" {
|
|
|
|
host.Role = append(host.Role, services.ControlRole)
|
|
|
|
}
|
|
|
|
|
2018-07-21 11:41:18 +00:00
|
|
|
isWorkerHost, err := getConfig(reader, fmt.Sprintf("Is host (%s) a Worker host (y/n)?", address), "n")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if isWorkerHost == "y" || isWorkerHost == "Y" {
|
|
|
|
host.Role = append(host.Role, services.WorkerRole)
|
|
|
|
}
|
|
|
|
|
2018-07-21 11:41:18 +00:00
|
|
|
isEtcdHost, err := getConfig(reader, fmt.Sprintf("Is host (%s) an etcd host (y/n)?", address), "n")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if isEtcdHost == "y" || isEtcdHost == "Y" {
|
|
|
|
host.Role = append(host.Role, services.ETCDRole)
|
|
|
|
}
|
|
|
|
|
2017-11-28 17:45:24 +00:00
|
|
|
hostnameOverride, err := getConfig(reader, fmt.Sprintf("Override Hostname of host (%s)", address), "")
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-11-28 17:45:24 +00:00
|
|
|
host.HostnameOverride = hostnameOverride
|
|
|
|
|
|
|
|
internalAddress, err := getConfig(reader, fmt.Sprintf("Internal IP of host (%s)", address), "")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
host.InternalAddress = internalAddress
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
dockerSocketPath, err := getConfig(reader, fmt.Sprintf("Docker socket path on host (%s)", address), cluster.DefaultDockerSockPath)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
host.DockerSocket = dockerSocketPath
|
|
|
|
return &host, nil
|
|
|
|
}
|
|
|
|
|
2018-06-18 20:11:47 +00:00
|
|
|
func getSystemImagesConfig(reader *bufio.Reader) (*v3.RKESystemImages, error) {
|
2019-05-28 18:51:53 +00:00
|
|
|
imageDefaults := metadata.K8sVersionToRKESystemImages[metadata.DefaultK8sVersion]
|
2018-06-18 20:11:47 +00:00
|
|
|
|
|
|
|
kubeImage, err := getConfig(reader, "Kubernetes Docker image", imageDefaults.Kubernetes)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2019-05-28 18:51:53 +00:00
|
|
|
systemImages, ok := metadata.K8sVersionToRKESystemImages[kubeImage]
|
2018-06-18 20:11:47 +00:00
|
|
|
if ok {
|
|
|
|
return &systemImages, nil
|
|
|
|
}
|
|
|
|
imageDefaults.Kubernetes = kubeImage
|
|
|
|
return &imageDefaults, nil
|
|
|
|
}
|
|
|
|
|
2017-12-05 16:55:58 +00:00
|
|
|
func getServiceConfig(reader *bufio.Reader) (*v3.RKEConfigServices, error) {
|
|
|
|
servicesConfig := v3.RKEConfigServices{}
|
|
|
|
servicesConfig.Etcd = v3.ETCDService{}
|
|
|
|
servicesConfig.KubeAPI = v3.KubeAPIService{}
|
|
|
|
servicesConfig.KubeController = v3.KubeControllerService{}
|
|
|
|
servicesConfig.Scheduler = v3.SchedulerService{}
|
|
|
|
servicesConfig.Kubelet = v3.KubeletService{}
|
|
|
|
servicesConfig.Kubeproxy = v3.KubeproxyService{}
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
clusterDomain, err := getConfig(reader, "Cluster domain", cluster.DefaultClusterDomain)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
servicesConfig.Kubelet.ClusterDomain = clusterDomain
|
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
serviceClusterIPRange, err := getConfig(reader, "Service Cluster IP Range", cluster.DefaultServiceClusterIPRange)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
servicesConfig.KubeAPI.ServiceClusterIPRange = serviceClusterIPRange
|
|
|
|
servicesConfig.KubeController.ServiceClusterIPRange = serviceClusterIPRange
|
|
|
|
|
2017-12-20 01:51:07 +00:00
|
|
|
podSecurityPolicy, err := getConfig(reader, "Enable PodSecurityPolicy", "n")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if podSecurityPolicy == "y" || podSecurityPolicy == "Y" {
|
|
|
|
servicesConfig.KubeAPI.PodSecurityPolicy = true
|
|
|
|
} else {
|
|
|
|
servicesConfig.KubeAPI.PodSecurityPolicy = false
|
|
|
|
}
|
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
clusterNetworkCidr, err := getConfig(reader, "Cluster Network CIDR", cluster.DefaultClusterCIDR)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
servicesConfig.KubeController.ClusterCIDR = clusterNetworkCidr
|
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
clusterDNSServiceIP, err := getConfig(reader, "Cluster DNS Service IP", cluster.DefaultClusterDNSService)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
servicesConfig.Kubelet.ClusterDNSServer = clusterDNSServiceIP
|
|
|
|
|
|
|
|
return &servicesConfig, nil
|
|
|
|
}
|
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
func getAuthnConfig(reader *bufio.Reader) (*v3.AuthnConfig, error) {
|
|
|
|
authnConfig := v3.AuthnConfig{}
|
|
|
|
|
|
|
|
authnType, err := getConfig(reader, "Authentication Strategy", cluster.DefaultAuthStrategy)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
authnConfig.Strategy = authnType
|
|
|
|
return &authnConfig, nil
|
|
|
|
}
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2017-12-14 21:56:19 +00:00
|
|
|
func getAuthzConfig(reader *bufio.Reader) (*v3.AuthzConfig, error) {
|
|
|
|
authzConfig := v3.AuthzConfig{}
|
2017-12-21 19:03:47 +00:00
|
|
|
authzMode, err := getConfig(reader, "Authorization Mode (rbac, none)", cluster.DefaultAuthorizationMode)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-12-14 21:56:19 +00:00
|
|
|
authzConfig.Mode = authzMode
|
|
|
|
return &authzConfig, nil
|
2017-11-20 22:23:50 +00:00
|
|
|
}
|
|
|
|
|
2017-12-05 16:55:58 +00:00
|
|
|
func getNetworkConfig(reader *bufio.Reader) (*v3.NetworkConfig, error) {
|
|
|
|
networkConfig := v3.NetworkConfig{}
|
2017-11-20 22:23:50 +00:00
|
|
|
|
2017-12-21 19:03:47 +00:00
|
|
|
networkPlugin, err := getConfig(reader, "Network Plugin Type (flannel, calico, weave, canal)", cluster.DefaultNetworkPlugin)
|
2017-11-20 22:23:50 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
networkConfig.Plugin = networkPlugin
|
|
|
|
return &networkConfig, nil
|
|
|
|
}
|
2018-04-03 15:47:52 +00:00
|
|
|
|
|
|
|
func getAddonManifests(reader *bufio.Reader) ([]string, error) {
|
|
|
|
var addonSlice []string
|
|
|
|
var resume = true
|
|
|
|
|
2018-07-21 11:41:18 +00:00
|
|
|
includeAddons, err := getConfig(reader, "Add addon manifest URLs or YAML files", "no")
|
2018-04-03 15:47:52 +00:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.ContainsAny(includeAddons, "Yes YES Y yes y") {
|
|
|
|
for resume {
|
|
|
|
addonPath, err := getConfig(reader, "Enter the Path or URL for the manifest", "")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
addonSlice = append(addonSlice, addonPath)
|
|
|
|
|
|
|
|
cont, err := getConfig(reader, "Add another addon", "no")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.ContainsAny(cont, "Yes y Y yes YES") {
|
|
|
|
resume = true
|
|
|
|
} else {
|
|
|
|
resume = false
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return addonSlice, nil
|
|
|
|
}
|
2018-08-30 20:55:24 +00:00
|
|
|
|
2019-08-23 19:51:34 +00:00
|
|
|
func generateK8sVersionList(all bool) error {
|
|
|
|
if !all {
|
|
|
|
fmt.Println(metadata.DefaultK8sVersion)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, version := range metadata.K8sVersionsCurrent {
|
|
|
|
if _, ok := metadata.K8sBadVersions[version]; !ok {
|
|
|
|
fmt.Println(version)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-08-30 20:55:24 +00:00
|
|
|
func generateSystemImagesList(version string, all bool) error {
|
|
|
|
allVersions := []string{}
|
2019-01-24 19:51:02 +00:00
|
|
|
currentVersionImages := make(map[string]v3.RKESystemImages)
|
2019-05-28 18:51:53 +00:00
|
|
|
for _, version := range metadata.K8sVersionsCurrent {
|
|
|
|
if _, ok := metadata.K8sBadVersions[version]; !ok {
|
2019-03-01 18:09:45 +00:00
|
|
|
allVersions = append(allVersions, version)
|
2019-05-28 18:51:53 +00:00
|
|
|
currentVersionImages[version] = metadata.K8sVersionToRKESystemImages[version]
|
2019-01-24 19:20:22 +00:00
|
|
|
}
|
2018-08-30 20:55:24 +00:00
|
|
|
}
|
|
|
|
if all {
|
2019-01-24 19:51:02 +00:00
|
|
|
for version, rkeSystemImages := range currentVersionImages {
|
2019-08-23 19:51:34 +00:00
|
|
|
logrus.Infof("Generating images list for version [%s]:", version)
|
2018-08-30 20:55:24 +00:00
|
|
|
uniqueImages := getUniqueSystemImageList(rkeSystemImages)
|
|
|
|
for _, image := range uniqueImages {
|
|
|
|
if image == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fmt.Printf("%s\n", image)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if len(version) == 0 {
|
2019-05-28 18:51:53 +00:00
|
|
|
version = metadata.DefaultK8sVersion
|
2018-08-30 20:55:24 +00:00
|
|
|
}
|
2019-05-28 18:51:53 +00:00
|
|
|
rkeSystemImages := metadata.K8sVersionToRKESystemImages[version]
|
|
|
|
if _, ok := metadata.K8sBadVersions[version]; ok {
|
|
|
|
return fmt.Errorf("k8s version is not supported, supported versions are: %v", allVersions)
|
2019-03-01 18:09:45 +00:00
|
|
|
}
|
2018-08-30 20:55:24 +00:00
|
|
|
if rkeSystemImages == (v3.RKESystemImages{}) {
|
|
|
|
return fmt.Errorf("k8s version is not supported, supported versions are: %v", allVersions)
|
|
|
|
}
|
2019-08-23 19:51:34 +00:00
|
|
|
logrus.Infof("Generating images list for version [%s]:", version)
|
2018-08-30 20:55:24 +00:00
|
|
|
uniqueImages := getUniqueSystemImageList(rkeSystemImages)
|
|
|
|
for _, image := range uniqueImages {
|
|
|
|
if image == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fmt.Printf("%s\n", image)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func getUniqueSystemImageList(rkeSystemImages v3.RKESystemImages) []string {
|
2019-09-20 16:48:49 +00:00
|
|
|
// windows image not relevant for rke cli
|
|
|
|
rkeSystemImages.WindowsPodInfraContainer = ""
|
2018-08-30 20:55:24 +00:00
|
|
|
imagesReflect := reflect.ValueOf(rkeSystemImages)
|
|
|
|
images := make([]string, imagesReflect.NumField())
|
|
|
|
for i := 0; i < imagesReflect.NumField(); i++ {
|
|
|
|
images[i] = imagesReflect.Field(i).Interface().(string)
|
|
|
|
}
|
|
|
|
return getUniqueSlice(images)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getUniqueSlice(slice []string) []string {
|
|
|
|
encountered := map[string]bool{}
|
|
|
|
unqiue := []string{}
|
|
|
|
|
|
|
|
for i := range slice {
|
|
|
|
if encountered[slice[i]] {
|
|
|
|
continue
|
|
|
|
} else {
|
|
|
|
encountered[slice[i]] = true
|
|
|
|
unqiue = append(unqiue, slice[i])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return unqiue
|
|
|
|
}
|