Merge lp:~mattyw/juju-core/add-environment into lp:~go-bot/juju-core/trunk

Proposed by Matthew Williams
Status: Work in progress
Proposed branch: lp:~mattyw/juju-core/add-environment
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 142 lines (+133/-0)
2 files modified
cmd/juju/addenvironment.go (+72/-0)
cmd/juju/addenvironment_test.go (+61/-0)
To merge this branch: bzr merge lp:~mattyw/juju-core/add-environment
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+214035@code.launchpad.net

Description of the change

add-environment command for importing jenv files

Added an add-environment command that can be used for importing jenv files.

https://codereview.appspot.com/82910046/

To post a comment you must log in.

Unmerged revisions

2536. By Matthew Williams

started work on addenvironment command, supports name args and reading yaml from stdin

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'cmd/juju/addenvironment.go'
2--- cmd/juju/addenvironment.go 1970-01-01 00:00:00 +0000
3+++ cmd/juju/addenvironment.go 2014-04-03 13:57:05 +0000
4@@ -0,0 +1,72 @@
5+// Copyright 2014 Canonical Ltd.
6+// Licensed under the AGPLv3, see LICENCE file for details.
7+
8+package main
9+
10+import (
11+ "fmt"
12+ "io/ioutil"
13+
14+ "launchpad.net/goyaml"
15+ "launchpad.net/juju-core/cmd"
16+ "launchpad.net/juju-core/cmd/envcmd"
17+ "launchpad.net/juju-core/environs/configstore"
18+)
19+
20+const addEnvDoc = `
21+`
22+
23+type AddEnvironmentCommand struct {
24+ envcmd.EnvCommandBase
25+ InputEnvName string
26+}
27+
28+func (c *AddEnvironmentCommand) Info() *cmd.Info {
29+ return &cmd.Info{
30+ Name: "add-environment",
31+ Args: "",
32+ Purpose: "",
33+ Doc: addEnvDoc,
34+ }
35+}
36+
37+func (c *AddEnvironmentCommand) Init(args []string) error {
38+ err := c.EnvCommandBase.Init()
39+ if err != nil {
40+ return err
41+ }
42+ switch len(args) {
43+ case 0:
44+ return fmt.Errorf("no environment name supplied")
45+ case 1:
46+ c.InputEnvName = args[0]
47+ default:
48+ return cmd.CheckEmpty(args[1:])
49+ }
50+ return cmd.CheckEmpty(args[1:])
51+}
52+
53+func (c *AddEnvironmentCommand) Run(ctx *cmd.Context) error {
54+ stdinData, err := ioutil.ReadAll(ctx.GetStdin())
55+ if err != nil {
56+ return fmt.Errorf("couldn't read data from stdin %v", err)
57+ }
58+
59+ envData := configstore.EnvironInfoData{}
60+ err = goyaml.Unmarshal(stdinData, &envData)
61+ if err != nil {
62+ return fmt.Errorf("failed to parse input data %v", err)
63+ }
64+
65+ store, err := configstore.Default()
66+
67+ envInfo, err := store.CreateInfo(c.InputEnvName)
68+ if err != nil {
69+ return fmt.Errorf("Failed to create info %v", err)
70+ }
71+
72+ envInfo.SetAPICredentials(configstore.APICredentials{envData.User, envData.Password})
73+ envInfo.SetAPIEndpoint(configstore.APIEndpoint{envData.StateServers, envData.CACert})
74+
75+ return envInfo.Write()
76+}
77
78=== added file 'cmd/juju/addenvironment_test.go'
79--- cmd/juju/addenvironment_test.go 1970-01-01 00:00:00 +0000
80+++ cmd/juju/addenvironment_test.go 2014-04-03 13:57:05 +0000
81@@ -0,0 +1,61 @@
82+// Copyright 2014 Canonical Ltd.
83+// Licensed under the AGPLv3, see LICENCE file for details.
84+
85+package main
86+
87+import (
88+ "bytes"
89+
90+ gc "launchpad.net/gocheck"
91+
92+ "launchpad.net/goyaml"
93+
94+ "launchpad.net/juju-core/cmd"
95+ "launchpad.net/juju-core/environs/configstore"
96+ jujutesting "launchpad.net/juju-core/juju/testing"
97+ "launchpad.net/juju-core/testing"
98+)
99+
100+type AddEnvironmentSuite struct {
101+ jujutesting.RepoSuite
102+}
103+
104+var _ = gc.Suite(&AddEnvironmentSuite{})
105+
106+func (s *AddEnvironmentSuite) TestTooManyArgs(c *gc.C) {
107+ _, err := testing.RunCommand(c, &AddEnvironmentCommand{}, []string{"name", "whoops"})
108+ c.Assert(err, gc.ErrorMatches, `unrecognized args: \["whoops"\]`)
109+}
110+
111+func (s *AddEnvironmentSuite) TestNotEnoughArgs(c *gc.C) {
112+ _, err := testing.RunCommand(c, &AddEnvironmentCommand{}, []string{})
113+ c.Assert(err, gc.ErrorMatches, `no environment name supplied`)
114+}
115+
116+func (s *AddEnvironmentSuite) TestAddEnvironment(c *gc.C) {
117+ var stdin bytes.Buffer
118+ ctx, err := cmd.DefaultContext()
119+ c.Assert(err, gc.IsNil)
120+ ctx.Stdin = &stdin
121+
122+ jenvData := configstore.EnvironInfoData{
123+ "username",
124+ "password",
125+ []string{"state-server"},
126+ "cacert", map[string]interface{}{},
127+ }
128+ input, err := goyaml.Marshal(jenvData)
129+ c.Assert(err, gc.IsNil)
130+ stdin.WriteString(string(input))
131+ _, errc := runCommand(ctx, new(AddEnvironmentCommand), "name")
132+ c.Assert(<-errc, gc.IsNil)
133+ store, err := configstore.Default()
134+ c.Assert(err, gc.IsNil)
135+
136+ envInfo, err := store.ReadInfo("name")
137+ c.Assert(err, gc.IsNil)
138+ c.Assert(envInfo.APICredentials().User, gc.Equals, jenvData.User)
139+ c.Assert(envInfo.APICredentials().Password, gc.Equals, jenvData.Password)
140+ c.Assert(envInfo.APIEndpoint().Addresses, gc.DeepEquals, jenvData.StateServers)
141+ c.Assert(envInfo.APIEndpoint().CACert, gc.Equals, jenvData.CACert)
142+}

Subscribers

People subscribed via source and target branches

to status/vote changes: