~juju-qa/ubuntu/xenial/juju/xenial-2.0-beta3

« back to all changes in this revision

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

  • Committer: Martin Packman
  • Date: 2016-03-30 19:31:08 UTC
  • mfrom: (1.1.41)
  • Revision ID: martin.packman@canonical.com-20160330193108-h9iz3ak334uk0z5r
Merge new upstream source 2.0~beta3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package modelcmd
 
2
 
 
3
import (
 
4
        "net/http"
 
5
        "os"
 
6
 
 
7
        "github.com/juju/errors"
 
8
        "github.com/juju/idmclient/ussologin"
 
9
        "github.com/juju/persistent-cookiejar"
 
10
        "gopkg.in/juju/environschema.v1/form"
 
11
        "gopkg.in/macaroon-bakery.v1/httpbakery"
 
12
 
 
13
        "github.com/juju/cmd"
 
14
        "github.com/juju/juju/jujuclient"
 
15
)
 
16
 
 
17
// APIContext holds the context required for making connections to
 
18
// APIs used by juju.
 
19
type APIContext struct {
 
20
        Jar          *cookiejar.Jar
 
21
        BakeryClient *httpbakery.Client
 
22
}
 
23
 
 
24
// NewAPIContext returns an API context that will use the given
 
25
// context for user interactions when authorizing.
 
26
// The returned API context must be closed after use.
 
27
//
 
28
// If ctxt is nil, no command-line authorization
 
29
// will be supported.
 
30
//
 
31
// This function is provided for use by commands that cannot use
 
32
// JujuCommandBase. Most clients should use that instead.
 
33
func NewAPIContext(ctxt *cmd.Context) (*APIContext, error) {
 
34
        jar, err := cookiejar.New(&cookiejar.Options{
 
35
                Filename: cookieFile(),
 
36
        })
 
37
        if err != nil {
 
38
                return nil, errors.Trace(err)
 
39
        }
 
40
        client := httpbakery.NewClient()
 
41
        client.Jar = jar
 
42
        if ctxt != nil {
 
43
                filler := &form.IOFiller{
 
44
                        In:  ctxt.Stdin,
 
45
                        Out: ctxt.Stdout,
 
46
                }
 
47
                client.VisitWebPage = ussologin.VisitWebPage(
 
48
                        "juju",
 
49
                        &http.Client{},
 
50
                        filler,
 
51
                        jujuclient.NewTokenStore(),
 
52
                )
 
53
        } else {
 
54
                client.VisitWebPage = httpbakery.OpenWebBrowser
 
55
        }
 
56
        return &APIContext{
 
57
                Jar:          jar,
 
58
                BakeryClient: client,
 
59
        }, nil
 
60
}
 
61
 
 
62
// cookieFile returns the path to the cookie used to store authorization
 
63
// macaroons. The returned value can be overridden by setting the
 
64
// JUJU_COOKIEFILE or GO_COOKIEFILE environment variables.
 
65
func cookieFile() string {
 
66
        if file := os.Getenv("JUJU_COOKIEFILE"); file != "" {
 
67
                return file
 
68
        }
 
69
        return cookiejar.DefaultCookieFile()
 
70
}
 
71
 
 
72
// Close closes the API context, saving any cookies to the
 
73
// persistent cookie jar.
 
74
func (ctxt *APIContext) Close() error {
 
75
        if err := ctxt.Jar.Save(); err != nil {
 
76
                return errors.Annotatef(err, "cannot save cookie jar")
 
77
        }
 
78
        return nil
 
79
}