@@ -46,33 +46,39 @@ func NewClient(kubectlClient *kubernetes.Clientset, log log.Logger, upgradeTille
4646 var outerError error
4747
4848 getOnce .Do (func () {
49- config := configutil .GetConfig ()
50- if config .Tiller == nil || config .Tiller .Namespace == nil {
51- outerError = errors .New ("No tiller namespace specified" )
52- return
53- }
49+ helmClient , outerError = createNewClient (kubectlClient , log , upgradeTiller )
50+ })
5451
55- tillerNamespace := * config .Tiller .Namespace
56- kubeconfig , err := kubectl .GetClientConfig ()
57- if err != nil {
58- outerError = err
59- return
60- }
52+ return helmClient , outerError
53+ }
6154
62- err = ensureTiller (kubectlClient , config , upgradeTiller )
63- if err != nil {
64- outerError = err
65- return
66- }
55+ func createNewClient (kubectlClient * kubernetes.Clientset , log log.Logger , upgradeTiller bool ) (* ClientWrapper , error ) {
56+ config := configutil .GetConfig ()
57+ if config .Tiller == nil || config .Tiller .Namespace == nil {
58+ return nil , errors .New ("No tiller namespace specified" )
59+ }
60+
61+ tillerNamespace := * config .Tiller .Namespace
62+ kubeconfig , err := kubectl .GetClientConfig ()
63+ if err != nil {
64+ return nil , err
65+ }
66+
67+ err = ensureTiller (kubectlClient , config , upgradeTiller )
68+ if err != nil {
69+ return nil , err
70+ }
6771
68- var tunnel * kube.Tunnel
72+ var tunnel * kube.Tunnel
73+ var client * k8shelm.Client
6974
70- tunnelWaitTime := 2 * 60 * time .Second
71- tunnelCheckInterval := 5 * time .Second
75+ tunnelWaitTime := 2 * 60 * time .Second
76+ tunnelCheckInterval := 5 * time .Second
7277
73- log .StartWait ("Waiting for " + tillerNamespace + "/tiller-deploy to become ready" )
74- defer log .StopWait ()
78+ log .StartWait ("Waiting for " + tillerNamespace + "/tiller-deploy to become ready" )
79+ defer log .StopWait ()
7580
81+ for true {
7682 // Next we wait till we can establish a tunnel to the running pod
7783 for true {
7884 tunnel , err = portforwarder .New (tillerNamespace , kubectlClient , kubeconfig )
@@ -81,88 +87,77 @@ func NewClient(kubectlClient *kubernetes.Clientset, log log.Logger, upgradeTille
8187 }
8288
8389 if tunnelWaitTime <= 0 {
84- outerError = err
85- return
90+ return nil , err
8691 }
8792
8893 tunnelWaitTime = tunnelWaitTime - tunnelCheckInterval
8994 time .Sleep (tunnelCheckInterval )
9095 }
9196
92- helmWaitTime := 2 * 60 * time .Second
93- helmCheckInterval := 5 * time .Second
94-
9597 helmOptions := []k8shelm.Option {
9698 k8shelm .Host ("127.0.0.1:" + strconv .Itoa (tunnel .Local )),
97- k8shelm .ConnectTimeout (int64 (helmCheckInterval )),
99+ k8shelm .ConnectTimeout (int64 (5 * time . Second )),
98100 }
99101
100- client := k8shelm .NewClient (helmOptions ... )
101- var tillerError error
102+ client = k8shelm .NewClient (helmOptions ... )
102103
103- for helmWaitTime > 0 {
104- _ , tillerError = client .ListReleases (k8shelm .ReleaseListLimit (1 ))
105- if tillerError == nil || helmWaitTime < 0 {
106- break
107- }
108-
109- helmWaitTime = helmWaitTime - helmCheckInterval
110- time .Sleep (helmCheckInterval )
104+ _ , err = client .ListReleases (k8shelm .ReleaseListLimit (1 ))
105+ if err == nil {
106+ break
111107 }
112108
113- log . StopWait ()
109+ tunnel . Close ()
114110
115- if tillerError != nil {
116- outerError = tillerError
117- return
118- }
111+ tunnelWaitTime = tunnelWaitTime - tunnelCheckInterval
112+ time .Sleep (tunnelCheckInterval )
119113
120- homeDir , err := homedir .Dir ()
121- if err != nil {
122- outerError = err
123- return
114+ if tunnelWaitTime < 0 {
115+ return nil , errors .New ("Waiting for tiller timed out" )
124116 }
117+ }
125118
126- helmHomePath := homeDir + "/.devspace/helm"
127- repoPath := helmHomePath + "/repository"
128- repoFile := repoPath + "/repositories.yaml"
129- stableRepoCachePathAbs := helmHomePath + "/" + stableRepoCachePath
119+ log .StopWait ()
130120
131- os .MkdirAll (helmHomePath + "/cache" , os .ModePerm )
132- os .MkdirAll (repoPath , os .ModePerm )
133- os .MkdirAll (filepath .Dir (stableRepoCachePathAbs ), os .ModePerm )
121+ homeDir , err := homedir .Dir ()
122+ if err != nil {
123+ return nil , err
124+ }
134125
135- _ , repoFileNotFound := os .Stat (repoFile )
136- if repoFileNotFound != nil {
137- err = fsutil .WriteToFile ([]byte (defaultRepositories ), repoFile )
138- if err != nil {
139- outerError = err
140- return
141- }
142- }
126+ helmHomePath := homeDir + "/.devspace/helm"
127+ repoPath := helmHomePath + "/repository"
128+ repoFile := repoPath + "/repositories.yaml"
129+ stableRepoCachePathAbs := helmHomePath + "/" + stableRepoCachePath
143130
144- wrapper := & ClientWrapper {
145- Client : client ,
146- Settings : & helmenvironment.EnvSettings {
147- Home : helmpath .Home (helmHomePath ),
148- },
149- Namespace : tillerNamespace ,
150- kubectl : kubectlClient ,
151- }
131+ os .MkdirAll (helmHomePath + "/cache" , os .ModePerm )
132+ os .MkdirAll (repoPath , os .ModePerm )
133+ os .MkdirAll (filepath .Dir (stableRepoCachePathAbs ), os .ModePerm )
152134
153- _ , err = os .Stat (stableRepoCachePathAbs )
135+ _ , repoFileNotFound := os .Stat (repoFile )
136+ if repoFileNotFound != nil {
137+ err = fsutil .WriteToFile ([]byte (defaultRepositories ), repoFile )
154138 if err != nil {
155- err = wrapper .updateRepos ()
156- if err != nil {
157- outerError = err
158- return
159- }
139+ return nil , err
160140 }
141+ }
161142
162- helmClient = wrapper
163- })
143+ wrapper := & ClientWrapper {
144+ Client : client ,
145+ Settings : & helmenvironment.EnvSettings {
146+ Home : helmpath .Home (helmHomePath ),
147+ },
148+ Namespace : tillerNamespace ,
149+ kubectl : kubectlClient ,
150+ }
164151
165- return helmClient , outerError
152+ _ , err = os .Stat (stableRepoCachePathAbs )
153+ if err != nil {
154+ err = wrapper .updateRepos ()
155+ if err != nil {
156+ return nil , err
157+ }
158+ }
159+
160+ return wrapper , nil
166161}
167162
168163func (helmClientWrapper * ClientWrapper ) updateRepos () error {
0 commit comments