func()

in pkg/skoop/context/cluster.go [60:129]


func (c *Context) BuildCluster() error {
	//TODO cluster的一些信息是不是应该放到provider中
	restConfig, _, err := utils.NewConfig(c.ClusterConfig().KubeConfigPath)
	if err != nil {
		return fmt.Errorf("error init kubernetes client from %v, error: %v", c.ClusterConfig().KubeConfigPath, err)
	}
	clientSet, err := kubernetes.NewForConfig(restConfig)
	if err != nil {
		return fmt.Errorf("error init kubernetes rest client from %v, error: %v", c.ClusterConfig().KubeConfigPath, err)
	}
	SkoopContext.Ctx.Store(kubernetesRestConfigKey, restConfig)
	SkoopContext.Ctx.Store(kubernetesClientKey, clientSet)
	c.ClusterConfig().IPCache = k8s.NewIPCache(clientSet)

	if c.ClusterConfig().NetworkPlugin == "" {
		plugin, err := utils.DetectNetworkPlugin(clientSet)
		if err != nil {
			return err
		}
		if plugin == "" {
			return errors.New("cannot auto detect network plugin, you can use \"--network-plugin\" to specify it, " +
				"supported plugins: flannel,calico")
		}
		c.ClusterConfig().NetworkPlugin = plugin
		klog.V(3).Infof("Detected network plugin %q.", plugin)
	} else {
		klog.V(3).Infof("Use provided network plugin %q.", c.ClusterConfig().NetworkPlugin)
	}

	if c.ClusterConfig().ProxyMode == "" {
		mode, err := utils.DetectKubeProxyMode(clientSet)
		if err != nil {
			return fmt.Errorf("cannot auto detect kube-proxy mode: %v, you can use \"--proxy-mode\" to specify it", err)
		}
		if mode == "" {
			return fmt.Errorf("cannot auto detect kube-proxy mode, you can use \"--proxy-mode\" to specify it")
		}

		c.ClusterConfig().ProxyMode = mode
		klog.V(3).Infof("Detected kube-proxy mode %q", mode)
	} else {
		klog.V(3).Infof("Use provided kube-proxy mode %q", c.ClusterConfig().ProxyMode)
	}

	if c.ClusterConfig().ClusterCIDRString == "" {
		clusterCIDR, err := utils.DetectClusterCIDR(clientSet)
		if err != nil {
			return fmt.Errorf("cannot auto detect cluster cidr: %v, you can use \"--cluster-cidr\" to specify it", err)
		}
		if clusterCIDR == "" {
			return fmt.Errorf("cannot auto detect clutser cidr, you can use \"--cluster-cidr\" to specify it")
		}

		_, cidr, err := net.ParseCIDR(clusterCIDR)
		if err != nil {
			return fmt.Errorf("cannot parse cluster cidr: %v", err)
		}
		c.ClusterConfig().ClusterCIDR = cidr
		klog.V(3).Infof("Detected cluster cidr %q", cidr)
	} else {
		_, cidr, err := net.ParseCIDR(c.ClusterConfig().ClusterCIDRString)
		if err != nil {
			return fmt.Errorf("cannot parse cluster cidr: %v", err)
		}
		c.ClusterConfig().ClusterCIDR = cidr
		klog.V(3).Infof("Use provided cluster cidr %q", c.ClusterConfig().ClusterCIDRString)
	}

	return nil
}