blob: 667ca4be8ff315f60a549bab4c6b55fcdd47566b [file] [log] [blame]
Jian Lifc0b8902021-01-12 16:34:49 +09001/*
2 * Copyright 2021-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.kubevirtnetworking.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.ImmutableSet;
22import org.hamcrest.MatcherAssert;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.packet.IpAddress;
26import org.onlab.packet.IpPrefix;
27import org.onosproject.codec.CodecContext;
28import org.onosproject.codec.JsonCodec;
29import org.onosproject.codec.impl.CodecManager;
30import org.onosproject.core.CoreService;
31import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
32import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
33import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
34import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
35
36import java.io.IOException;
37import java.io.InputStream;
38import java.util.HashMap;
39import java.util.Map;
40
41import static org.easymock.EasyMock.createMock;
42import static org.easymock.EasyMock.expect;
43import static org.easymock.EasyMock.replay;
44import static org.hamcrest.MatcherAssert.assertThat;
45import static org.hamcrest.Matchers.is;
46import static org.hamcrest.Matchers.notNullValue;
47import static org.onosproject.kubevirtnetworking.codec.KubevirtNetworkJsonMatcher.matchesKubevirtNetwork;
48import static org.onosproject.net.NetTestTools.APP_ID;
49
50/**
51 * Unit tests for KubevirtNetwork codec.
52 */
53public final class KubevirtNetworkCodecTest {
54
55 MockCodecContext context;
56
57 JsonCodec<KubevirtNetwork> kubevirtNetworkCodec;
58 JsonCodec<KubevirtHostRoute> kubevirtHostRouteCodec;
59 JsonCodec<KubevirtIpPool> kubevirtIpPoolCodec;
60
61 final CoreService mockCoreService = createMock(CoreService.class);
62 private static final String REST_APP_ID = "org.onosproject.rest";
63
64 @Before
65 public void setUp() {
66 context = new MockCodecContext();
67 kubevirtNetworkCodec = new KubevirtNetworkCodec();
68 kubevirtHostRouteCodec = new KubevirtHostRouteCodec();
69 kubevirtIpPoolCodec = new KubevirtIpPoolCodec();
70
71 assertThat(kubevirtNetworkCodec, notNullValue());
72 assertThat(kubevirtHostRouteCodec, notNullValue());
73 assertThat(kubevirtIpPoolCodec, notNullValue());
74
75 expect(mockCoreService.registerApplication(REST_APP_ID))
76 .andReturn(APP_ID).anyTimes();
77 replay(mockCoreService);
78 context.registerService(CoreService.class, mockCoreService);
79 }
80
81 /**
82 * Tests the kubevirt network encoding.
83 */
84 @Test
85 public void testKubevirtNetworkEncode() {
86 KubevirtHostRoute hostRoute1 = new KubevirtHostRoute(IpPrefix.valueOf("10.10.10.0/24"),
87 IpAddress.valueOf("20.20.20.1"));
88 KubevirtHostRoute hostRoute2 = new KubevirtHostRoute(IpPrefix.valueOf("20.20.20.0/24"),
89 IpAddress.valueOf("10.10.10.1"));
90
91 KubevirtIpPool ipPool = new KubevirtIpPool(IpAddress.valueOf("10.10.10.100"),
92 IpAddress.valueOf("10.10.10.200"));
93
94 KubevirtNetwork network = DefaultKubevirtNetwork.builder()
95 .networkId("net-1")
96 .name("net-1")
97 .type(KubevirtNetwork.Type.FLAT)
98 .gatewayIp(IpAddress.valueOf("10.10.10.1"))
Jian Lie2abe812021-08-12 18:03:30 +090099 .defaultRoute(true)
Jian Lifc0b8902021-01-12 16:34:49 +0900100 .mtu(1500)
101 .cidr("10.10.10.0/24")
102 .hostRoutes(ImmutableSet.of(hostRoute1, hostRoute2))
103 .ipPool(ipPool)
Jian Li4c35a262021-02-01 20:36:45 +0900104 .dnses(ImmutableSet.of(IpAddress.valueOf("8.8.8.8")))
Jian Lifc0b8902021-01-12 16:34:49 +0900105 .build();
106
107 ObjectNode networkJson = kubevirtNetworkCodec.encode(network, context);
108 assertThat(networkJson, matchesKubevirtNetwork(network));
109 }
110
111 /**
112 * Tests the kubevirt network decoding.
113 *
114 * @throws IOException io exception
115 */
116 @Test
117 public void testKubevirtNetworkDecode() throws IOException {
118 KubevirtNetwork network = getKubevirtNetwork("KubevirtNetwork.json");
119
120 assertThat(network.networkId(), is("network-1"));
121 assertThat(network.name(), is("network-1"));
122 assertThat(network.type().name(), is("FLAT"));
123 assertThat(network.cidr(), is("10.10.0.0/24"));
124 assertThat(network.gatewayIp().toString(), is("10.10.0.1"));
Jian Lie2abe812021-08-12 18:03:30 +0900125 assertThat(network.defaultRoute(), is(true));
Jian Lifc0b8902021-01-12 16:34:49 +0900126 assertThat(network.ipPool().start().toString(), is("10.10.10.100"));
127 assertThat(network.ipPool().end().toString(), is("10.10.10.200"));
Jian Li4c35a262021-02-01 20:36:45 +0900128 assertThat(network.dnses().size(), is(1));
129 KubevirtHostRoute route = network.hostRoutes().stream().findFirst().orElse(null);
130 assertThat(route, is(new KubevirtHostRoute(IpPrefix.valueOf("10.10.10.0/24"),
131 IpAddress.valueOf("10.10.10.1"))));
Jian Lifc0b8902021-01-12 16:34:49 +0900132 }
133
134 private KubevirtNetwork getKubevirtNetwork(String resourceName) throws IOException {
135 InputStream jsonStream = KubevirtNetworkCodecTest.class.getResourceAsStream(resourceName);
136 JsonNode json = context.mapper().readTree(jsonStream);
137 MatcherAssert.assertThat(json, notNullValue());
138 KubevirtNetwork network = kubevirtNetworkCodec.decode((ObjectNode) json, context);
139 assertThat(network, notNullValue());
140 return network;
141 }
142
143 private class MockCodecContext implements CodecContext {
144
145 private final ObjectMapper mapper = new ObjectMapper();
146 private final CodecManager manager = new CodecManager();
147 private final Map<Class<?>, Object> services = new HashMap<>();
148
149 /**
150 * Constructs a new mock codec context.
151 */
152 public MockCodecContext() {
153 manager.activate();
154 }
155
156 @Override
157 public ObjectMapper mapper() {
158 return mapper;
159 }
160
161 @Override
162 public <T> JsonCodec<T> codec(Class<T> entityClass) {
163 if (entityClass == KubevirtHostRoute.class) {
164 return (JsonCodec<T>) kubevirtHostRouteCodec;
165 }
166
167 if (entityClass == KubevirtIpPool.class) {
168 return (JsonCodec<T>) kubevirtIpPoolCodec;
169 }
170
171 return manager.getCodec(entityClass);
172 }
173
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}