blob: 48337cdd24fcd8dc37bfc3e212804cdf253918ba [file] [log] [blame]
Jordan Halterman980a8c12017-09-22 18:01:19 -07001/*
2 * Copyright 2017-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.upgrade.impl;
17
18import java.util.Arrays;
19import java.util.List;
20import java.util.Set;
21import java.util.concurrent.atomic.AtomicInteger;
22import java.util.stream.Collectors;
23
24import org.junit.Test;
25import org.onlab.packet.IpAddress;
Jordan Halterman5ca07932017-10-07 13:28:22 -070026import org.onosproject.cluster.ClusterEvent;
Jordan Halterman980a8c12017-09-22 18:01:19 -070027import org.onosproject.cluster.UnifiedClusterServiceAdapter;
28import org.onosproject.cluster.ControllerNode;
29import org.onosproject.cluster.DefaultControllerNode;
30import org.onosproject.cluster.NodeId;
31import org.onosproject.core.Version;
32import org.onosproject.core.VersionServiceAdapter;
33import org.onosproject.store.service.AsyncAtomicValue;
34import org.onosproject.store.service.AsyncAtomicValueAdapter;
35import org.onosproject.store.service.AtomicValue;
36import org.onosproject.store.service.AtomicValueAdapter;
37import org.onosproject.store.service.AtomicValueBuilder;
38import org.onosproject.store.service.CoordinationServiceAdapter;
39import org.onosproject.upgrade.Upgrade;
40
41import static org.junit.Assert.assertEquals;
42import static org.junit.Assert.assertFalse;
43import static org.junit.Assert.assertTrue;
44import static org.junit.Assert.fail;
45
46/**
47 * Upgrade manager test.
48 */
49public class UpgradeManagerTest {
50
51 /**
52 * Creates a new upgrade manager to test.
53 *
54 * @param version the local node version
55 * @param state the initial upgrade state
56 * @param versions a list of controller node versions
57 * @return the activated upgrade manager
58 */
59 @SuppressWarnings("unchecked")
60 private UpgradeManager createUpgradeManager(Version version, Upgrade state, List<Version> versions) {
61 UpgradeManager upgradeManager = new UpgradeManager();
62 upgradeManager.clusterService = new UnifiedClusterServiceAdapter() {
63 @Override
64 public Set<ControllerNode> getNodes() {
65 AtomicInteger nodeCounter = new AtomicInteger();
66 return versions.stream()
67 .map(v -> {
68 int nodeId = nodeCounter.getAndIncrement();
69 return new DefaultControllerNode(
70 NodeId.nodeId(String.valueOf(nodeId)),
71 IpAddress.valueOf("127.0.0.1"),
72 nodeId);
73 })
74 .collect(Collectors.toSet());
75 }
76
77 @Override
Jordan Halterman5ca07932017-10-07 13:28:22 -070078 public ControllerNode getNode(NodeId nodeId) {
79 return getNodes()
80 .stream()
81 .filter(node -> node.id().equals(nodeId))
82 .findFirst()
83 .orElse(null);
84 }
85
86 @Override
Jordan Halterman980a8c12017-09-22 18:01:19 -070087 public ControllerNode.State getState(NodeId nodeId) {
88 return ControllerNode.State.READY;
89 }
90
91 @Override
92 public Version getVersion(NodeId nodeId) {
93 return versions.get(Integer.parseInt(nodeId.id()));
94 }
95 };
96
97 upgradeManager.versionService = new VersionServiceAdapter() {
98 @Override
99 public Version version() {
100 return version;
101 }
102 };
103
104 upgradeManager.coordinationService = new CoordinationServiceAdapter() {
105 @Override
106 public <V> AtomicValueBuilder<V> atomicValueBuilder() {
107 return new AtomicValueBuilder<V>() {
108 @Override
109 public AsyncAtomicValue<V> build() {
110 return new AsyncAtomicValueAdapter() {
111 @Override
112 public AtomicValue asAtomicValue() {
113 return new AtomicValueAdapter() {
114 private Object value = state;
115
116 @Override
117 public void set(Object value) {
118 this.value = value;
119 }
120
121 @Override
122 public Object get() {
123 return value;
124 }
125
126 @Override
127 public boolean compareAndSet(Object expect, Object update) {
128 if ((value == null && expect == null)
129 || (value != null && value.equals(expect))) {
130 value = update;
131 return true;
132 }
133 return false;
134 }
135 };
136 }
137 };
138 }
139 };
140 }
141 };
142
143 upgradeManager.activate();
144 return upgradeManager;
145 }
146
147 @Test
148 public void testFailedCommit() throws Exception {
149 UpgradeManager upgradeManager = createUpgradeManager(
150 Version.version("1.0.0"),
151 new Upgrade(Version.version("1.0.0"), Version.version("1.0.0"), Upgrade.Status.INACTIVE),
152 Arrays.asList(Version.version("1.0.0"), Version.version("1.0.0"), Version.version("1.0.1")));
153
154 assertEquals(Upgrade.Status.INACTIVE, upgradeManager.getState().status());
155 assertTrue(upgradeManager.isLocalActive());
156 assertFalse(upgradeManager.isLocalUpgraded());
157
158 upgradeManager.initialize();
159
160 assertEquals(Upgrade.Status.INITIALIZED, upgradeManager.getState().status());
161 assertEquals(Version.version("1.0.0"), upgradeManager.getState().source());
162 assertEquals(Version.version("1.0.0"), upgradeManager.getState().target());
163 assertEquals(Version.version("1.0.0"), upgradeManager.getVersion());
164 assertTrue(upgradeManager.isLocalActive());
165 assertFalse(upgradeManager.isLocalUpgraded());
166
167 upgradeManager.upgrade();
168 assertEquals(Upgrade.Status.UPGRADED, upgradeManager.getState().status());
169
170 try {
171 upgradeManager.commit();
172 fail();
173 } catch (IllegalStateException e) {
174 }
175 }
176
177 @Test
178 public void testSuccessfulCommit() throws Exception {
179 UpgradeManager upgradeManager = createUpgradeManager(
180 Version.version("1.0.1"),
181 new Upgrade(Version.version("1.0.0"), Version.version("1.0.1"), Upgrade.Status.UPGRADED),
182 Arrays.asList(Version.version("1.0.1"), Version.version("1.0.1"), Version.version("1.0.1")));
183
184 assertEquals(Upgrade.Status.UPGRADED, upgradeManager.getState().status());
185 assertTrue(upgradeManager.isLocalActive());
186 assertTrue(upgradeManager.isLocalUpgraded());
187
188 upgradeManager.commit();
189 assertEquals(Upgrade.Status.INACTIVE, upgradeManager.getState().status());
190 }
191
192 @Test
193 public void testFailedReset() throws Exception {
194 UpgradeManager upgradeManager = createUpgradeManager(
195 Version.version("1.0.0"),
196 new Upgrade(Version.version("1.0.0"), Version.version("1.0.1"), Upgrade.Status.INITIALIZED),
197 Arrays.asList(Version.version("1.0.0"), Version.version("1.0.0"), Version.version("1.0.1")));
198
199 assertEquals(Upgrade.Status.INITIALIZED, upgradeManager.getState().status());
200 assertEquals(Version.version("1.0.0"), upgradeManager.getState().source());
201 assertEquals(Version.version("1.0.1"), upgradeManager.getState().target());
202 assertEquals(Version.version("1.0.0"), upgradeManager.getVersion());
203 assertTrue(upgradeManager.isLocalActive());
204 assertFalse(upgradeManager.isLocalUpgraded());
205
206 upgradeManager.upgrade();
207 assertEquals(Upgrade.Status.UPGRADED, upgradeManager.getState().status());
208 assertEquals(Version.version("1.0.1"), upgradeManager.getVersion());
209
210 upgradeManager.rollback();
211 assertEquals(Upgrade.Status.ROLLED_BACK, upgradeManager.getState().status());
212
213 try {
214 upgradeManager.reset();
215 fail();
216 } catch (IllegalStateException e) {
217 }
218 }
219
220 @Test
221 public void testSuccessfulResetFromInitialized() throws Exception {
222 UpgradeManager upgradeManager = createUpgradeManager(
223 Version.version("1.0.0"),
224 new Upgrade(Version.version("1.0.0"), Version.version("1.0.0"), Upgrade.Status.INITIALIZED),
225 Arrays.asList(Version.version("1.0.0"), Version.version("1.0.0"), Version.version("1.0.0")));
226
227 assertEquals(Upgrade.Status.INITIALIZED, upgradeManager.getState().status());
228 assertTrue(upgradeManager.isLocalActive());
229 assertFalse(upgradeManager.isLocalUpgraded());
230
231 upgradeManager.reset();
232 assertEquals(Upgrade.Status.INACTIVE, upgradeManager.getState().status());
233 }
234
235 @Test
236 public void testSuccessfulResetFromRolledBack() throws Exception {
237 UpgradeManager upgradeManager = createUpgradeManager(
238 Version.version("1.0.0"),
239 new Upgrade(Version.version("1.0.0"), Version.version("1.0.1"), Upgrade.Status.ROLLED_BACK),
240 Arrays.asList(Version.version("1.0.0"), Version.version("1.0.0"), Version.version("1.0.0")));
241
242 assertEquals(Upgrade.Status.ROLLED_BACK, upgradeManager.getState().status());
243 assertTrue(upgradeManager.isLocalActive());
244 assertFalse(upgradeManager.isLocalUpgraded());
245
246 upgradeManager.reset();
247 assertEquals(Upgrade.Status.INACTIVE, upgradeManager.getState().status());
248 }
249
Jordan Halterman5ca07932017-10-07 13:28:22 -0700250 @Test
251 public void testCrashRollback() throws Exception {
252 UpgradeManager upgradeManager = createUpgradeManager(
253 Version.version("1.0.0"),
254 new Upgrade(Version.version("1.0.0"), Version.version("1.0.1"), Upgrade.Status.UPGRADED),
255 Arrays.asList(Version.version("1.0.0"), Version.version("1.0.0"), Version.version("1.0.1")));
256
257 assertFalse(upgradeManager.isLocalActive());
258
259 upgradeManager.handleClusterEvent(new ClusterEvent(
260 ClusterEvent.Type.INSTANCE_DEACTIVATED,
261 upgradeManager.clusterService.getNode(NodeId.nodeId("2"))));
262
263 assertEquals(Upgrade.Status.ROLLED_BACK, upgradeManager.getState().status());
264 assertTrue(upgradeManager.isLocalActive());
265 assertFalse(upgradeManager.isLocalUpgraded());
266 }
267
Jordan Halterman980a8c12017-09-22 18:01:19 -0700268}