2 * Copyright © 2015 Yale University and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.alto.core.impl.endpointcost.test;
10 import java.math.BigDecimal;
11 import java.util.Arrays;
12 import java.util.LinkedList;
13 import java.util.List;
14 import java.util.concurrent.ExecutionException;
15 import java.util.concurrent.Future;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
19 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
21 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
25 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration;
26 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
27 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
29 import org.opendaylight.alto.core.resourcepool.ResourcepoolUtils;
30 import org.opendaylight.alto.core.resourcepool.ResourcepoolUtils.ContextTagListener;
31 import org.opendaylight.alto.core.service.model.endpointcost.EndpointcostUtils;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.CostMetric;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.ResourceId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.CostTypeData;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.resourcepool.rev150921.context.Resource;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.resourcepool.rev150921.context.resource.CapabilitiesBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.AltoModelEndpointcostService;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.CapabilitiesCostType;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.CapabilitiesCostTypeBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryOutputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.ResourceTypeEndpointcost;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.alto.request.endpointcost.request.EndpointcostRequest;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.alto.response.endpointcost.response.EndpointcostResponseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.endpointcost.request.data.EndpointcostParams;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.Ipv4AddressData;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.Ipv6AddressData;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.TypedAddressData;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.EndpointFilter;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.EndpointCostMapBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.EndpointCost;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.EndpointCostBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.Cost;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.DestinationBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.SourceBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.input.request.endpointcost.request.endpointcost.params.filter.EndpointFilterData;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.EndpointCostmapDataBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.cost.NumericalBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.cost.OrdinalBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.typed.address.data.Address;
66 import org.opendaylight.yangtools.concepts.ListenerRegistration;
67 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
68 import org.opendaylight.yangtools.yang.common.RpcResult;
69 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
71 import org.slf4j.Logger;
72 import org.slf4j.LoggerFactory;
74 public class AltoEndpointCostProvider implements BindingAwareProvider, AutoCloseable, AltoModelEndpointcostService {
76 private static final Logger LOG = LoggerFactory.getLogger(AltoEndpointCostProvider.class);
78 private DataBroker m_dataBroker = null;
79 private RoutedRpcRegistration<AltoModelEndpointcostService> m_serviceReg = null;
80 private ListenerRegistration<DataChangeListener> m_listener = null;
82 private static final String TEST_ENDPOINTCOST_NAME = "test-model-endpointcost";
83 private static final ResourceId TEST_ENDPOINTCOST_RID = new ResourceId(TEST_ENDPOINTCOST_NAME);
84 private static final CostMetric COST_METRIC_ROUTINGCOST = new CostMetric("routingcost");
85 private static final String COST_MODE_ORDINAL = "ordinal";
86 private InstanceIdentifier<Resource> m_testIID = null;
88 protected void createContextTag()
89 throws InterruptedException, ExecutionException, TransactionCommitFailedException {
90 WriteTransaction wx = m_dataBroker.newWriteOnlyTransaction();
92 CapabilitiesCostTypeBuilder cctBuilder = new CapabilitiesCostTypeBuilder();
93 cctBuilder.setCostType(Arrays.asList(
94 EndpointcostUtils.createCostTypeCapability(COST_METRIC_ROUTINGCOST,
97 CapabilitiesBuilder builder = new CapabilitiesBuilder();
98 builder.addAugmentation(CapabilitiesCostType.class, cctBuilder.build());
100 ResourcepoolUtils.createResourceWithCapabilities(ResourcepoolUtils.DEFAULT_CONTEXT,
101 TEST_ENDPOINTCOST_NAME,
102 ResourceTypeEndpointcost.class,
103 builder.build(), wx);
105 ResourcepoolUtils.lazyUpdateResource(ResourcepoolUtils.DEFAULT_CONTEXT,
106 TEST_ENDPOINTCOST_NAME, wx);
111 protected void removeContextTag()
112 throws InterruptedException, ExecutionException, TransactionCommitFailedException {
113 WriteTransaction wx = m_dataBroker.newWriteOnlyTransaction();
115 ResourcepoolUtils.deleteResource(ResourcepoolUtils.DEFAULT_CONTEXT,
116 TEST_ENDPOINTCOST_NAME, wx);
121 protected void setupListener() {
122 ContextTagListener listener = new ContextTagListener(m_testIID, m_serviceReg);
123 m_listener = m_dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
124 m_testIID,listener, DataChangeScope.SUBTREE);
126 assert m_listener != null;
130 public void onSessionInitiated(ProviderContext session) {
131 LOG.info("AltoModelEndpointCostProvider Session Initiated");
133 m_dataBroker = session.getSALService(DataBroker.class);
134 m_testIID = ResourcepoolUtils.getResourceIID(ResourcepoolUtils.DEFAULT_CONTEXT,
135 TEST_ENDPOINTCOST_NAME);
136 m_serviceReg = session.addRoutedRpcImplementation(AltoModelEndpointcostService.class, this);
141 } catch (Exception e) {
146 public void close() throws Exception {
147 LOG.info("AltoModelBaseProvider Closed");
149 if (m_serviceReg != null) {
150 m_serviceReg.close();
155 } catch (Exception e) {
159 protected Cost createNumericalCost(double cost) {
160 NumericalBuilder builder;
161 builder = new NumericalBuilder();
163 builder.setCost(new BigDecimal(cost));
164 return builder.build();
167 protected Cost createOrdinalCost(int order) {
168 OrdinalBuilder builder;
169 builder = new OrdinalBuilder();
171 builder.setCost(order);
172 return builder.build();
175 protected Address createSourceAddress(Address from) {
176 if (from instanceof Ipv4AddressData) {
177 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv4Builder builder;
178 builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv4Builder();
180 builder.fieldsFrom((Ipv4AddressData)from);
181 return builder.build();
182 } else if (from instanceof Ipv6AddressData) {
183 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv6Builder builder;
184 builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv6Builder();
186 builder.fieldsFrom((Ipv6AddressData)from);
187 return builder.build();
192 protected Address createDestinationAddress(Address from) {
193 if (from instanceof Ipv4AddressData) {
194 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv4Builder builder;
195 builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv4Builder();
197 builder.fieldsFrom((Ipv4AddressData)from);
198 return builder.build();
199 } else if (from instanceof Ipv6AddressData) {
200 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv6Builder builder;
201 builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv6Builder();
203 builder.fieldsFrom((Ipv6AddressData)from);
204 return builder.build();
210 public Future<RpcResult<QueryOutput>> query(QueryInput input) {
211 if (!input.getType().equals(ResourceTypeEndpointcost.class)) {
212 return RpcResultBuilder.<QueryOutput>failed().buildFuture();
214 EndpointcostRequest request = (EndpointcostRequest)input.getRequest();
215 EndpointcostParams params = request.getEndpointcostParams();
217 CostTypeData costType = params.getCostType();
218 if (!costType.getCostMode().equals(COST_MODE_ORDINAL)) {
219 LOG.warn(costType.getCostMode().toString());
220 return RpcResultBuilder.<QueryOutput>failed().buildFuture();
222 if (!costType.getCostMetric().equals(COST_METRIC_ROUTINGCOST)) {
223 LOG.warn(costType.getCostMetric().toString());
224 return RpcResultBuilder.<QueryOutput>failed().buildFuture();
227 if (!(params.getFilter() instanceof EndpointFilterData)) {
228 return RpcResultBuilder.<QueryOutput>failed().buildFuture();
231 EndpointFilter filter = ((EndpointFilterData)params.getFilter()).getEndpointFilter();
232 List<? extends TypedAddressData> source = filter.getSource();
233 List<? extends TypedAddressData> destination = filter.getDestination();
236 LinkedList<EndpointCost> ecList = new LinkedList<EndpointCost>();
237 for (TypedAddressData src: source) {
238 for (TypedAddressData dst: destination) {
239 SourceBuilder srcBuilder = new SourceBuilder();
240 srcBuilder.setAddress(createSourceAddress(src.getAddress()));
242 DestinationBuilder dstBuilder = new DestinationBuilder();
243 dstBuilder.setAddress(createDestinationAddress(dst.getAddress()));
246 EndpointCostBuilder ecBuilder = new EndpointCostBuilder();
247 ecBuilder.setSource(srcBuilder.build());
248 ecBuilder.setDestination(dstBuilder.build());
249 ecBuilder.setCost(createOrdinalCost(++order));
251 ecList.add(ecBuilder.build());
255 EndpointCostMapBuilder ecmBuilder = new EndpointCostMapBuilder();
256 ecmBuilder.setEndpointCost(ecList);
258 EndpointCostmapDataBuilder ecmdBuilder = new EndpointCostmapDataBuilder();
259 ecmdBuilder.setEndpointCostMap(ecmBuilder.build());
261 EndpointcostResponseBuilder ecrBuilder = new EndpointcostResponseBuilder();
262 ecrBuilder.setEndpointcostData(ecmdBuilder.build());
264 QueryOutputBuilder builder = new QueryOutputBuilder();
265 builder.setType(ResourceTypeEndpointcost.class).setResponse(ecrBuilder.build());
266 return RpcResultBuilder.<QueryOutput>success(builder.build()).buildFuture();