Skip to content

Commit 1648e52

Browse files
committed
Merge branch 'master' of https://github.com/juju/juju into unique-env-key
2 parents dff5173 + 166c204 commit 1648e52

File tree

188 files changed

+6263
-1564
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

188 files changed

+6263
-1564
lines changed

api/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ func (c *Client) Close() error {
600600

601601
// EnvironmentGet returns all environment settings.
602602
func (c *Client) EnvironmentGet() (map[string]interface{}, error) {
603-
result := params.EnvironmentGetResults{}
603+
result := params.EnvironmentConfigResults{}
604604
err := c.facade.FacadeCall("EnvironmentGet", nil, &result)
605605
return result.Config, err
606606
}

api/environmentmanager/environmentmanager.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ func NewClient(st base.APICallCloser) *Client {
3131
return &Client{ClientFacade: frontend, facade: backend}
3232
}
3333

34+
// ConfigSkeleton returns config values to be used as a starting point for the
35+
// API caller to construct a valid environment specific config. The provider
36+
// and region params are there for future use, and current behaviour expects
37+
// both of these to be empty.
38+
func (c *Client) ConfigSkeleton(provider, region string) (params.EnvironConfig, error) {
39+
var result params.EnvironConfigResult
40+
args := params.EnvironmentSkeletonConfigArgs{
41+
Provider: provider,
42+
Region: region,
43+
}
44+
err := c.facade.FacadeCall("ConfigSkeleton", args, &result)
45+
if err != nil {
46+
return nil, errors.Trace(err)
47+
}
48+
return result.Config, nil
49+
}
50+
3451
// CreateEnvironment creates a new environment using the account and
3552
// environment config specified in the args.
3653
func (c *Client) CreateEnvironment(owner string, account, config map[string]interface{}) (params.Environment, error) {

api/environmentmanager/environmentmanager_test.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
package environmentmanager_test
55

66
import (
7-
"github.com/juju/juju/feature"
8-
"github.com/juju/juju/testing/factory"
97
"github.com/juju/names"
108
jc "github.com/juju/testing/checkers"
119
"github.com/juju/utils"
1210
gc "gopkg.in/check.v1"
1311

1412
"github.com/juju/juju/api"
1513
"github.com/juju/juju/api/environmentmanager"
14+
"github.com/juju/juju/apiserver/params"
15+
"github.com/juju/juju/feature"
1616
"github.com/juju/juju/juju"
1717
jujutesting "github.com/juju/juju/juju/testing"
18+
coretesting "github.com/juju/juju/testing"
19+
"github.com/juju/juju/testing/factory"
1820
)
1921

2022
type environmentmanagerSuite struct {
@@ -34,6 +36,27 @@ func (s *environmentmanagerSuite) OpenAPI(c *gc.C) *environmentmanager.Client {
3436
return environmentmanager.NewClient(conn)
3537
}
3638

39+
func (s *environmentmanagerSuite) TestConfigSkeleton(c *gc.C) {
40+
s.SetFeatureFlags(feature.MESS)
41+
envManager := s.OpenAPI(c)
42+
result, err := envManager.ConfigSkeleton("", "")
43+
c.Assert(err, jc.ErrorIsNil)
44+
45+
// The apiPort changes every test run as the dummy provider
46+
// looks for a random open port.
47+
apiPort := s.Environ.Config().APIPort()
48+
49+
// Numbers coming over the api are floats, not ints.
50+
c.Assert(result, jc.DeepEquals, params.EnvironConfig{
51+
"type": "dummy",
52+
"ca-cert": coretesting.CACert,
53+
"state-port": float64(1234),
54+
"api-port": float64(apiPort),
55+
"syslog-port": float64(2345),
56+
})
57+
58+
}
59+
3760
func (s *environmentmanagerSuite) TestCreateEnvironmentBadUser(c *gc.C) {
3861
envManager := s.OpenAPI(c)
3962
_, err := envManager.CreateEnvironment("not a user", nil, nil)

api/facadeversions.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,41 @@ package api
1111
// New facades should start at 1.
1212
// Facades that existed before versioning start at 0.
1313
var facadeVersions = map[string]int{
14+
"Action": 0,
1415
"Agent": 1,
1516
"AllWatcher": 0,
1617
"Annotations": 1,
1718
"Backups": 0,
1819
"Charms": 1,
20+
"CharmRevisionUpdater": 0,
21+
"Client": 0,
1922
"Deployer": 0,
2023
"DiskFormatter": 1,
2124
"DiskManager": 1,
22-
"KeyUpdater": 0,
23-
"HighAvailability": 1,
24-
"Machiner": 0,
25-
"Networker": 0,
26-
"StringsWatcher": 0,
2725
"Environment": 0,
26+
"EnvironmentManager": 1,
27+
"Firewaller": 1,
28+
"HighAvailability": 1,
2829
"ImageManager": 1,
2930
"KeyManager": 0,
31+
"KeyUpdater": 0,
32+
"LeadershipService": 1,
3033
"Logger": 0,
34+
"Machiner": 0,
3135
"MetricsManager": 0,
36+
"Networker": 0,
37+
"NotifyWatcher": 0,
3238
"Pinger": 0,
3339
"Provisioner": 0,
3440
"Reboot": 1,
3541
"RelationUnitsWatcher": 0,
36-
"UserManager": 0,
37-
"CharmRevisionUpdater": 0,
38-
"Client": 0,
39-
"NotifyWatcher": 0,
40-
"Upgrader": 0,
41-
"Firewaller": 1,
4242
"Rsyslog": 0,
43-
"Uniter": 1,
44-
"Action": 0,
4543
"Service": 1,
46-
"EnvironmentManager": 1,
44+
"Storage": 1,
45+
"StringsWatcher": 0,
46+
"Upgrader": 0,
47+
"Uniter": 2,
48+
"UserManager": 0,
4749
}
4850

4951
// bestVersion tries to find the newest version in the version list that we can

api/facadeversions_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package api_test
55

66
import (
7+
"strings"
8+
79
"github.com/juju/utils/set"
810
gc "gopkg.in/check.v1"
911

@@ -21,7 +23,8 @@ var _ = gc.Suite(&facadeVersionSuite{})
2123

2224
func (s *facadeVersionSuite) TestFacadeVersionsMatchServerVersions(c *gc.C) {
2325
// Enable feature flags so we can see them all.
24-
s.SetFeatureFlags(feature.MESS)
26+
devFeatures := []string{feature.MESS, feature.Storage}
27+
s.SetFeatureFlags(strings.Join(devFeatures, ","))
2528
// The client side code doesn't want to directly import the server side
2629
// code just to list out what versions are available. However, we do
2730
// want to make sure that the two sides are kept in sync.

api/storage/client.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2015 Canonical Ltd.
2+
// Licensed under the AGPLv3, see LICENCE file for details.
3+
4+
package storage
5+
6+
import (
7+
"github.com/juju/errors"
8+
"github.com/juju/loggo"
9+
"github.com/juju/names"
10+
11+
"github.com/juju/juju/api/base"
12+
"github.com/juju/juju/apiserver/params"
13+
)
14+
15+
var logger = loggo.GetLogger("juju.api.storage")
16+
17+
// Client allows access to the storage API end point.
18+
type Client struct {
19+
base.ClientFacade
20+
facade base.FacadeCaller
21+
}
22+
23+
// NewClient creates a new client for accessing the storage API.
24+
func NewClient(st base.APICallCloser) *Client {
25+
frontend, backend := base.NewClientFacade(st, "Storage")
26+
logger.Debugf("\nSTORAGE FRONT-END: %#v", frontend)
27+
logger.Debugf("\nSTORAGE BACK-END: %#v", backend)
28+
return &Client{ClientFacade: frontend, facade: backend}
29+
}
30+
31+
func (c *Client) Show(tags []names.StorageTag) ([]params.StorageInstance, error) {
32+
found := params.StorageShowResults{}
33+
entities := make([]params.Entity, len(tags))
34+
for i, tag := range tags {
35+
entities[i] = params.Entity{Tag: tag.String()}
36+
}
37+
if err := c.facade.FacadeCall("Show", params.Entities{Entities: entities}, &found); err != nil {
38+
return nil, errors.Trace(err)
39+
}
40+
all := []params.StorageInstance{}
41+
allErr := params.ErrorResults{}
42+
for _, result := range found.Results {
43+
if result.Error.Error != nil {
44+
allErr.Results = append(allErr.Results, result.Error)
45+
continue
46+
}
47+
all = append(all, result.Result)
48+
}
49+
return all, allErr.Combine()
50+
}

api/storage/client_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright 2015 Canonical Ltd.
2+
// Licensed under the AGPLv3, see LICENCE file for details.
3+
4+
package storage_test
5+
6+
import (
7+
"github.com/juju/names"
8+
jc "github.com/juju/testing/checkers"
9+
gc "gopkg.in/check.v1"
10+
11+
basetesting "github.com/juju/juju/api/base/testing"
12+
"github.com/juju/juju/api/storage"
13+
"github.com/juju/juju/apiserver/params"
14+
"github.com/juju/juju/testing"
15+
"github.com/juju/utils/set"
16+
)
17+
18+
type storageMockSuite struct {
19+
testing.BaseSuite
20+
}
21+
22+
var _ = gc.Suite(&storageMockSuite{})
23+
24+
func (s *storageMockSuite) TestShow(c *gc.C) {
25+
var called bool
26+
27+
one := "shared-fs/0"
28+
oneTag := names.NewStorageTag(one)
29+
two := "db-dir/1000"
30+
twoTag := names.NewStorageTag(two)
31+
expected := set.NewStrings(oneTag.String(), twoTag.String())
32+
33+
apiCaller := basetesting.APICallerFunc(
34+
func(objType string,
35+
version int,
36+
id, request string,
37+
a, result interface{},
38+
) error {
39+
called = true
40+
c.Check(objType, gc.Equals, "Storage")
41+
c.Check(id, gc.Equals, "")
42+
c.Check(request, gc.Equals, "Show")
43+
44+
args, ok := a.(params.Entities)
45+
c.Assert(ok, jc.IsTrue)
46+
c.Assert(args.Entities, gc.HasLen, 2)
47+
48+
if results, k := result.(*params.StorageShowResults); k {
49+
instances := make([]params.StorageShowResult, len(args.Entities))
50+
for i, entity := range args.Entities {
51+
c.Assert(expected.Contains(entity.Tag), jc.IsTrue)
52+
instances[i] = params.StorageShowResult{
53+
Result: params.StorageInstance{StorageTag: entity.Tag},
54+
}
55+
}
56+
results.Results = instances
57+
}
58+
59+
return nil
60+
})
61+
storageClient := storage.NewClient(apiCaller)
62+
tags := []names.StorageTag{oneTag, twoTag}
63+
found, err := storageClient.Show(tags)
64+
c.Assert(err, jc.ErrorIsNil)
65+
c.Assert(found, gc.HasLen, 2)
66+
c.Assert(expected.Contains(found[0].StorageTag), jc.IsTrue)
67+
c.Assert(expected.Contains(found[1].StorageTag), jc.IsTrue)
68+
c.Assert(called, jc.IsTrue)
69+
}

api/storage/package_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright 2015 Canonical Ltd.
2+
// Licensed under the AGPLv3, see LICENCE file for details.
3+
4+
package storage_test
5+
6+
import (
7+
"testing"
8+
9+
gc "gopkg.in/check.v1"
10+
)
11+
12+
func TestAll(t *testing.T) {
13+
gc.TestingT(t)
14+
}

0 commit comments

Comments
 (0)