~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/cmd/modelcmd/clientstore.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2016 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package modelcmd
 
5
 
 
6
import (
 
7
        "github.com/juju/errors"
 
8
        "gopkg.in/juju/names.v2"
 
9
 
 
10
        "github.com/juju/juju/jujuclient"
 
11
)
 
12
 
 
13
// QualifyingClientStore wraps a jujuclient.ClientStore, modifying
 
14
// model-related methods such that they accept unqualified model
 
15
// names, and automatically qualify them with the logged-in user
 
16
// name as necessary.
 
17
type QualifyingClientStore struct {
 
18
        jujuclient.ClientStore
 
19
}
 
20
 
 
21
// QualifiedModelName returns a Qualified model name, given either
 
22
// an unqualified or qualified model name. If the input is a
 
23
// fully qualified name, it is returned untouched; otherwise it is
 
24
// return qualified with the logged-in user name.
 
25
func (s QualifyingClientStore) QualifiedModelName(controllerName, modelName string) (string, error) {
 
26
        if !jujuclient.IsQualifiedModelName(modelName) {
 
27
                details, err := s.ClientStore.AccountDetails(controllerName)
 
28
                if err != nil {
 
29
                        return "", errors.Annotate(err, "getting account details for qualifying model name")
 
30
                }
 
31
                owner := names.NewUserTag(details.User)
 
32
                modelName = jujuclient.JoinOwnerModelName(owner, modelName)
 
33
        } else {
 
34
                unqualifiedModelName, owner, err := jujuclient.SplitModelName(modelName)
 
35
                if err != nil {
 
36
                        return "", errors.Trace(err)
 
37
                }
 
38
                // Make sure that the user name is canonical.
 
39
                owner = names.NewUserTag(owner.Canonical())
 
40
                modelName = jujuclient.JoinOwnerModelName(owner, unqualifiedModelName)
 
41
        }
 
42
        return modelName, nil
 
43
}
 
44
 
 
45
// Implements jujuclient.ModelGetter.
 
46
func (s QualifyingClientStore) ModelByName(controllerName, modelName string) (*jujuclient.ModelDetails, error) {
 
47
        modelName, err := s.QualifiedModelName(controllerName, modelName)
 
48
        if err != nil {
 
49
                return nil, errors.Annotatef(err, "getting model %q", modelName)
 
50
        }
 
51
        return s.ClientStore.ModelByName(controllerName, modelName)
 
52
}
 
53
 
 
54
// Implements jujuclient.ModelUpdater.
 
55
func (s QualifyingClientStore) UpdateModel(controllerName, modelName string, details jujuclient.ModelDetails) error {
 
56
        modelName, err := s.QualifiedModelName(controllerName, modelName)
 
57
        if err != nil {
 
58
                return errors.Annotatef(err, "updating model %q", modelName)
 
59
        }
 
60
        return s.ClientStore.UpdateModel(controllerName, modelName, details)
 
61
}
 
62
 
 
63
// Implements jujuclient.ModelUpdater.
 
64
func (s QualifyingClientStore) SetCurrentModel(controllerName, modelName string) error {
 
65
        modelName, err := s.QualifiedModelName(controllerName, modelName)
 
66
        if err != nil {
 
67
                return errors.Annotatef(err, "setting current model to %q", modelName)
 
68
        }
 
69
        return s.ClientStore.SetCurrentModel(controllerName, modelName)
 
70
}
 
71
 
 
72
// Implements jujuclient.ModelRemover.
 
73
func (s QualifyingClientStore) RemoveModel(controllerName, modelName string) error {
 
74
        modelName, err := s.QualifiedModelName(controllerName, modelName)
 
75
        if err != nil {
 
76
                return errors.Annotatef(err, "removing model %q", modelName)
 
77
        }
 
78
        return s.ClientStore.RemoveModel(controllerName, modelName)
 
79
}