OLD | NEW |
1 // Copyright 2012, 2013 Canonical Ltd. | 1 // Copyright 2012, 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package main | 4 package main |
5 | 5 |
6 import ( | 6 import ( |
7 stderrors "errors" | 7 stderrors "errors" |
8 "fmt" | 8 "fmt" |
9 | 9 |
10 "launchpad.net/gnuflag" | 10 "launchpad.net/gnuflag" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 if len(c.Series) > 0 && !c.UploadTools { | 102 if len(c.Series) > 0 && !c.UploadTools { |
103 return fmt.Errorf("--series requires --upload-tools") | 103 return fmt.Errorf("--series requires --upload-tools") |
104 } | 104 } |
105 return cmd.CheckEmpty(args) | 105 return cmd.CheckEmpty(args) |
106 } | 106 } |
107 | 107 |
108 var errUpToDate = stderrors.New("no upgrades available") | 108 var errUpToDate = stderrors.New("no upgrades available") |
109 | 109 |
110 // Run changes the version proposed for the juju envtools. | 110 // Run changes the version proposed for the juju envtools. |
111 func (c *UpgradeJujuCommand) Run(_ *cmd.Context) (err error) { | 111 func (c *UpgradeJujuCommand) Run(_ *cmd.Context) (err error) { |
112 » conn, err := juju.NewConnFromName(c.EnvName) | 112 » client, err := juju.NewAPIClientFromName(c.EnvName) |
113 if err != nil { | 113 if err != nil { |
114 return err | 114 return err |
115 } | 115 } |
116 » defer conn.Close() | 116 » defer client.Close() |
117 defer func() { | 117 defer func() { |
118 if err == errUpToDate { | 118 if err == errUpToDate { |
119 log.Noticef(err.Error()) | 119 log.Noticef(err.Error()) |
120 err = nil | 120 err = nil |
121 } | 121 } |
122 }() | 122 }() |
123 | 123 |
124 // Determine the version to upgrade to, uploading tools if necessary. | 124 // Determine the version to upgrade to, uploading tools if necessary. |
125 » env := conn.Environ | 125 » attrs, err := client.EnvironmentGet() |
126 » cfg, err := conn.State.EnvironConfig() | |
127 if err != nil { | 126 if err != nil { |
128 return err | 127 return err |
129 } | 128 } |
| 129 cfg, err := config.New(config.NoDefaults, attrs) |
| 130 if err != nil { |
| 131 return err |
| 132 } |
| 133 env, err := environs.New(cfg) |
| 134 if err != nil { |
| 135 return err |
| 136 } |
130 v, err := c.initVersions(cfg, env) | 137 v, err := c.initVersions(cfg, env) |
131 if err != nil { | 138 if err != nil { |
132 return err | 139 return err |
133 } | 140 } |
134 if c.UploadTools { | 141 if c.UploadTools { |
135 series := getUploadSeries(cfg, c.Series) | 142 series := getUploadSeries(cfg, c.Series) |
136 if err := v.uploadTools(env.Storage(), series); err != nil { | 143 if err := v.uploadTools(env.Storage(), series); err != nil { |
137 return err | 144 return err |
138 } | 145 } |
139 } | 146 } |
140 if err := v.validate(); err != nil { | 147 if err := v.validate(); err != nil { |
141 return err | 148 return err |
142 } | 149 } |
143 log.Infof("upgrade version chosen: %s", v.chosen) | 150 log.Infof("upgrade version chosen: %s", v.chosen) |
144 // TODO(fwereade): this list may be incomplete, pending envtools.Upload
change. | 151 // TODO(fwereade): this list may be incomplete, pending envtools.Upload
change. |
145 log.Infof("available tools: %s", v.tools) | 152 log.Infof("available tools: %s", v.tools) |
146 | 153 |
147 » if err := conn.State.SetEnvironAgentVersion(v.chosen); err != nil { | 154 » if err := client.SetEnvironAgentVersion(v.chosen); err != nil { |
148 return err | 155 return err |
149 } | 156 } |
150 log.Noticef("started upgrade to %s", v.chosen) | 157 log.Noticef("started upgrade to %s", v.chosen) |
151 return nil | 158 return nil |
152 } | 159 } |
153 | 160 |
154 // initVersions collects state relevant to an upgrade decision. The returned | 161 // initVersions collects state relevant to an upgrade decision. The returned |
155 // agent and client versions, and the list of currently available tools, will | 162 // agent and client versions, and the list of currently available tools, will |
156 // always be accurate; the chosen version, and the flag indicating development | 163 // always be accurate; the chosen version, and the flag indicating development |
157 // mode, may remain blank until uploadTools or validate is called. | 164 // mode, may remain blank until uploadTools or validate is called. |
158 func (c *UpgradeJujuCommand) initVersions(cfg *config.Config, env environs.Envir
on) (*upgradeVersions, error) { | 165 func (c *UpgradeJujuCommand) initVersions(cfg *config.Config, env environs.Envir
on) (*upgradeVersions, error) { |
159 agent, ok := cfg.AgentVersion() | 166 agent, ok := cfg.AgentVersion() |
160 if !ok { | 167 if !ok { |
161 // Can't happen. In theory. | 168 // Can't happen. In theory. |
162 return nil, fmt.Errorf("incomplete environment configuration") | 169 return nil, fmt.Errorf("incomplete environment configuration") |
163 } | 170 } |
164 if c.Version == agent { | 171 if c.Version == agent { |
165 return nil, errUpToDate | 172 return nil, errUpToDate |
166 } | 173 } |
167 client := version.Current.Number | 174 client := version.Current.Number |
| 175 // TODO use an API call rather than requiring the environment, |
| 176 // so that we can restrict access to the provider secrets |
| 177 // while still allowing users to upgrade. |
168 available, err := envtools.FindTools(env, client.Major, -1, coretools.Fi
lter{}, envtools.DoNotAllowRetry) | 178 available, err := envtools.FindTools(env, client.Major, -1, coretools.Fi
lter{}, envtools.DoNotAllowRetry) |
169 if err != nil { | 179 if err != nil { |
170 if !errors.IsNotFoundError(err) { | 180 if !errors.IsNotFoundError(err) { |
171 return nil, err | 181 return nil, err |
172 } | 182 } |
173 if !c.UploadTools { | 183 if !c.UploadTools { |
174 // No tools found and we shouldn't upload any, so preten
d | 184 // No tools found and we shouldn't upload any, so preten
d |
175 // there is no more recent version available. | 185 // there is no more recent version available. |
176 if c.Version == version.Zero { | 186 if c.Version == version.Zero { |
177 return nil, errUpToDate | 187 return nil, errUpToDate |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 for _, t := range existing { | 306 for _, t := range existing { |
297 if t.Version.Major != vers.Major || t.Version.Minor != vers.Mino
r || t.Version.Patch != vers.Patch { | 307 if t.Version.Major != vers.Major || t.Version.Minor != vers.Mino
r || t.Version.Patch != vers.Patch { |
298 continue | 308 continue |
299 } | 309 } |
300 if t.Version.Build >= vers.Build { | 310 if t.Version.Build >= vers.Build { |
301 vers.Build = t.Version.Build + 1 | 311 vers.Build = t.Version.Build + 1 |
302 } | 312 } |
303 } | 313 } |
304 return vers | 314 return vers |
305 } | 315 } |
OLD | NEW |