ELIOT Command Line Interface Commit
[eliot.git] / blueprints / common / elcli / elcli / cmd / join.go
1 /*
2 Package cmd
3 Copyright © 2019 NAME HERE <EMAIL ADDRESS>
4
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
8
9     http://www.apache.org/licenses/LICENSE-2.0
10
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16 */
17
18 package cmd
19
20 import (
21         "fmt"
22
23         "github.com/spf13/cobra"
24         "github.com/spf13/pflag"
25         types "elcli/cmd/common"
26         "elcli/cmd/util"
27 )
28
29 var joinOptions = &types.JoinOptions{}
30
31 // joinCmd represents the join command
32 var joinCmd = &cobra.Command{
33         Use:   "join",
34         Short: "A brief description of your command",
35         Long: `A longer description that spans multiple lines and likely contains examples
36         and usage of using your command. For example:
37         
38         Cobra is a CLI library for Go that empowers applications.
39         This application is a tool to generate the needed files
40         to quickly create a Cobra application.`,
41
42         RunE: func(cmd *cobra.Command, args []string) error {
43                 fmt.Println("join called")
44
45                 tools := make(map[string]types.ToolsInstaller, 0)
46                 flagVals := make(map[string]types.FlagData, 0)
47
48                 checkFlags := func(f *pflag.Flag) {
49                         util.AddToolVals(f, flagVals)
50                 }
51                 cmd.Flags().VisitAll(checkFlags)
52
53                 //joinOptions := &types.JoinOptions{}
54                 joinOptions = newJoinOptions()
55
56                 Add2ToolsList(tools, flagVals, joinOptions)
57                 return ExecuteTool(tools)
58
59         },
60 }
61
62 func init() {
63                 
64         // Join Command added as sub-command for main command : elcli
65         rootCmd.AddCommand(joinCmd)
66
67         joinCmd.Flags().StringVar(&joinOptions.DockerVersion, types.DockerVersion, joinOptions.DockerVersion,
68                 "Use this key to download and use the required Docker version")
69         joinCmd.Flags().Lookup(types.DockerVersion).NoOptDefVal = joinOptions.DockerVersion
70
71         joinCmd.Flags().StringVar(&joinOptions.KubernetesVersion, types.KubernetesVersion, joinOptions.KubernetesVersion,
72                 "Use this key to download and use the required Kubernetes version")
73         joinCmd.Flags().Lookup(types.KubernetesVersion).NoOptDefVal = joinOptions.KubernetesVersion
74
75         joinCmd.Flags().StringVar(&joinOptions.K8SImageRepository, types.K8SImageRepository, joinOptions.K8SImageRepository,
76                 "Use this key to set the Kubernetes docker image repository")
77         joinCmd.Flags().Lookup(types.K8SImageRepository).NoOptDefVal = joinOptions.K8SImageRepository
78
79 }
80
81
82 func newJoinOptions() *types.JoinOptions {
83         fmt.Println("Inside newJointOptions Method.....")
84         opts := &types.JoinOptions{}
85         opts.InitOptions = types.InitOptions{DockerVersion: types.DefaultDockerVersion, KubernetesVersion: types.DefaultK8SVersion}
86         //opts.CertPath = types.DefaultCertPath
87         return opts
88 }
89
90
91 //Add2ToolsList Reads the flagData (containing val and default val) and join options to fill the list of tools.
92 func Add2ToolsList(toolList map[string]types.ToolsInstaller, flagData map[string]types.FlagData, joinOptions *types.JoinOptions) {
93
94         var k8sVer, dockerVer string
95         /*var k8sImageRepo string
96
97         flgData, ok := flagData[types.K8SImageRepository]
98         if ok {
99                 k8sImageRepo = util.CheckIfAvailable(flgData.Val.(string), flgData.DefVal.(string))
100         } else {
101                 k8sImageRepo = joinOptions.K8SImageRepository
102         }
103
104         */
105
106         //toolList["EliotEdge"] = &util.KubeEdgeInstTool{Common: util.Common{ToolVersion: kubeVer}, K8SApiServerIP: joinOptions.K8SAPIServerIPPort,
107         //      CloudCoreIP: joinOptions.CloudCoreIP, EdgeNodeID: joinOptions.EdgeNodeID}
108
109         flgData, ok := flagData[types.DockerVersion]
110         if ok {
111                 dockerVer = util.CheckIfAvailable(flgData.Val.(string), flgData.DefVal.(string))
112         } else {
113                 dockerVer = joinOptions.DockerVersion
114         }
115         toolList["Docker"] = &util.DockerInstTool{Common: util.Common{ToolVersion: dockerVer}, DefaultToolVer: flgData.DefVal.(string)}
116
117         
118         flgData, ok = flagData[types.KubernetesVersion]
119         if ok {
120                 k8sVer = util.CheckIfAvailable(flgData.Val.(string), flgData.DefVal.(string))
121         } else {
122                 k8sVer = joinOptions.KubernetesVersion
123         }
124         toolList["Kubernetes"] = &util.K8SInstTool{Common: util.Common{ToolVersion: k8sVer}, IsEdgeNode: false, DefaultToolVer: flgData.DefVal.(string)}
125
126
127 }
128
129 //ExecuteTool the instalation for each tool and start edgecore
130 func ExecuteTool(toolList map[string]types.ToolsInstaller) error {
131
132         //Install all the required pre-requisite tools
133         for name, tool := range toolList {
134                 if name != "EliotEdge" {
135                         err := tool.InstallTools()
136                         if err != nil {
137                                 return err
138                         }
139                 }
140         }
141
142         //Install and Start ElioteEdge Node
143         return toolList["ElioteEdge"].InstallTools()
144 }