1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
jc "github.com/juju/testing/checkers"
9
"gopkg.in/juju/names.v2"
13
type ApplicationSerializationSuite struct {
14
SliceSerializationSuite
15
StatusHistoryMixinSuite
18
var _ = gc.Suite(&ApplicationSerializationSuite{})
20
func (s *ApplicationSerializationSuite) SetUpTest(c *gc.C) {
21
s.SliceSerializationSuite.SetUpTest(c)
22
s.importName = "applications"
23
s.sliceName = "applications"
24
s.importFunc = func(m map[string]interface{}) (interface{}, error) {
25
return importApplications(m)
27
s.testFields = func(m map[string]interface{}) {
28
m["applications"] = []interface{}{}
30
s.StatusHistoryMixinSuite.creator = func() HasStatusHistory {
31
return minimalApplication()
33
s.StatusHistoryMixinSuite.serializer = func(c *gc.C, initial interface{}) HasStatusHistory {
34
return s.exportImport(c, initial.(*application))
38
func minimalApplicationMap() map[interface{}]interface{} {
39
return map[interface{}]interface{}{
42
"charm-url": "cs:trusty/ubuntu",
43
"cs-channel": "stable",
44
"charm-mod-version": 1,
45
"status": minimalStatusMap(),
46
"status-history": emptyStatusHistoryMap(),
47
"settings": map[interface{}]interface{}{
50
"settings-refcount": 1,
52
"leadership-settings": map[interface{}]interface{}{
55
"metrics-creds": "c2Vrcml0", // base64 encoded
56
"units": map[interface{}]interface{}{
58
"units": []interface{}{
65
func minimalApplication() *application {
66
s := newApplication(minimalApplicationArgs())
67
s.SetStatus(minimalStatusArgs())
68
u := s.AddUnit(minimalUnitArgs())
69
u.SetAgentStatus(minimalStatusArgs())
70
u.SetWorkloadStatus(minimalStatusArgs())
71
u.SetTools(minimalAgentToolsArgs())
75
func addMinimalApplication(model Model) {
76
s := model.AddApplication(minimalApplicationArgs())
77
s.SetStatus(minimalStatusArgs())
78
u := s.AddUnit(minimalUnitArgs())
79
u.SetAgentStatus(minimalStatusArgs())
80
u.SetWorkloadStatus(minimalStatusArgs())
81
u.SetTools(minimalAgentToolsArgs())
84
func minimalApplicationArgs() ApplicationArgs {
85
return ApplicationArgs{
86
Tag: names.NewApplicationTag("ubuntu"),
88
CharmURL: "cs:trusty/ubuntu",
90
CharmModifiedVersion: 1,
91
Settings: map[string]interface{}{
96
LeadershipSettings: map[string]interface{}{
99
MetricsCredentials: []byte("sekrit"),
103
func (s *ApplicationSerializationSuite) TestNewApplication(c *gc.C) {
104
args := ApplicationArgs{
105
Tag: names.NewApplicationTag("magic"),
108
CharmURL: "cs:zesty/magic",
110
CharmModifiedVersion: 1,
113
MinUnits: 42, // no judgement is made by the migration code
114
Settings: map[string]interface{}{
119
LeadershipSettings: map[string]interface{}{
122
MetricsCredentials: []byte("sekrit"),
124
application := newApplication(args)
126
c.Assert(application.Name(), gc.Equals, "magic")
127
c.Assert(application.Tag(), gc.Equals, names.NewApplicationTag("magic"))
128
c.Assert(application.Series(), gc.Equals, "zesty")
129
c.Assert(application.Subordinate(), jc.IsTrue)
130
c.Assert(application.CharmURL(), gc.Equals, "cs:zesty/magic")
131
c.Assert(application.Channel(), gc.Equals, "stable")
132
c.Assert(application.CharmModifiedVersion(), gc.Equals, 1)
133
c.Assert(application.ForceCharm(), jc.IsTrue)
134
c.Assert(application.Exposed(), jc.IsTrue)
135
c.Assert(application.MinUnits(), gc.Equals, 42)
136
c.Assert(application.Settings(), jc.DeepEquals, args.Settings)
137
c.Assert(application.SettingsRefCount(), gc.Equals, 1)
138
c.Assert(application.Leader(), gc.Equals, "magic/1")
139
c.Assert(application.LeadershipSettings(), jc.DeepEquals, args.LeadershipSettings)
140
c.Assert(application.MetricsCredentials(), jc.DeepEquals, []byte("sekrit"))
143
func (s *ApplicationSerializationSuite) TestMinimalApplicationValid(c *gc.C) {
144
application := minimalApplication()
145
c.Assert(application.Validate(), jc.ErrorIsNil)
148
func (s *ApplicationSerializationSuite) TestMinimalMatches(c *gc.C) {
149
bytes, err := yaml.Marshal(minimalApplication())
150
c.Assert(err, jc.ErrorIsNil)
152
var source map[interface{}]interface{}
153
err = yaml.Unmarshal(bytes, &source)
154
c.Assert(err, jc.ErrorIsNil)
155
c.Assert(source, jc.DeepEquals, minimalApplicationMap())
158
func (s *ApplicationSerializationSuite) exportImport(c *gc.C, application_ *application) *application {
159
initial := applications{
161
Applications_: []*application{application_},
164
bytes, err := yaml.Marshal(initial)
165
c.Assert(err, jc.ErrorIsNil)
167
var source map[string]interface{}
168
err = yaml.Unmarshal(bytes, &source)
169
c.Assert(err, jc.ErrorIsNil)
171
applications, err := importApplications(source)
172
c.Assert(err, jc.ErrorIsNil)
173
c.Assert(applications, gc.HasLen, 1)
174
return applications[0]
177
func (s *ApplicationSerializationSuite) TestParsingSerializedData(c *gc.C) {
178
svc := minimalApplication()
179
application := s.exportImport(c, svc)
180
c.Assert(application, jc.DeepEquals, svc)
183
func (s *ApplicationSerializationSuite) TestAnnotations(c *gc.C) {
184
initial := minimalApplication()
185
annotations := map[string]string{
189
initial.SetAnnotations(annotations)
191
application := s.exportImport(c, initial)
192
c.Assert(application.Annotations(), jc.DeepEquals, annotations)
195
func (s *ApplicationSerializationSuite) TestConstraints(c *gc.C) {
196
initial := minimalApplication()
197
args := ConstraintsArgs{
198
Architecture: "amd64",
202
initial.SetConstraints(args)
204
application := s.exportImport(c, initial)
205
c.Assert(application.Constraints(), jc.DeepEquals, newConstraints(args))
208
func (s *ApplicationSerializationSuite) TestLeaderValid(c *gc.C) {
209
args := minimalApplicationArgs()
210
args.Leader = "ubuntu/1"
211
application := newApplication(args)
212
application.SetStatus(minimalStatusArgs())
214
err := application.Validate()
215
c.Assert(err, gc.ErrorMatches, `missing unit for leader "ubuntu/1" not valid`)