~fwereade/juju-core/unit-remove-depart-scopes

« back to all changes in this revision

Viewing changes to state/apiserver/client/client.go

  • Committer: William Reade
  • Date: 2013-11-07 17:30:38 UTC
  • mfrom: (2032.1.6 juju-core)
  • Revision ID: fwereade@gmail.com-20131107173038-d0a72q96dujotc0z
merge parent

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
        "fmt"
9
9
 
10
10
        "launchpad.net/juju-core/charm"
 
11
        "launchpad.net/juju-core/environs"
11
12
        "launchpad.net/juju-core/juju"
12
13
        "launchpad.net/juju-core/state"
13
14
        "launchpad.net/juju-core/state/api"
80
81
        }, nil
81
82
}
82
83
 
83
 
// ServiceSet implements the server side of Client.ServiceSet.
 
84
// ServiceSet implements the server side of Client.ServiceSet. Values set to an
 
85
// empty string will be unset.
 
86
//
 
87
// (Deprecated) Use NewServiceSetForClientAPI instead, to preserve values set to
 
88
// an empty string, and use ServiceUnset to unset values.
84
89
func (c *Client) ServiceSet(p params.ServiceSet) error {
85
90
        svc, err := c.api.state.Service(p.ServiceName)
86
91
        if err != nil {
89
94
        return serviceSetSettingsStrings(svc, p.Options)
90
95
}
91
96
 
 
97
// NewServiceSetForClientAPI implements the server side of
 
98
// Client.NewServiceSetForClientAPI. This is exactly like ServiceSet except that
 
99
// it does not unset values that are set to an empty string.  ServiceUnset
 
100
// should be used for that.
 
101
//
 
102
// TODO(Nate): rename this to ServiceSet (and remove the deprecated ServiceSet)
 
103
// when the GUI handles the new behavior.
 
104
func (c *Client) NewServiceSetForClientAPI(p params.ServiceSet) error {
 
105
        svc, err := c.api.state.Service(p.ServiceName)
 
106
        if err != nil {
 
107
                return err
 
108
        }
 
109
        return newServiceSetSettingsStringsForClientAPI(svc, p.Options)
 
110
}
 
111
 
92
112
// ServiceUnset implements the server side of Client.ServiceUnset.
93
113
func (c *Client) ServiceUnset(p params.ServiceUnset) error {
94
114
        svc, err := c.api.state.Service(p.ServiceName)
273
293
        return service.UpdateConfigSettings(changes)
274
294
}
275
295
 
 
296
// newServiceSetSettingsStringsForClientAPI updates the settings for the given
 
297
// service, taking the configuration from a map of strings.
 
298
//
 
299
// TODO(Nate): replace serviceSetSettingsStrings with this onces the GUI no
 
300
// longer expects to be able to unset values by sending an empty string.
 
301
func newServiceSetSettingsStringsForClientAPI(service *state.Service, settings map[string]string) error {
 
302
        ch, _, err := service.Charm()
 
303
        if err != nil {
 
304
                return err
 
305
        }
 
306
 
 
307
        // Validate the settings.
 
308
        changes, err := ch.Config().ParseSettingsStrings(settings)
 
309
        if err != nil {
 
310
                return err
 
311
        }
 
312
 
 
313
        return service.UpdateConfigSettings(changes)
 
314
}
 
315
 
276
316
// ServiceSetCharm sets the charm for a given service.
277
317
func (c *Client) ServiceSetCharm(args params.ServiceSetCharm) error {
278
318
        service, err := c.api.state.Service(args.ServiceName)
512
552
        }
513
553
        return changes, nil
514
554
}
 
555
 
 
556
// EnvironmentGet implements the server-side part of the
 
557
// get-environment CLI command.
 
558
func (c *Client) EnvironmentGet() (params.EnvironmentGetResults, error) {
 
559
        result := params.EnvironmentGetResults{}
 
560
        // Get the existing environment config from the state.
 
561
        config, err := c.api.state.EnvironConfig()
 
562
        if err != nil {
 
563
                return result, err
 
564
        }
 
565
        result.Config = config.AllAttrs()
 
566
        return result, nil
 
567
}
 
568
 
 
569
// EnvironmentSet implements the server-side part of the
 
570
// set-environment CLI command.
 
571
func (c *Client) EnvironmentSet(args params.EnvironmentSet) error {
 
572
        // TODO(dimitern,thumper): 2013-11-06 bug #1167616
 
573
        // SetEnvironConfig should take both new and old configs.
 
574
 
 
575
        // Get the existing environment config from the state.
 
576
        oldConfig, err := c.api.state.EnvironConfig()
 
577
        if err != nil {
 
578
                return err
 
579
        }
 
580
        // Make sure we don't allow changing agent-version.
 
581
        if v, found := args.Config["agent-version"]; found {
 
582
                oldVersion, _ := oldConfig.AgentVersion()
 
583
                if v != oldVersion.String() {
 
584
                        return fmt.Errorf("agent-version cannot be changed")
 
585
                }
 
586
        }
 
587
        // Apply the attributes specified for the command to the state config.
 
588
        newConfig, err := oldConfig.Apply(args.Config)
 
589
        if err != nil {
 
590
                return err
 
591
        }
 
592
        env, err := environs.New(oldConfig)
 
593
        if err != nil {
 
594
                return err
 
595
        }
 
596
        // Now validate this new config against the existing config via the provider.
 
597
        provider := env.Provider()
 
598
        newProviderConfig, err := provider.Validate(newConfig, oldConfig)
 
599
        if err != nil {
 
600
                return err
 
601
        }
 
602
        // Now try to apply the new validated config.
 
603
        return c.api.state.SetEnvironConfig(newProviderConfig)
 
604
}