Merge lp:~axwalk/juju-core/remove-1.16-client-support into lp:~go-bot/juju-core/trunk

Proposed by Andrew Wilkins
Status: Merged
Approved by: Andrew Wilkins
Approved revision: no longer in the source branch.
Merged at revision: 2580
Proposed branch: lp:~axwalk/juju-core/remove-1.16-client-support
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 1021 lines (+21/-669)
13 files modified
cmd/juju/addmachine.go (+6/-58)
cmd/juju/common.go (+0/-15)
cmd/juju/constraints.go (+1/-43)
cmd/juju/deploy.go (+0/-78)
cmd/juju/destroymachine.go (+3/-28)
cmd/juju/environment.go (+2/-71)
cmd/juju/set.go (+1/-36)
cmd/juju/status.go (+0/-16)
cmd/juju/unset.go (+1/-35)
cmd/juju/upgradecharm.go (+0/-81)
cmd/juju/upgradejuju.go (+0/-96)
environs/manual/provisioner.go (+7/-69)
state/statecmd/destroymachines.go (+0/-43)
To merge this branch: bzr merge lp:~axwalk/juju-core/remove-1.16-client-support
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+214504@code.launchpad.net

Commit message

Remove 1.16 support code

This drops most of the 1.16 support code from
the client-side. There's more to remove, this
is just a start.

https://codereview.appspot.com/84520046/

Description of the change

Remove 1.16 support code

This drops most of the 1.16 support code from
the client-side. There's more to remove, this
is just a start.

https://codereview.appspot.com/84520046/

To post a comment you must log in.
Revision history for this message
Andrew Wilkins (axwalk) wrote :

Reviewers: mp+214504_code.launchpad.net,

Message:
Please take a look.

Description:
Remove 1.16 support code

This drops most of the 1.16 support code from
the client-side. There's more to remove, this
is just a start.

https://code.launchpad.net/~axwalk/juju-core/remove-1.16-client-support/+merge/214504

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/84520046/

Affected files (+23, -669 lines):
   A [revision details]
   M cmd/juju/addmachine.go
   M cmd/juju/common.go
   M cmd/juju/constraints.go
   M cmd/juju/deploy.go
   M cmd/juju/destroymachine.go
   M cmd/juju/environment.go
   M cmd/juju/set.go
   M cmd/juju/status.go
   M cmd/juju/unset.go
   cmd/juju/upgradecharm.go
   M cmd/juju/upgradejuju.go
   M environs/manual/provisioner.go
   D state/statecmd/destroymachines.go

Revision history for this message
Ian Booth (wallyworld) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmd/juju/addmachine.go'
--- cmd/juju/addmachine.go 2014-04-03 04:46:51 +0000
+++ cmd/juju/addmachine.go 2014-04-07 10:13:32 +0000
@@ -12,12 +12,10 @@
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"13 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/constraints"14 "launchpad.net/juju-core/constraints"
15 "launchpad.net/juju-core/environs/config"
16 "launchpad.net/juju-core/environs/manual"15 "launchpad.net/juju-core/environs/manual"
17 "launchpad.net/juju-core/instance"16 "launchpad.net/juju-core/instance"
18 "launchpad.net/juju-core/juju"17 "launchpad.net/juju-core/juju"
19 "launchpad.net/juju-core/names"18 "launchpad.net/juju-core/names"
20 "launchpad.net/juju-core/state"
21 "launchpad.net/juju-core/state/api/params"19 "launchpad.net/juju-core/state/api/params"
22)20)
2321
@@ -114,46 +112,6 @@
114 return err112 return err
115}113}
116114
117// addMachine1dot16 runs Client.AddMachines using a direct DB connection to maintain
118// compatibility with an API server running 1.16 or older (when AddMachines
119// was not available). This fallback can be removed when we no longer maintain
120// 1.16 compatibility.
121// This was copied directly from the code in AddMachineCommand.Run in 1.16
122func (c *AddMachineCommand) addMachine1dot16() (string, error) {
123 conn, err := juju.NewConnFromName(c.EnvName)
124 if err != nil {
125 return "", err
126 }
127 defer conn.Close()
128
129 series := c.Series
130 if series == "" {
131 conf, err := conn.State.EnvironConfig()
132 if err != nil {
133 return "", err
134 }
135 series = config.PreferredSeries(conf)
136 }
137 template := state.MachineTemplate{
138 Series: series,
139 Constraints: c.Constraints,
140 Jobs: []state.MachineJob{state.JobHostUnits},
141 }
142 var m *state.Machine
143 switch {
144 case c.ContainerType == "":
145 m, err = conn.State.AddOneMachine(template)
146 case c.MachineId != "":
147 m, err = conn.State.AddMachineInsideMachine(template, c.MachineId, c.ContainerType)
148 default:
149 m, err = conn.State.AddMachineInsideNewMachine(template, template, c.ContainerType)
150 }
151 if err != nil {
152 return "", err
153 }
154 return m.String(), err
155}
156
157func (c *AddMachineCommand) Run(ctx *cmd.Context) error {115func (c *AddMachineCommand) Run(ctx *cmd.Context) error {
158 if c.SSHHost != "" {116 if c.SSHHost != "" {
159 args := manual.ProvisionMachineArgs{117 args := manual.ProvisionMachineArgs{
@@ -181,25 +139,15 @@
181 Jobs: []params.MachineJob{params.JobHostUnits},139 Jobs: []params.MachineJob{params.JobHostUnits},
182 }140 }
183 results, err := client.AddMachines([]params.AddMachineParams{machineParams})141 results, err := client.AddMachines([]params.AddMachineParams{machineParams})
184 var machineId string
185 if params.IsCodeNotImplemented(err) {
186 logger.Infof("AddMachines not supported by the API server, " +
187 "falling back to 1.16 compatibility mode (direct DB access)")
188 machineId, err = c.addMachine1dot16()
189 } else if err != nil {
190 return err
191 } else {
192 // Currently, only one machine is added, but in future there may be several added in one call.
193 machineInfo := results[0]
194 var machineErr *params.Error
195 machineId, machineErr = machineInfo.Machine, machineInfo.Error
196 if machineErr != nil {
197 err = machineErr
198 }
199 }
200 if err != nil {142 if err != nil {
201 return err143 return err
202 }144 }
145 // Currently, only one machine is added, but in future there may be several added in one call.
146 machineInfo := results[0]
147 if machineInfo.Error != nil {
148 return machineInfo.Error
149 }
150 machineId := machineInfo.Machine
203 if c.ContainerType == "" {151 if c.ContainerType == "" {
204 logger.Infof("created machine %v", machineId)152 logger.Infof("created machine %v", machineId)
205 } else {153 } else {
206154
=== modified file 'cmd/juju/common.go'
--- cmd/juju/common.go 2014-04-03 15:55:07 +0000
+++ cmd/juju/common.go 2014-04-07 10:13:32 +0000
@@ -69,18 +69,3 @@
69 }69 }
70 return &charm.URL{Reference: ref, Series: series}, nil70 return &charm.URL{Reference: ref, Series: series}, nil
71}71}
72
73// resolveCharmURL1dot16 returns a resolved charm URL for older state servers
74// that do not support ResolveCharm. The default series "precise" is
75// appropriate for these environments.
76func resolveCharmURL1dot16(url string, conf *config.Config) (*charm.URL, error) {
77 ref, series, err := charm.ParseReference(url)
78 if err != nil {
79 return nil, err
80 }
81
82 if series == "" {
83 series = config.PreferredSeries(conf)
84 }
85 return &charm.URL{Reference: ref, Series: series}, err
86}
8772
=== modified file 'cmd/juju/constraints.go'
--- cmd/juju/constraints.go 2014-04-01 04:53:43 +0000
+++ cmd/juju/constraints.go 2014-04-07 10:13:32 +0000
@@ -13,7 +13,6 @@
13 "launchpad.net/juju-core/constraints"13 "launchpad.net/juju-core/constraints"
14 "launchpad.net/juju-core/juju"14 "launchpad.net/juju-core/juju"
15 "launchpad.net/juju-core/names"15 "launchpad.net/juju-core/names"
16 "launchpad.net/juju-core/state/api/params"
17)16)
1817
19const getConstraintsDoc = `18const getConstraintsDoc = `
@@ -93,21 +92,6 @@
93 return cmd.CheckEmpty(args)92 return cmd.CheckEmpty(args)
94}93}
9594
96// getEnvironConstraints1dot16 uses direct DB access to get the Environment
97// constraints against an API server running 1.16 or older (when GetEnvironmentConstraints
98// was not available). This fallback can be removed when we no longer maintain
99// 1.16 compatibility.
100// This only does the GetEnvironmentConstraints portion of Run, since
101// GetServiceConstraints was already implemented.
102func (c *GetConstraintsCommand) getEnvironConstraints1dot16() (constraints.Value, error) {
103 conn, err := juju.NewConnFromName(c.EnvName)
104 if err != nil {
105 return constraints.Value{}, err
106 }
107 defer conn.Close()
108 return conn.State.EnvironConstraints()
109}
110
111func (c *GetConstraintsCommand) Run(ctx *cmd.Context) error {95func (c *GetConstraintsCommand) Run(ctx *cmd.Context) error {
112 apiclient, err := juju.NewAPIClientFromName(c.EnvName)96 apiclient, err := juju.NewAPIClientFromName(c.EnvName)
113 if err != nil {97 if err != nil {
@@ -118,11 +102,6 @@
118 var cons constraints.Value102 var cons constraints.Value
119 if c.ServiceName == "" {103 if c.ServiceName == "" {
120 cons, err = apiclient.GetEnvironmentConstraints()104 cons, err = apiclient.GetEnvironmentConstraints()
121 if params.IsCodeNotImplemented(err) {
122 logger.Infof("GetEnvironmentConstraints not supported by the API server, " +
123 "falling back to 1.16 compatibility mode (direct DB access)")
124 cons, err = c.getEnvironConstraints1dot16()
125 }
126 } else {105 } else {
127 cons, err = apiclient.GetServiceConstraints(c.ServiceName)106 cons, err = apiclient.GetServiceConstraints(c.ServiceName)
128 }107 }
@@ -166,21 +145,6 @@
166 return err145 return err
167}146}
168147
169// setEnvironConstraints1dot16 uses direct DB access to get the Environment
170// constraints against an API server running 1.16 or older (when SetEnvironmentConstraints
171// was not available). This fallback can be removed when we no longer maintain
172// 1.16 compatibility.
173// This only does the SetEnvironmentConstraints portion of Run, since
174// SetServiceConstraints was already implemented.
175func (c *SetConstraintsCommand) setEnvironConstraints1dot16() error {
176 conn, err := juju.NewConnFromName(c.EnvName)
177 if err != nil {
178 return err
179 }
180 defer conn.Close()
181 return conn.State.SetEnvironConstraints(c.Constraints)
182}
183
184func (c *SetConstraintsCommand) Run(_ *cmd.Context) (err error) {148func (c *SetConstraintsCommand) Run(_ *cmd.Context) (err error) {
185 apiclient, err := juju.NewAPIClientFromName(c.EnvName)149 apiclient, err := juju.NewAPIClientFromName(c.EnvName)
186 if err != nil {150 if err != nil {
@@ -188,13 +152,7 @@
188 }152 }
189 defer apiclient.Close()153 defer apiclient.Close()
190 if c.ServiceName == "" {154 if c.ServiceName == "" {
191 err = apiclient.SetEnvironmentConstraints(c.Constraints)155 return apiclient.SetEnvironmentConstraints(c.Constraints)
192 if params.IsCodeNotImplemented(err) {
193 logger.Infof("SetEnvironmentConstraints not supported by the API server, " +
194 "falling back to 1.16 compatibility mode (direct DB access)")
195 err = c.setEnvironConstraints1dot16()
196 }
197 return err
198 }156 }
199 return apiclient.SetServiceConstraints(c.ServiceName, c.Constraints)157 return apiclient.SetServiceConstraints(c.ServiceName, c.Constraints)
200}158}
201159
=== modified file 'cmd/juju/deploy.go'
--- cmd/juju/deploy.go 2014-04-03 04:46:51 +0000
+++ cmd/juju/deploy.go 2014-04-07 10:13:32 +0000
@@ -142,11 +142,6 @@
142 defer client.Close()142 defer client.Close()
143143
144 attrs, err := client.EnvironmentGet()144 attrs, err := client.EnvironmentGet()
145 if params.IsCodeNotImplemented(err) {
146 logger.Infof("EnvironmentGet not supported by the API server, " +
147 "falling back to 1.16 compatibility mode (direct DB access)")
148 return c.run1dot16(ctx)
149 }
150 if err != nil {145 if err != nil {
151 return err146 return err
152 }147 }
@@ -249,79 +244,6 @@
249 return err244 return err
250}245}
251246
252// run1dot16 implements the deploy command in 1.16 compatibility mode,
253// with direct state access. Remove this when support for 1.16 is
254// dropped.
255func (c *DeployCommand) run1dot16(ctx *cmd.Context) error {
256 conn, err := juju.NewConnFromName(c.EnvName)
257 if err != nil {
258 return err
259 }
260 defer conn.Close()
261 conf, err := conn.State.EnvironConfig()
262 if err != nil {
263 return err
264 }
265
266 curl, err := resolveCharmURL1dot16(c.CharmName, conf)
267 if err != nil {
268 return err
269 }
270
271 repo, err := charm.InferRepository(curl.Reference, c.RepoPath)
272 if err != nil {
273 return err
274 }
275 repo = config.SpecializeCharmRepo(repo, conf)
276
277 // TODO(fwereade) it's annoying to roundtrip the bytes through the client
278 // here, but it's the original behaviour and not convenient to change.
279 // PutCharm will always be required in some form for local charms; and we
280 // will need an EnsureStoreCharm method somewhere that gets the state.Charm
281 // for use in the following checks.
282 ch, err := conn.PutCharm(curl, repo, c.BumpRevision)
283 if err != nil {
284 return err
285 }
286 numUnits := c.NumUnits
287 if ch.Meta().Subordinate {
288 if !constraints.IsEmpty(&c.Constraints) {
289 return errors.New("cannot use --constraints with subordinate service")
290 }
291 if numUnits == 1 && c.ToMachineSpec == "" {
292 numUnits = 0
293 } else {
294 return errors.New("cannot use --num-units or --to with subordinate service")
295 }
296 }
297
298 serviceName := c.ServiceName
299 if serviceName == "" {
300 serviceName = ch.Meta().Name
301 }
302 var settings charm.Settings
303 if c.Config.Path != "" {
304 configYAML, err := c.Config.Read(ctx)
305 if err != nil {
306 return err
307 }
308 settings, err = ch.Config().ParseSettingsYAML(configYAML, serviceName)
309 if err != nil {
310 return err
311 }
312 }
313 _, err = juju.DeployService(conn.State,
314 juju.DeployServiceParams{
315 ServiceName: serviceName,
316 Charm: ch,
317 NumUnits: numUnits,
318 ConfigSettings: settings,
319 Constraints: c.Constraints,
320 ToMachineSpec: c.ToMachineSpec,
321 })
322 return err
323}
324
325// addCharmViaAPI calls the appropriate client API calls to add the247// addCharmViaAPI calls the appropriate client API calls to add the
326// given charm URL to state. Also displays the charm URL of the added248// given charm URL to state. Also displays the charm URL of the added
327// charm on stdout.249// charm on stdout.
328250
=== modified file 'cmd/juju/destroymachine.go'
--- cmd/juju/destroymachine.go 2014-04-01 04:53:43 +0000
+++ cmd/juju/destroymachine.go 2014-04-07 10:13:32 +0000
@@ -12,8 +12,6 @@
12 "launchpad.net/juju-core/cmd/envcmd"12 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/juju"13 "launchpad.net/juju-core/juju"
14 "launchpad.net/juju-core/names"14 "launchpad.net/juju-core/names"
15 "launchpad.net/juju-core/state/api/params"
16 "launchpad.net/juju-core/state/statecmd"
17)15)
1816
19// DestroyMachineCommand causes an existing machine to be destroyed.17// DestroyMachineCommand causes an existing machine to be destroyed.
@@ -62,21 +60,6 @@
62 return nil60 return nil
63}61}
6462
65func (c *DestroyMachineCommand) run1dot16() error {
66 if c.Force {
67 return fmt.Errorf("destroy-machine --force is not supported in Juju servers older than 1.16.4")
68 }
69 conn, err := juju.NewConnFromName(c.EnvName)
70 if err != nil {
71 return err
72 }
73 defer conn.Close()
74 // TODO: When this run1dot16 code is removed, we should remove the
75 // method in state as well (as long as add-machine also no longer
76 // needs it.)
77 return statecmd.DestroyMachines1dot16(conn.State, c.MachineIds...)
78}
79
80func (c *DestroyMachineCommand) Run(_ *cmd.Context) error {63func (c *DestroyMachineCommand) Run(_ *cmd.Context) error {
81 apiclient, err := juju.NewAPIClientFromName(c.EnvName)64 apiclient, err := juju.NewAPIClientFromName(c.EnvName)
82 if err != nil {65 if err != nil {
@@ -84,15 +67,7 @@
84 }67 }
85 defer apiclient.Close()68 defer apiclient.Close()
86 if c.Force {69 if c.Force {
87 err = apiclient.ForceDestroyMachines(c.MachineIds...)70 return apiclient.ForceDestroyMachines(c.MachineIds...)
88 } else {71 }
89 err = apiclient.DestroyMachines(c.MachineIds...)72 return apiclient.DestroyMachines(c.MachineIds...)
90 }
91 // Juju 1.16.3 and older did not have DestroyMachines as an API command.
92 if params.IsCodeNotImplemented(err) {
93 logger.Infof("DestroyMachines not supported by the API server, " +
94 "falling back to <=1.16.3 compatibility")
95 return c.run1dot16()
96 }
97 return err
98}73}
9974
=== modified file 'cmd/juju/environment.go'
--- cmd/juju/environment.go 2014-04-01 14:31:22 +0000
+++ cmd/juju/environment.go 2014-04-07 10:13:32 +0000
@@ -12,7 +12,6 @@
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"13 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/juju"14 "launchpad.net/juju-core/juju"
15 "launchpad.net/juju-core/state/api/params"
16)15)
1716
18// GetEnvironmentCommand is able to output either the entire environment or17// GetEnvironmentCommand is able to output either the entire environment or
@@ -59,26 +58,6 @@
59 return58 return
60}59}
6160
62// environmentGet1dot16 runs matches client.EnvironmentGet using a direct DB
63// connection to maintain compatibility with an API server running 1.16 or
64// older (when EnvironmentGet was not available). This fallback can be removed
65// when we no longer maintain 1.16 compatibility.
66func (c *GetEnvironmentCommand) environmentGet1dot16() (map[string]interface{}, error) {
67 conn, err := juju.NewConnFromName(c.EnvName)
68 if err != nil {
69 return nil, err
70 }
71 defer conn.Close()
72
73 // Get the existing environment config from the state.
74 config, err := conn.State.EnvironConfig()
75 if err != nil {
76 return nil, err
77 }
78 attrs := config.AllAttrs()
79 return attrs, nil
80}
81
82func (c *GetEnvironmentCommand) Run(ctx *cmd.Context) error {61func (c *GetEnvironmentCommand) Run(ctx *cmd.Context) error {
83 client, err := juju.NewAPIClientFromName(c.EnvName)62 client, err := juju.NewAPIClientFromName(c.EnvName)
84 if err != nil {63 if err != nil {
@@ -87,11 +66,6 @@
87 defer client.Close()66 defer client.Close()
8867
89 attrs, err := client.EnvironmentGet()68 attrs, err := client.EnvironmentGet()
90 if params.IsCodeNotImplemented(err) {
91 logger.Infof("EnvironmentGet not supported by the API server, " +
92 "falling back to 1.16 compatibility mode (direct DB access)")
93 attrs, err = c.environmentGet1dot16()
94 }
95 if err != nil {69 if err != nil {
96 return err70 return err
97 }71 }
@@ -159,36 +133,13 @@
159 return nil133 return nil
160}134}
161135
162// run1dot16 runs matches client.EnvironmentSet using a direct DB
163// connection to maintain compatibility with an API server running 1.16 or
164// older (when EnvironmentSet was not available). This fallback can be removed
165// when we no longer maintain 1.16 compatibility.
166// This content was copied from SetEnvironmentCommand.Run in 1.16
167func (c *SetEnvironmentCommand) run1dot16() error {
168 conn, err := juju.NewConnFromName(c.EnvName)
169 if err != nil {
170 return err
171 }
172 defer conn.Close()
173
174 // Update state config with new values
175 return conn.State.UpdateEnvironConfig(c.values, nil, nil)
176}
177
178func (c *SetEnvironmentCommand) Run(ctx *cmd.Context) error {136func (c *SetEnvironmentCommand) Run(ctx *cmd.Context) error {
179 client, err := juju.NewAPIClientFromName(c.EnvName)137 client, err := juju.NewAPIClientFromName(c.EnvName)
180 if err != nil {138 if err != nil {
181 return err139 return err
182 }140 }
183 defer client.Close()141 defer client.Close()
184142 return client.EnvironmentSet(c.values)
185 err = client.EnvironmentSet(c.values)
186 if params.IsCodeNotImplemented(err) {
187 logger.Infof("EnvironmentSet not supported by the API server, " +
188 "falling back to 1.16 compatibility mode (direct DB access)")
189 err = c.run1dot16()
190 }
191 return err
192}143}
193144
194// UnsetEnvironment145// UnsetEnvironment
@@ -228,31 +179,11 @@
228 return nil179 return nil
229}180}
230181
231// run1dot16 runs matches client.EnvironmentUnset using a direct DB
232// connection to maintain compatibility with an API server running 1.16 or
233// older (when EnvironmentUnset was not available). This fallback can be removed
234// when we no longer maintain 1.16 compatibility.
235func (c *UnsetEnvironmentCommand) run1dot16() error {
236 conn, err := juju.NewConnFromName(c.EnvName)
237 if err != nil {
238 return err
239 }
240 defer conn.Close()
241 return conn.State.UpdateEnvironConfig(nil, c.keys, nil)
242}
243
244func (c *UnsetEnvironmentCommand) Run(ctx *cmd.Context) error {182func (c *UnsetEnvironmentCommand) Run(ctx *cmd.Context) error {
245 client, err := juju.NewAPIClientFromName(c.EnvName)183 client, err := juju.NewAPIClientFromName(c.EnvName)
246 if err != nil {184 if err != nil {
247 return err185 return err
248 }186 }
249 defer client.Close()187 defer client.Close()
250188 return client.EnvironmentUnset(c.keys...)
251 err = client.EnvironmentUnset(c.keys...)
252 if params.IsCodeNotImplemented(err) {
253 logger.Infof("EnvironmentUnset not supported by the API server, " +
254 "falling back to 1.16 compatibility mode (direct DB access)")
255 err = c.run1dot16()
256 }
257 return err
258}189}
259190
=== modified file 'cmd/juju/set.go'
--- cmd/juju/set.go 2014-04-01 04:53:43 +0000
+++ cmd/juju/set.go 2014-04-07 10:13:32 +0000
@@ -13,7 +13,6 @@
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/cmd/envcmd"14 "launchpad.net/juju-core/cmd/envcmd"
15 "launchpad.net/juju-core/juju"15 "launchpad.net/juju-core/juju"
16 "launchpad.net/juju-core/state/api/params"
17)16)
1817
19// SetCommand updates the configuration of a service.18// SetCommand updates the configuration of a service.
@@ -64,34 +63,6 @@
64 return nil63 return nil
65}64}
6665
67// serviceSet1dot16 does the final ServiceSet step using direct DB access
68// compatibility with an API server running 1.16 or older (when ServiceUnset
69// was not available). This fallback can be removed when we no longer maintain
70// 1.16 compatibility.
71// This was copied directly from the code in SetCommand.Run in 1.16
72func (c *SetCommand) serviceSet1dot16() error {
73 conn, err := juju.NewConnFromName(c.EnvName)
74 if err != nil {
75 return err
76 }
77 defer conn.Close()
78 service, err := conn.State.Service(c.ServiceName)
79 if err != nil {
80 return err
81 }
82 ch, _, err := service.Charm()
83 if err != nil {
84 return err
85 }
86 // We don't need the multiple logic here, because that should have
87 // already been taken care of by the API code (which *was* in 1.16).
88 settings, err := ch.Config().ParseSettingsStrings(c.SettingsStrings)
89 if err != nil {
90 return err
91 }
92 return service.UpdateConfigSettings(settings)
93}
94
95// Run updates the configuration of a service.66// Run updates the configuration of a service.
96func (c *SetCommand) Run(ctx *cmd.Context) error {67func (c *SetCommand) Run(ctx *cmd.Context) error {
97 api, err := juju.NewAPIClientFromName(c.EnvName)68 api, err := juju.NewAPIClientFromName(c.EnvName)
@@ -109,13 +80,7 @@
109 } else if len(c.SettingsStrings) == 0 {80 } else if len(c.SettingsStrings) == 0 {
110 return nil81 return nil
111 }82 }
112 err = api.ServiceSet(c.ServiceName, c.SettingsStrings)83 return api.ServiceSet(c.ServiceName, c.SettingsStrings)
113 if params.IsCodeNotImplemented(err) {
114 logger.Infof("NewServiceSetForClientAPI not supported by the API server, " +
115 "falling back to 1.16 compatibility mode (direct DB access)")
116 err = c.serviceSet1dot16()
117 }
118 return err
119}84}
12085
121// parse parses the option k=v strings into a map of options to be86// parse parses the option k=v strings into a map of options to be
12287
=== modified file 'cmd/juju/status.go'
--- cmd/juju/status.go 2014-04-01 04:53:43 +0000
+++ cmd/juju/status.go 2014-04-07 10:13:32 +0000
@@ -68,16 +68,6 @@
68%v68%v
69`69`
7070
71func (c *StatusCommand) getStatus1dot16() (*api.Status, error) {
72 conn, err := juju.NewConnFromName(c.EnvName)
73 if err != nil {
74 return nil, fmt.Errorf(connectionError, c.EnvName, err)
75 }
76 defer conn.Close()
77
78 return statecmd.Status(conn, c.patterns)
79}
80
81func (c *StatusCommand) Run(ctx *cmd.Context) error {71func (c *StatusCommand) Run(ctx *cmd.Context) error {
82 // Just verify the pattern validity client side, do not use the matcher72 // Just verify the pattern validity client side, do not use the matcher
83 _, err := statecmd.NewUnitMatcher(c.patterns)73 _, err := statecmd.NewUnitMatcher(c.patterns)
@@ -91,12 +81,6 @@
91 defer apiclient.Close()81 defer apiclient.Close()
9282
93 status, err := apiclient.Status(c.patterns)83 status, err := apiclient.Status(c.patterns)
94 if params.IsCodeNotImplemented(err) {
95 logger.Infof("Status not supported by the API server, " +
96 "falling back to 1.16 compatibility mode " +
97 "(direct DB access)")
98 status, err = c.getStatus1dot16()
99 }
100 // Display any error, but continue to print status if some was returned84 // Display any error, but continue to print status if some was returned
101 if err != nil {85 if err != nil {
102 fmt.Fprintf(ctx.Stderr, "%v\n", err)86 fmt.Fprintf(ctx.Stderr, "%v\n", err)
10387
=== modified file 'cmd/juju/unset.go'
--- cmd/juju/unset.go 2014-04-01 04:53:43 +0000
+++ cmd/juju/unset.go 2014-04-07 10:13:32 +0000
@@ -8,11 +8,9 @@
88
9 "launchpad.net/gnuflag"9 "launchpad.net/gnuflag"
1010
11 "launchpad.net/juju-core/charm"
12 "launchpad.net/juju-core/cmd"11 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"12 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/juju"13 "launchpad.net/juju-core/juju"
15 "launchpad.net/juju-core/state/api/params"
16)14)
1715
18// UnsetCommand sets configuration values of a service back16// UnsetCommand sets configuration values of a service back
@@ -58,32 +56,6 @@
58 return nil56 return nil
59}57}
6058
61// run1dot16 runs 'juju unset' using a direct DB connection to maintain
62// compatibility with an API server running 1.16 or older (when ServiceUnset
63// was not available). This fallback can be removed when we no longer maintain
64// 1.16 compatibility.
65// This was copied directly from the code in UnsetCommand.Run in 1.16
66func (c *UnsetCommand) run1dot16() error {
67 conn, err := juju.NewConnFromName(c.EnvName)
68 if err != nil {
69 return err
70 }
71 defer conn.Close()
72 service, err := conn.State.Service(c.ServiceName)
73 if err != nil {
74 return err
75 }
76 if len(c.Options) > 0 {
77 settings := make(charm.Settings)
78 for _, option := range c.Options {
79 settings[option] = nil
80 }
81 return service.UpdateConfigSettings(settings)
82 } else {
83 return nil
84 }
85}
86
87// Run resets the configuration of a service.59// Run resets the configuration of a service.
88func (c *UnsetCommand) Run(ctx *cmd.Context) error {60func (c *UnsetCommand) Run(ctx *cmd.Context) error {
89 apiclient, err := juju.NewAPIClientFromName(c.EnvName)61 apiclient, err := juju.NewAPIClientFromName(c.EnvName)
@@ -91,11 +63,5 @@
91 return err63 return err
92 }64 }
93 defer apiclient.Close()65 defer apiclient.Close()
94 err = apiclient.ServiceUnset(c.ServiceName, c.Options)66 return apiclient.ServiceUnset(c.ServiceName, c.Options)
95 if params.IsCodeNotImplemented(err) {
96 logger.Infof("ServiceUnset not supported by the API server, " +
97 "falling back to 1.16 compatibility mode (direct DB access)")
98 err = c.run1dot16()
99 }
100 return err
101}67}
10268
=== modified file 'cmd/juju/upgradecharm.go'
--- cmd/juju/upgradecharm.go 2014-04-03 15:05:14 +0000
+++ cmd/juju/upgradecharm.go 2014-04-07 10:13:32 +0000
@@ -16,7 +16,6 @@
16 "launchpad.net/juju-core/environs/config"16 "launchpad.net/juju-core/environs/config"
17 "launchpad.net/juju-core/juju"17 "launchpad.net/juju-core/juju"
18 "launchpad.net/juju-core/names"18 "launchpad.net/juju-core/names"
19 "launchpad.net/juju-core/state/api/params"
20)19)
2120
22// UpgradeCharm is responsible for upgrading a service's charm.21// UpgradeCharm is responsible for upgrading a service's charm.
@@ -115,10 +114,6 @@
115 }114 }
116 defer client.Close()115 defer client.Close()
117 oldURL, err := client.ServiceGetCharmURL(c.ServiceName)116 oldURL, err := client.ServiceGetCharmURL(c.ServiceName)
118 if params.IsCodeNotImplemented(err) {
119 logger.Infof("ServiceGetCharmURL is not implemented by the API server, switching to 1.16 compatibility mode (direct DB connection).")
120 return c.run1dot16(ctx)
121 }
122 if err != nil {117 if err != nil {
123 return err118 return err
124 }119 }
@@ -178,79 +173,3 @@
178173
179 return client.ServiceSetCharm(c.ServiceName, addedURL.String(), c.Force)174 return client.ServiceSetCharm(c.ServiceName, addedURL.String(), c.Force)
180}175}
181
182// run1dot16 perfoms the charm upgrade using a 1.16 compatible code
183// path, with a direct state connection. Remove once the support for
184// 1.16 is dropped.
185func (c *UpgradeCharmCommand) run1dot16(ctx *cmd.Context) error {
186 conn, err := juju.NewConnFromName(c.EnvName)
187 if err != nil {
188 return err
189 }
190 defer conn.Close()
191 service, err := conn.State.Service(c.ServiceName)
192 if err != nil {
193 return err
194 }
195
196 conf, err := conn.State.EnvironConfig()
197 if err != nil {
198 return err
199 }
200
201 oldURL, _ := service.CharmURL()
202 var newURL *charm.URL
203 if c.SwitchURL != "" {
204 // A new charm URL was explicitly specified.
205 newURL, err = resolveCharmURL1dot16(c.SwitchURL, conf)
206 if err != nil {
207 return err
208 }
209 } else {
210 // No new URL specified, but revision might have been.
211 newURL = oldURL.WithRevision(c.Revision)
212 }
213
214 repo, err := charm.InferRepository(newURL.Reference, ctx.AbsPath(c.RepoPath))
215 if err != nil {
216 return err
217 }
218 repo = config.SpecializeCharmRepo(repo, conf)
219
220 // If no explicit revision was set with either SwitchURL
221 // or Revision flags, discover the latest.
222 explicitRevision := true
223 if newURL.Revision == -1 {
224 explicitRevision = false
225 latest, err := charm.Latest(repo, newURL)
226 if err != nil {
227 return err
228 }
229 newURL = newURL.WithRevision(latest)
230 }
231 bumpRevision := false
232 if *newURL == *oldURL {
233 if explicitRevision {
234 return fmt.Errorf("already running specified charm %q", newURL)
235 }
236 // Only try bumping the revision when necessary (local dir charm).
237 if _, isLocal := repo.(*charm.LocalRepository); !isLocal {
238 // TODO(dimitern): If the --force flag is set to something
239 // different to before, we might actually want to allow this
240 // case (and the other error below). LP bug #1174287
241 return fmt.Errorf("already running latest charm %q", newURL)
242 }
243 // This is a local repository.
244 if ch, err := repo.Get(newURL); err != nil {
245 return err
246 } else if _, bumpRevision = ch.(*charm.Dir); !bumpRevision {
247 // Only bump the revision when it's a directory.
248 return fmt.Errorf("cannot increment revision of charm %q: not a directory", newURL)
249 }
250 }
251 sch, err := conn.PutCharm(newURL, repo, bumpRevision)
252 if err != nil {
253 return err
254 }
255 return service.SetCharm(sch, c.Force)
256}
257176
=== modified file 'cmd/juju/upgradejuju.go'
--- cmd/juju/upgradejuju.go 2014-04-01 04:53:43 +0000
+++ cmd/juju/upgradejuju.go 2014-04-07 10:13:32 +0000
@@ -16,10 +16,8 @@
16 "launchpad.net/juju-core/environs"16 "launchpad.net/juju-core/environs"
17 "launchpad.net/juju-core/environs/bootstrap"17 "launchpad.net/juju-core/environs/bootstrap"
18 "launchpad.net/juju-core/environs/config"18 "launchpad.net/juju-core/environs/config"
19 "launchpad.net/juju-core/environs/storage"
20 "launchpad.net/juju-core/environs/sync"19 "launchpad.net/juju-core/environs/sync"
21 envtools "launchpad.net/juju-core/environs/tools"20 envtools "launchpad.net/juju-core/environs/tools"
22 "launchpad.net/juju-core/errors"
23 "launchpad.net/juju-core/juju"21 "launchpad.net/juju-core/juju"
24 "launchpad.net/juju-core/state/api"22 "launchpad.net/juju-core/state/api"
25 "launchpad.net/juju-core/state/api/params"23 "launchpad.net/juju-core/state/api/params"
@@ -132,9 +130,6 @@
132130
133 // Determine the version to upgrade to, uploading tools if necessary.131 // Determine the version to upgrade to, uploading tools if necessary.
134 attrs, err := client.EnvironmentGet()132 attrs, err := client.EnvironmentGet()
135 if params.IsCodeNotImplemented(err) {
136 return c.run1dot16()
137 }
138 if err != nil {133 if err != nil {
139 return err134 return err
140 }135 }
@@ -372,94 +367,3 @@
372 }367 }
373 return vers368 return vers
374}369}
375
376// run1dot16 implements the command without access to the API. This is
377// needed for compatibility, so 1.16 can be upgraded to newer
378// releases. It should be removed in 1.18.
379func (c *UpgradeJujuCommand) run1dot16() error {
380 logger.Warningf("running in 1.16 compatibility mode")
381 conn, err := juju.NewConnFromName(c.EnvName)
382 if err != nil {
383 return err
384 }
385 defer conn.Close()
386 defer func() {
387 if err == errUpToDate {
388 logger.Infof(err.Error())
389 err = nil
390 }
391 }()
392
393 // Determine the version to upgrade to, uploading tools if necessary.
394 env := conn.Environ
395 cfg, err := conn.State.EnvironConfig()
396 if err != nil {
397 return err
398 }
399 context, err := c.initVersions1dot16(cfg, env)
400 if err != nil {
401 return err
402 }
403 if c.UploadTools {
404 series := bootstrap.SeriesToUpload(cfg, c.Series)
405 if err := context.uploadTools1dot16(env.Storage(), series); err != nil {
406 return err
407 }
408 }
409 if err := context.validate(); err != nil {
410 return err
411 }
412 logger.Infof("upgrade version chosen: %s", context.chosen)
413 logger.Infof("available tools: %s", context.tools)
414
415 if err := conn.State.SetEnvironAgentVersion(context.chosen); err != nil {
416 return err
417 }
418 logger.Infof("started upgrade to %s", context.chosen)
419 return nil
420}
421
422func (c *UpgradeJujuCommand) initVersions1dot16(cfg *config.Config, env environs.Environ) (*upgradeContext, error) {
423 agent, ok := cfg.AgentVersion()
424 if !ok {
425 // Can't happen. In theory.
426 return nil, fmt.Errorf("incomplete environment configuration")
427 }
428 if c.Version == agent {
429 return nil, errUpToDate
430 }
431 client := version.Current.Number
432 available, err := envtools.FindTools(env, client.Major, -1, coretools.Filter{}, envtools.DoNotAllowRetry)
433 if err != nil {
434 if !errors.IsNotFoundError(err) {
435 return nil, err
436 }
437 if !c.UploadTools {
438 // No tools found and we shouldn't upload any, so if we are not asking for a
439 // major upgrade, pretend there is no more recent version available.
440 if c.Version == version.Zero && agent.Major == client.Major {
441 return nil, errUpToDate
442 }
443 return nil, err
444 }
445 }
446 return &upgradeContext{
447 agent: agent,
448 client: client,
449 chosen: c.Version,
450 tools: available,
451 }, nil
452}
453
454func (context *upgradeContext) uploadTools1dot16(storage storage.Storage, series []string) error {
455 if context.chosen == version.Zero {
456 context.chosen = context.client
457 }
458 context.chosen = uploadVersion(context.chosen, context.tools)
459 uploaded, err := sync.Upload(storage, &context.chosen, series...)
460 if err != nil {
461 return err
462 }
463 context.tools = coretools.List{uploaded}
464 return nil
465}
466370
=== modified file 'environs/manual/provisioner.go'
--- environs/manual/provisioner.go 2014-04-01 04:15:17 +0000
+++ environs/manual/provisioner.go 2014-04-07 10:13:32 +0000
@@ -21,7 +21,6 @@
21 "launchpad.net/juju-core/state"21 "launchpad.net/juju-core/state"
22 "launchpad.net/juju-core/state/api"22 "launchpad.net/juju-core/state/api"
23 "launchpad.net/juju-core/state/api/params"23 "launchpad.net/juju-core/state/api/params"
24 "launchpad.net/juju-core/state/statecmd"
25 "launchpad.net/juju-core/tools"24 "launchpad.net/juju-core/tools"
26 "launchpad.net/juju-core/utils"25 "launchpad.net/juju-core/utils"
27 "launchpad.net/juju-core/utils/shell"26 "launchpad.net/juju-core/utils/shell"
@@ -72,34 +71,14 @@
72 if err != nil {71 if err != nil {
73 return "", err72 return "", err
74 }73 }
75 // Used for fallback to 1.16 code
76 var stateConn *juju.Conn
77 defer func() {74 defer func() {
78 if machineId != "" && err != nil {75 if machineId != "" && err != nil {
79 logger.Errorf("provisioning failed, removing machine %v: %v", machineId, err)76 logger.Errorf("provisioning failed, removing machine %v: %v", machineId, err)
80 // If we have stateConn, then we are in 1.1677 if cleanupErr := client.DestroyMachines(machineId); cleanupErr != nil {
81 // compatibility mode and we should issue
82 // DestroyMachines directly on the state, rather than
83 // via API (because DestroyMachine *also* didn't exist
84 // in 1.16, though it will be in 1.16.5).
85 // TODO: When this compatibility code is removed, we
86 // should remove the method in state as well (as long
87 // as destroy-machine also no longer needs it.)
88 var cleanupErr error
89 if stateConn != nil {
90 cleanupErr = statecmd.DestroyMachines1dot16(stateConn.State, machineId)
91 } else {
92 cleanupErr = client.DestroyMachines(machineId)
93 }
94 if cleanupErr != nil {
95 logger.Warningf("error cleaning up machine: %s", cleanupErr)78 logger.Warningf("error cleaning up machine: %s", cleanupErr)
96 }79 }
97 machineId = ""80 machineId = ""
98 }81 }
99 if stateConn != nil {
100 stateConn.Close()
101 stateConn = nil
102 }
103 client.Close()82 client.Close()
104 }()83 }()
10584
@@ -120,35 +99,16 @@
12099
121 // Inform Juju that the machine exists.100 // Inform Juju that the machine exists.
122 machineId, err = recordMachineInState(client, *machineParams)101 machineId, err = recordMachineInState(client, *machineParams)
123 if params.IsCodeNotImplemented(err) {
124 logger.Infof("AddMachines not supported by the API server, " +
125 "falling back to 1.16 compatibility mode (direct DB access)")
126 stateConn, err = juju.NewConnFromName(args.EnvName)
127 if err == nil {
128 machineId, err = recordMachineInState1dot16(stateConn, *machineParams)
129 }
130 }
131 if err != nil {102 if err != nil {
132 return "", err103 return "", err
133 }104 }
134105
135 var provisioningScript string106 provisioningScript, err := client.ProvisioningScript(params.ProvisioningScriptParams{
136 if stateConn == nil {107 MachineId: machineId,
137 provisioningScript, err = client.ProvisioningScript(params.ProvisioningScriptParams{108 Nonce: machineParams.Nonce,
138 MachineId: machineId,109 })
139 Nonce: machineParams.Nonce,110 if err != nil {
140 })111 return "", err
141 if err != nil {
142 return "", err
143 }
144 } else {
145 mcfg, err := statecmd.MachineConfig(stateConn.State, machineId, machineParams.Nonce, args.DataDir)
146 if err == nil {
147 provisioningScript, err = ProvisioningScript(mcfg)
148 }
149 if err != nil {
150 return "", err
151 }
152 }112 }
153113
154 // Finally, provision the machine agent.114 // Finally, provision the machine agent.
@@ -194,28 +154,6 @@
194 return outJobs, nil154 return outJobs, nil
195}155}
196156
197func recordMachineInState1dot16(
198 stateConn *juju.Conn, machineParams params.AddMachineParams) (machineId string, err error) {
199 stateJobs, err := convertToStateJobs(machineParams.Jobs)
200 if err != nil {
201 return "", err
202 }
203 template := state.MachineTemplate{
204 Series: machineParams.Series,
205 Constraints: machineParams.Constraints,
206 InstanceId: machineParams.InstanceId,
207 Jobs: stateJobs,
208 Nonce: machineParams.Nonce,
209 HardwareCharacteristics: machineParams.HardwareCharacteristics,
210 Addresses: machineParams.Addrs,
211 }
212 machine, err := stateConn.State.AddOneMachine(template)
213 if err != nil {
214 return "", err
215 }
216 return machine.Id(), nil
217}
218
219// gatherMachineParams collects all the information we know about the machine157// gatherMachineParams collects all the information we know about the machine
220// we are about to provision. It will SSH into that machine as the ubuntu user.158// we are about to provision. It will SSH into that machine as the ubuntu user.
221// The hostname supplied should not include a username.159// The hostname supplied should not include a username.
222160
=== removed file 'state/statecmd/destroymachines.go'
--- state/statecmd/destroymachines.go 2013-12-10 12:24:25 +0000
+++ state/statecmd/destroymachines.go 1970-01-01 00:00:00 +0000
@@ -1,43 +0,0 @@
1// Copyright 2012, 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package statecmd
5
6import (
7 "fmt"
8 "strings"
9
10 "launchpad.net/juju-core/errors"
11 "launchpad.net/juju-core/state"
12)
13
14// DestroyMachines1dot16 destroys the machines with the specified ids.
15// This is copied from the 1.16.3 code to enable compatibility. It should be
16// removed when we release a version that goes via the API only (whatever is
17// after 1.18)
18func DestroyMachines1dot16(st *state.State, ids ...string) (err error) {
19 var errs []string
20 for _, id := range ids {
21 machine, err := st.Machine(id)
22 switch {
23 case errors.IsNotFoundError(err):
24 err = fmt.Errorf("machine %s does not exist", id)
25 case err != nil:
26 case machine.Life() != state.Alive:
27 continue
28 default:
29 err = machine.Destroy()
30 }
31 if err != nil {
32 errs = append(errs, err.Error())
33 }
34 }
35 if len(errs) == 0 {
36 return nil
37 }
38 msg := "some machines were not destroyed"
39 if len(errs) == len(ids) {
40 msg = "no machines were destroyed"
41 }
42 return fmt.Errorf("%s: %s", msg, strings.Join(errs, "; "))
43}

Subscribers

People subscribed via source and target branches

to status/vote changes: