blob: f8761bc7754c119027a0d64932de946e01db0099 [file] [log] [blame]
Jian Li171582e2020-12-21 01:44:05 +09001/*
2 * Copyright 2020-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.kubevirtnode.codec;
17
18import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.ObjectMapper;
20import com.fasterxml.jackson.databind.node.ObjectNode;
21import com.google.common.collect.ImmutableList;
22import org.hamcrest.MatcherAssert;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.packet.IpAddress;
26import org.onosproject.codec.CodecContext;
27import org.onosproject.codec.JsonCodec;
28import org.onosproject.codec.impl.CodecManager;
29import org.onosproject.core.CoreService;
30import org.onosproject.kubevirtnode.api.DefaultKubevirtNode;
31import org.onosproject.kubevirtnode.api.DefaultKubevirtPhyInterface;
32import org.onosproject.kubevirtnode.api.KubevirtNode;
33import org.onosproject.kubevirtnode.api.KubevirtNodeState;
34import org.onosproject.kubevirtnode.api.KubevirtPhyInterface;
35import org.onosproject.net.DeviceId;
36
37import java.io.IOException;
38import java.io.InputStream;
39import java.util.HashMap;
40import java.util.Map;
41
42import static org.easymock.EasyMock.createMock;
43import static org.easymock.EasyMock.expect;
44import static org.easymock.EasyMock.replay;
45import static org.hamcrest.MatcherAssert.assertThat;
46import static org.hamcrest.Matchers.is;
47import static org.hamcrest.Matchers.notNullValue;
48import static org.onosproject.kubevirtnode.codec.KubevirtNodeJsonMatcher.matchesKubevirtNode;
49import static org.onosproject.net.NetTestTools.APP_ID;
50
51/**
52 * Unit tests for KubevirtNode codec.
53 */
54public class KubevirtNodeCodecTest {
55 MockCodecContext context;
56
57 JsonCodec<KubevirtNode> kubevirtNodeCodec;
58 JsonCodec<KubevirtPhyInterface> kubevirtPhyInterfaceJsonCodec;
59
60 final CoreService mockCoreService = createMock(CoreService.class);
61 private static final String REST_APP_ID = "org.onosproject.rest";
62
63 @Before
64 public void setUp() {
65 context = new MockCodecContext();
66 kubevirtNodeCodec = new KubevirtNodeCodec();
67 kubevirtPhyInterfaceJsonCodec = new KubevirtPhyInterfaceCodec();
68
69 assertThat(kubevirtNodeCodec, notNullValue());
70 assertThat(kubevirtPhyInterfaceJsonCodec, notNullValue());
71
72 expect(mockCoreService.registerApplication(REST_APP_ID))
73 .andReturn(APP_ID).anyTimes();
74 replay(mockCoreService);
75 context.registerService(CoreService.class, mockCoreService);
76 }
77
78 /**
79 * Tests the kubevirt compute node encoding.
80 */
81 @Test
82 public void testKubevirtComputeNodeEncode() {
83 KubevirtPhyInterface phyIntf1 = DefaultKubevirtPhyInterface.builder()
84 .network("mgmtnetwork")
85 .intf("eth3")
86 .build();
87
88 KubevirtPhyInterface phyIntf2 = DefaultKubevirtPhyInterface.builder()
89 .network("oamnetwork")
90 .intf("eth4")
91 .build();
92
93 KubevirtNode node = DefaultKubevirtNode.builder()
94 .hostname("worker")
95 .type(KubevirtNode.Type.WORKER)
96 .state(KubevirtNodeState.INIT)
97 .managementIp(IpAddress.valueOf("10.10.10.1"))
98 .intgBridge(DeviceId.deviceId("br-int"))
99 .dataIp(IpAddress.valueOf("20.20.20.2"))
100 .phyIntfs(ImmutableList.of(phyIntf1, phyIntf2))
101 .build();
102
103 ObjectNode nodeJson = kubevirtNodeCodec.encode(node, context);
104 assertThat(nodeJson, matchesKubevirtNode(node));
105 }
106
107 /**
108 * Tests the kubevirt compute node decoding.
109 *
110 * @throws IOException io exception
111 */
112 @Test
113 public void testKubevirtComputeNodeDecode() throws IOException {
114 KubevirtNode node = getKubevirtNode("KubevirtWorkerNode.json");
115
116 assertThat(node.hostname(), is("worker-01"));
117 assertThat(node.type().name(), is("WORKER"));
118 assertThat(node.managementIp().toString(), is("172.16.130.4"));
119 assertThat(node.dataIp().toString(), is("172.16.130.4"));
120 assertThat(node.intgBridge().toString(), is("of:00000000000000a1"));
121 assertThat(node.phyIntfs().size(), is(2));
122
123 node.phyIntfs().forEach(intf -> {
124 if (intf.network().equals("mgmtnetwork")) {
125 assertThat(intf.intf(), is("eth3"));
126 }
127 if (intf.network().equals("oamnetwork")) {
128 assertThat(intf.intf(), is("eth4"));
129 }
130 });
131 }
132
133 private KubevirtNode getKubevirtNode(String resourceName) throws IOException {
134 InputStream jsonStream = KubevirtNodeCodecTest.class.getResourceAsStream(resourceName);
135 JsonNode json = context.mapper().readTree(jsonStream);
136 MatcherAssert.assertThat(json, notNullValue());
137 KubevirtNode node = kubevirtNodeCodec.decode((ObjectNode) json, context);
138 assertThat(node, notNullValue());
139 return node;
140 }
141
142 /**
143 * Mock codec context for use in codec unit tests.
144 */
145 private class MockCodecContext implements CodecContext {
146
147 private final ObjectMapper mapper = new ObjectMapper();
148 private final CodecManager manager = new CodecManager();
149 private final Map<Class<?>, Object> services = new HashMap<>();
150
151 /**
152 * Constructs a new mock codec context.
153 */
154 public MockCodecContext() {
155 manager.activate();
156 }
157
158 @Override
159 public ObjectMapper mapper() {
160 return mapper;
161 }
162
163 @SuppressWarnings("unchecked")
164 @Override
165 public <T> JsonCodec<T> codec(Class<T> entityClass) {
166 if (entityClass == KubevirtPhyInterface.class) {
167 return (JsonCodec<T>) kubevirtPhyInterfaceJsonCodec;
168 }
169
170 return manager.getCodec(entityClass);
171 }
172
173 @SuppressWarnings("unchecked")
174 @Override
175 public <T> T getService(Class<T> serviceClass) {
176 return (T) services.get(serviceClass);
177 }
178
179 // for registering mock services
180 public <T> void registerService(Class<T> serviceClass, T impl) {
181 services.put(serviceClass, impl);
182 }
183 }
184}