LEFT | RIGHT |
1 // launchpad.net/juju/go/state | 1 // launchpad.net/juju/go/state |
2 // | 2 // |
3 // Copyright (c) 2011-2012 Canonical Ltd. | 3 // Copyright (c) 2011-2012 Canonical Ltd. |
4 package state_test | 4 package state_test |
5 | 5 |
6 import ( | 6 import ( |
7 "fmt" | 7 "fmt" |
8 . "launchpad.net/gocheck" | 8 . "launchpad.net/gocheck" |
9 "launchpad.net/gozk/zookeeper" | 9 "launchpad.net/gozk/zookeeper" |
10 "launchpad.net/juju/go/charm" | 10 "launchpad.net/juju/go/charm" |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 func (s StateSuite) TestGetNonExistentCharm(c *C) { | 135 func (s StateSuite) TestGetNonExistentCharm(c *C) { |
136 // Check that getting a non-existent charm fails nicely. | 136 // Check that getting a non-existent charm fails nicely. |
137 addDummyCharm(c, s.st) | 137 addDummyCharm(c, s.st) |
138 | 138 |
139 curl := charm.MustParseURL("local:anotherseries/dummy-1") | 139 curl := charm.MustParseURL("local:anotherseries/dummy-1") |
140 _, err := s.st.Charm(curl) | 140 _, err := s.st.Charm(curl) |
141 c.Assert(err, ErrorMatches, `charm not found: "local:anotherseries/dummy
-1"`) | 141 c.Assert(err, ErrorMatches, `charm not found: "local:anotherseries/dummy
-1"`) |
142 } | 142 } |
143 | 143 |
144 func (s StateSuite) TestAddMachine(c *C) { | 144 func (s StateSuite) TestAddMachine(c *C) { |
145 // Check that adding machines works correctly. | |
146 machine0, err := s.st.AddMachine() | 145 machine0, err := s.st.AddMachine() |
147 c.Assert(err, IsNil) | 146 c.Assert(err, IsNil) |
148 c.Assert(machine0.Id(), Equals, 0) | 147 c.Assert(machine0.Id(), Equals, 0) |
149 machine1, err := s.st.AddMachine() | 148 machine1, err := s.st.AddMachine() |
150 c.Assert(err, IsNil) | 149 c.Assert(err, IsNil) |
151 c.Assert(machine1.Id(), Equals, 1) | 150 c.Assert(machine1.Id(), Equals, 1) |
152 | 151 |
153 children, _, err := s.zkConn.Children("/machines") | 152 children, _, err := s.zkConn.Children("/machines") |
154 c.Assert(err, IsNil) | 153 c.Assert(err, IsNil) |
155 sort.Strings(children) | 154 sort.Strings(children) |
156 c.Assert(children, DeepEquals, []string{"machine-0000000000", "machine-0
000000001"}) | 155 c.Assert(children, DeepEquals, []string{"machine-0000000000", "machine-0
000000001"}) |
157 } | 156 } |
158 | 157 |
159 func (s StateSuite) TestRemoveMachine(c *C) { | 158 func (s StateSuite) TestRemoveMachine(c *C) { |
160 // Check that removing a machine doesn't fail. | |
161 machine, err := s.st.AddMachine() | 159 machine, err := s.st.AddMachine() |
162 c.Assert(err, IsNil) | 160 c.Assert(err, IsNil) |
163 _, err = s.st.AddMachine() | 161 _, err = s.st.AddMachine() |
164 c.Assert(err, IsNil) | 162 c.Assert(err, IsNil) |
165 err = s.st.RemoveMachine(machine.Id()) | 163 err = s.st.RemoveMachine(machine.Id()) |
166 c.Assert(err, IsNil) | 164 c.Assert(err, IsNil) |
167 | 165 |
168 children, _, err := s.zkConn.Children("/machines") | 166 children, _, err := s.zkConn.Children("/machines") |
169 c.Assert(err, IsNil) | 167 c.Assert(err, IsNil) |
170 sort.Strings(children) | 168 sort.Strings(children) |
171 c.Assert(children, DeepEquals, []string{"machine-0000000001"}) | 169 c.Assert(children, DeepEquals, []string{"machine-0000000001"}) |
172 | 170 |
173 // Removing a non-existing machine has to fail. | 171 // Removing a non-existing machine has to fail. |
174 err = s.st.RemoveMachine(machine.Id()) | 172 err = s.st.RemoveMachine(machine.Id()) |
175 » c.Assert(err, ErrorMatches, "machine 0 does not exist") | 173 » c.Assert(err, ErrorMatches, "can't remove machine 0: machine not found") |
176 } | 174 } |
177 | 175 |
178 func (s StateSuite) TestReadMachine(c *C) { | 176 func (s StateSuite) TestReadMachine(c *C) { |
179 // Check that reading a machine doesn't fail. | |
180 machine, err := s.st.AddMachine() | 177 machine, err := s.st.AddMachine() |
181 c.Assert(err, IsNil) | 178 c.Assert(err, IsNil) |
182 expectedId := machine.Id() | 179 expectedId := machine.Id() |
183 machine, err = s.st.Machine(expectedId) | 180 machine, err = s.st.Machine(expectedId) |
184 c.Assert(err, IsNil) | 181 c.Assert(err, IsNil) |
185 c.Assert(machine.Id(), Equals, expectedId) | 182 c.Assert(machine.Id(), Equals, expectedId) |
186 } | 183 } |
187 | 184 |
188 func (s StateSuite) TestReadNonExistentMachine(c *C) { | 185 func (s StateSuite) TestReadNonExistentMachine(c *C) { |
189 // Check that reading a non-existent machine fails nicely. | |
190 _, err := s.st.Machine(0) | 186 _, err := s.st.Machine(0) |
191 c.Assert(err, ErrorMatches, "machine 0 not found") | 187 c.Assert(err, ErrorMatches, "machine 0 not found") |
192 | 188 |
193 _, err = s.st.AddMachine() | 189 _, err = s.st.AddMachine() |
194 c.Assert(err, IsNil) | 190 c.Assert(err, IsNil) |
195 _, err = s.st.Machine(1) | 191 _, err = s.st.Machine(1) |
196 c.Assert(err, ErrorMatches, "machine 1 not found") | 192 c.Assert(err, ErrorMatches, "machine 1 not found") |
197 } | 193 } |
198 | 194 |
199 func (s StateSuite) TestAllMachines(c *C) { | 195 func (s StateSuite) TestAllMachines(c *C) { |
200 // Check that reading all machines works correctly. | |
201 machines, err := s.st.AllMachines() | 196 machines, err := s.st.AllMachines() |
202 c.Assert(err, IsNil) | 197 c.Assert(err, IsNil) |
203 c.Assert(len(machines), Equals, 0) | 198 c.Assert(len(machines), Equals, 0) |
204 | 199 |
205 _, err = s.st.AddMachine() | 200 _, err = s.st.AddMachine() |
206 c.Assert(err, IsNil) | 201 c.Assert(err, IsNil) |
207 machines, err = s.st.AllMachines() | 202 machines, err = s.st.AllMachines() |
208 c.Assert(err, IsNil) | 203 c.Assert(err, IsNil) |
209 c.Assert(len(machines), Equals, 1) | 204 c.Assert(len(machines), Equals, 1) |
210 | 205 |
211 _, err = s.st.AddMachine() | 206 _, err = s.st.AddMachine() |
212 c.Assert(err, IsNil) | 207 c.Assert(err, IsNil) |
213 machines, err = s.st.AllMachines() | 208 machines, err = s.st.AllMachines() |
214 c.Assert(err, IsNil) | 209 c.Assert(err, IsNil) |
215 c.Assert(len(machines), Equals, 2) | 210 c.Assert(len(machines), Equals, 2) |
216 } | 211 } |
217 | 212 |
218 func (s StateSuite) TestAddService(c *C) { | 213 func (s StateSuite) TestAddService(c *C) { |
219 // Check that adding services works correctly. | |
220 dummy, curl := addDummyCharm(c, s.st) | 214 dummy, curl := addDummyCharm(c, s.st) |
221 wordpress, err := s.st.AddService("wordpress", dummy) | 215 wordpress, err := s.st.AddService("wordpress", dummy) |
222 c.Assert(err, IsNil) | 216 c.Assert(err, IsNil) |
223 c.Assert(wordpress.Name(), Equals, "wordpress") | 217 c.Assert(wordpress.Name(), Equals, "wordpress") |
224 mysql, err := s.st.AddService("mysql", dummy) | 218 mysql, err := s.st.AddService("mysql", dummy) |
225 c.Assert(err, IsNil) | 219 c.Assert(err, IsNil) |
226 c.Assert(mysql.Name(), Equals, "mysql") | 220 c.Assert(mysql.Name(), Equals, "mysql") |
227 | 221 |
228 // Check that retrieving the new created services works correctly. | 222 // Check that retrieving the new created services works correctly. |
229 wordpress, err = s.st.Service("wordpress") | 223 wordpress, err = s.st.Service("wordpress") |
230 c.Assert(err, IsNil) | 224 c.Assert(err, IsNil) |
231 c.Assert(wordpress.Name(), Equals, "wordpress") | 225 c.Assert(wordpress.Name(), Equals, "wordpress") |
232 url, err := wordpress.CharmURL() | 226 url, err := wordpress.CharmURL() |
233 c.Assert(err, IsNil) | 227 c.Assert(err, IsNil) |
234 c.Assert(url.String(), Equals, curl.String()) | 228 c.Assert(url.String(), Equals, curl.String()) |
235 mysql, err = s.st.Service("mysql") | 229 mysql, err = s.st.Service("mysql") |
236 c.Assert(err, IsNil) | 230 c.Assert(err, IsNil) |
237 c.Assert(mysql.Name(), Equals, "mysql") | 231 c.Assert(mysql.Name(), Equals, "mysql") |
238 url, err = mysql.CharmURL() | 232 url, err = mysql.CharmURL() |
239 c.Assert(err, IsNil) | 233 c.Assert(err, IsNil) |
240 c.Assert(url.String(), Equals, curl.String()) | 234 c.Assert(url.String(), Equals, curl.String()) |
241 } | 235 } |
242 | 236 |
243 func (s StateSuite) TestRemoveService(c *C) { | 237 func (s StateSuite) TestRemoveService(c *C) { |
244 dummy, _ := addDummyCharm(c, s.st) | 238 dummy, _ := addDummyCharm(c, s.st) |
245 service, err := s.st.AddService("wordpress", dummy) | 239 service, err := s.st.AddService("wordpress", dummy) |
246 c.Assert(err, IsNil) | 240 c.Assert(err, IsNil) |
247 | 241 |
248 // Check that removing the service works correctly. | |
249 err = s.st.RemoveService(service) | 242 err = s.st.RemoveService(service) |
250 c.Assert(err, IsNil) | 243 c.Assert(err, IsNil) |
251 service, err = s.st.Service("wordpress") | 244 service, err = s.st.Service("wordpress") |
252 c.Assert(err, ErrorMatches, `service with name "wordpress" not found`) | 245 c.Assert(err, ErrorMatches, `service with name "wordpress" not found`) |
253 } | 246 } |
254 | 247 |
255 func (s StateSuite) TestReadNonExistentService(c *C) { | 248 func (s StateSuite) TestReadNonExistentService(c *C) { |
256 // Check that reading a non-existent service fails nicely. | |
257 _, err := s.st.Service("pressword") | 249 _, err := s.st.Service("pressword") |
258 c.Assert(err, ErrorMatches, `service with name "pressword" not found`) | 250 c.Assert(err, ErrorMatches, `service with name "pressword" not found`) |
259 } | 251 } |
260 | 252 |
261 func (s StateSuite) TestAllServices(c *C) { | 253 func (s StateSuite) TestAllServices(c *C) { |
262 // Check without existing services. | |
263 services, err := s.st.AllServices() | 254 services, err := s.st.AllServices() |
264 c.Assert(err, IsNil) | 255 c.Assert(err, IsNil) |
265 c.Assert(len(services), Equals, 0) | 256 c.Assert(len(services), Equals, 0) |
266 | 257 |
267 // Check that after adding services the result is ok. | 258 // Check that after adding services the result is ok. |
268 dummy, _ := addDummyCharm(c, s.st) | 259 dummy, _ := addDummyCharm(c, s.st) |
269 _, err = s.st.AddService("wordpress", dummy) | 260 _, err = s.st.AddService("wordpress", dummy) |
270 c.Assert(err, IsNil) | 261 c.Assert(err, IsNil) |
271 services, err = s.st.AllServices() | 262 services, err = s.st.AllServices() |
272 c.Assert(err, IsNil) | 263 c.Assert(err, IsNil) |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 err = mysqlUnit.AssignToMachine(mysqlMachine) | 680 err = mysqlUnit.AssignToMachine(mysqlMachine) |
690 c.Assert(err, IsNil) | 681 c.Assert(err, IsNil) |
691 | 682 |
692 wordpressService, err := s.st.AddService("wordpress", dummy) | 683 wordpressService, err := s.st.AddService("wordpress", dummy) |
693 c.Assert(err, IsNil) | 684 c.Assert(err, IsNil) |
694 wordpressUnit, err := wordpressService.AddUnit() | 685 wordpressUnit, err := wordpressService.AddUnit() |
695 c.Assert(err, IsNil) | 686 c.Assert(err, IsNil) |
696 | 687 |
697 _, err = wordpressUnit.AssignToUnusedMachine() | 688 _, err = wordpressUnit.AssignToUnusedMachine() |
698 c.Assert(err, ErrorMatches, "no unused machine found") | 689 c.Assert(err, ErrorMatches, "no unused machine found") |
| 690 } |
| 691 |
| 692 func (s StateSuite) TestGetSetClearUnitUpgrate(c *C) { |
| 693 // Check that setting and clearing an upgrade flag on a unit works. |
| 694 dummy, _ := addDummyCharm(c, s.st) |
| 695 wordpress, err := s.st.AddService("wordpress", dummy) |
| 696 c.Assert(err, IsNil) |
| 697 unit, err := wordpress.AddUnit() |
| 698 c.Assert(err, IsNil) |
| 699 |
| 700 // Defaults to false. |
| 701 upgrade, err := unit.NeedsUpgrade() |
| 702 c.Assert(err, IsNil) |
| 703 c.Assert(upgrade, Equals, false) |
| 704 |
| 705 // Can be set. |
| 706 err = unit.SetNeedsUpgrade() |
| 707 c.Assert(err, IsNil) |
| 708 upgrade, err = unit.NeedsUpgrade() |
| 709 c.Assert(err, IsNil) |
| 710 c.Assert(upgrade, Equals, true) |
| 711 |
| 712 // Can be set multiple times. |
| 713 err = unit.SetNeedsUpgrade() |
| 714 c.Assert(err, IsNil) |
| 715 upgrade, err = unit.NeedsUpgrade() |
| 716 c.Assert(err, IsNil) |
| 717 c.Assert(upgrade, Equals, true) |
| 718 |
| 719 // Can be cleared. |
| 720 err = unit.ClearNeedsUpgrade() |
| 721 c.Assert(err, IsNil) |
| 722 upgrade, err = unit.NeedsUpgrade() |
| 723 c.Assert(err, IsNil) |
| 724 c.Assert(upgrade, Equals, false) |
| 725 |
| 726 // Can be cleared multiple times |
| 727 err = unit.ClearNeedsUpgrade() |
| 728 c.Assert(err, IsNil) |
| 729 upgrade, err = unit.NeedsUpgrade() |
| 730 c.Assert(err, IsNil) |
| 731 c.Assert(upgrade, Equals, false) |
| 732 } |
| 733 |
| 734 func (s StateSuite) TestGetSetClearResolved(c *C) { |
| 735 // Check that setting and clearing the resolved setting on a unit works. |
| 736 dummy, _ := addDummyCharm(c, s.st) |
| 737 wordpress, err := s.st.AddService("wordpress", dummy) |
| 738 c.Assert(err, IsNil) |
| 739 unit, err := wordpress.AddUnit() |
| 740 c.Assert(err, IsNil) |
| 741 |
| 742 setting, err := unit.Resolved() |
| 743 c.Assert(err, IsNil) |
| 744 c.Assert(setting, Equals, state.ResolvedNone) |
| 745 |
| 746 err = unit.SetResolved(state.ResolvedNoHooks) |
| 747 c.Assert(err, IsNil) |
| 748 err = unit.SetResolved(state.ResolvedNoHooks) |
| 749 c.Assert(err, ErrorMatches, `unit "wordpress/0" resolved flag already se
t`) |
| 750 retry, err := unit.Resolved() |
| 751 c.Assert(err, IsNil) |
| 752 c.Assert(retry, Equals, state.ResolvedNoHooks) |
| 753 |
| 754 err = unit.ClearResolved() |
| 755 c.Assert(err, IsNil) |
| 756 setting, err = unit.Resolved() |
| 757 c.Assert(err, IsNil) |
| 758 c.Assert(setting, Equals, state.ResolvedNone) |
| 759 err = unit.ClearResolved() |
| 760 c.Assert(err, IsNil) |
| 761 |
| 762 err = unit.SetResolved(state.ResolvedMode(999)) |
| 763 c.Assert(err, ErrorMatches, `invalid error resolution mode: 999`) |
| 764 } |
| 765 |
| 766 func (s StateSuite) TestGetOpenPorts(c *C) { |
| 767 // Check that changes to the open ports of units work porperly. |
| 768 dummy, _ := addDummyCharm(c, s.st) |
| 769 wordpress, err := s.st.AddService("wordpress", dummy) |
| 770 c.Assert(err, IsNil) |
| 771 unit, err := wordpress.AddUnit() |
| 772 c.Assert(err, IsNil) |
| 773 |
| 774 // Verify no open ports before activity. |
| 775 open, err := unit.OpenPorts() |
| 776 c.Assert(err, IsNil) |
| 777 c.Assert(open, HasLen, 0) |
| 778 |
| 779 // Now open and close port. |
| 780 err = unit.OpenPort("tcp", 80) |
| 781 c.Assert(err, IsNil) |
| 782 open, err = unit.OpenPorts() |
| 783 c.Assert(err, IsNil) |
| 784 c.Assert(open, DeepEquals, []state.Port{ |
| 785 {"tcp", 80}, |
| 786 }) |
| 787 |
| 788 err = unit.OpenPort("udp", 53) |
| 789 c.Assert(err, IsNil) |
| 790 open, err = unit.OpenPorts() |
| 791 c.Assert(err, IsNil) |
| 792 c.Assert(open, DeepEquals, []state.Port{ |
| 793 {"tcp", 80}, |
| 794 {"udp", 53}, |
| 795 }) |
| 796 |
| 797 err = unit.OpenPort("tcp", 53) |
| 798 c.Assert(err, IsNil) |
| 799 open, err = unit.OpenPorts() |
| 800 c.Assert(err, IsNil) |
| 801 c.Assert(open, DeepEquals, []state.Port{ |
| 802 {"tcp", 80}, |
| 803 {"udp", 53}, |
| 804 {"tcp", 53}, |
| 805 }) |
| 806 |
| 807 err = unit.OpenPort("tcp", 443) |
| 808 c.Assert(err, IsNil) |
| 809 open, err = unit.OpenPorts() |
| 810 c.Assert(err, IsNil) |
| 811 c.Assert(open, DeepEquals, []state.Port{ |
| 812 {"tcp", 80}, |
| 813 {"udp", 53}, |
| 814 {"tcp", 53}, |
| 815 {"tcp", 443}, |
| 816 }) |
| 817 |
| 818 err = unit.ClosePort("tcp", 80) |
| 819 c.Assert(err, IsNil) |
| 820 open, err = unit.OpenPorts() |
| 821 c.Assert(err, IsNil) |
| 822 c.Assert(open, DeepEquals, []state.Port{ |
| 823 {"udp", 53}, |
| 824 {"tcp", 53}, |
| 825 {"tcp", 443}, |
| 826 }) |
699 } | 827 } |
700 | 828 |
701 // zkRemoveTree recursively removes a tree. | 829 // zkRemoveTree recursively removes a tree. |
702 func zkRemoveTree(zk *zookeeper.Conn, path string) error { | 830 func zkRemoveTree(zk *zookeeper.Conn, path string) error { |
703 // First recursively delete the children. | 831 // First recursively delete the children. |
704 children, _, err := zk.Children(path) | 832 children, _, err := zk.Children(path) |
705 if err != nil { | 833 if err != nil { |
706 return err | 834 return err |
707 } | 835 } |
708 for _, child := range children { | 836 for _, child := range children { |
709 if err = zkRemoveTree(zk, fmt.Sprintf("%s/%s", path, child)); er
r != nil { | 837 if err = zkRemoveTree(zk, fmt.Sprintf("%s/%s", path, child)); er
r != nil { |
710 return err | 838 return err |
711 } | 839 } |
712 } | 840 } |
713 // Now delete the path itself. | 841 // Now delete the path itself. |
714 return zk.Delete(path, -1) | 842 return zk.Delete(path, -1) |
715 } | 843 } |
LEFT | RIGHT |