/* * Copyright © 2015 Yale University and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.alto.basic.impl; import com.google.common.base.Optional; import com.google.common.util.concurrent.CheckedFuture; import org.opendaylight.alto.basic.manual.maps.ManualMapsUtils; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.ConfigResponseData1Builder; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.Meta1Builder; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.config.context.ResourceCostMap; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.config.context.ResourceNetworkMap; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.query.input.request.config.request.config.request.message.config.resource.data.ConfigCostmapData; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.query.input.request.config.request.config.request.message.config.resource.data.ConfigNetworkmapData; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.query.output.response.config.response.config.response.message.config.response.data.ConfigCostmapResponseDataBuilder; import org.opendaylight.yang.gen.v1.urn.alto.manual.maps.rev151021.query.output.response.config.response.config.response.message.config.response.data.ConfigNetworkmapResponseDataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.AltoModelConfigService; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.QueryInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.QueryOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.QueryOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.ResourceTypeConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.alto.request.config.request.ConfigRequest; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.alto.response.config.response.ConfigResponseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.config.request.data.ConfigRequestMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.config.response.data.ConfigResponseMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.config.response.data.config.response.message.ConfigResponseData; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.config.rev151021.config.response.data.config.response.message.Meta; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.rev151021.alto.request.base.Request; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; import java.util.concurrent.Future; public class AltoModelConfigImpl implements AltoModelConfigService { private static final Logger LOG = LoggerFactory.getLogger(AltoModelConfigImpl.class); private DataBroker dataBroker = null; private static final String RESPONSE_ERROR_CODE_OK = "OK"; private static final String RESPONSE_ERROR_CODE_FAILED = "FAILED"; private static final List<String> CONFIG_RESOURCE_TYPES = Arrays.asList("networkmap", "costmap"); public AltoModelConfigImpl(DataBroker dataBroker) { this.dataBroker = dataBroker; } protected boolean validateConfigResourceType(String configResourceType) { return CONFIG_RESOURCE_TYPES.contains(configResourceType); } protected QueryOutput readResourceNetworkMap(String rid, final ReadTransaction rx) { InstanceIdentifier<ResourceNetworkMap> iid = ManualMapsUtils.getResourceNetworkMapIID(rid); CheckedFuture<Optional<ResourceNetworkMap>, ReadFailedException> future = rx.read(LogicalDatastoreType.OPERATIONAL, iid); Optional<ResourceNetworkMap> optional = Optional.absent(); QueryOutputBuilder outputBuilder = new QueryOutputBuilder(); outputBuilder.setType(ResourceTypeConfig.class); ConfigResponseBuilder crBuilder = new ConfigResponseBuilder(); ConfigResponseMessageBuilder crmBuilder = new ConfigResponseMessageBuilder(); ConfigResponseData1Builder crdBuilder = new ConfigResponseData1Builder(); ResourceNetworkMap result = null; String errorCode = RESPONSE_ERROR_CODE_FAILED; try { optional = future.checkedGet(); if (optional.isPresent()) { result = optional.get(); crdBuilder.setConfigNetworkmapResponseData(new ConfigNetworkmapResponseDataBuilder() .setResourceId(result.getResourceId()) .setTag(result.getTag()) .setMap(result.getMap()) .build()); errorCode = RESPONSE_ERROR_CODE_OK; } } catch (Exception e) { LOG.warn("Reading resource failed! ResourceId: " + rid); } crmBuilder .setMeta((Meta) new Meta1Builder().setConfigResponseErrorCode(errorCode).build()) .setConfigResponseData((ConfigResponseData) crdBuilder.build()); crBuilder.setConfigResponseMessage(crmBuilder.build()); outputBuilder.setResponse(crBuilder.build()); return outputBuilder.build(); } protected QueryOutput readResourceCostMap(String rid, final ReadTransaction rx) { InstanceIdentifier<ResourceCostMap> iid = ManualMapsUtils.getResourceCostMapIID(rid); CheckedFuture<Optional<ResourceCostMap>, ReadFailedException> future = rx.read(LogicalDatastoreType.OPERATIONAL, iid); Optional<ResourceCostMap> optional = Optional.absent(); QueryOutputBuilder outputBuilder = new QueryOutputBuilder(); outputBuilder.setType(ResourceTypeConfig.class); ConfigResponseBuilder crBuilder = new ConfigResponseBuilder(); ConfigResponseMessageBuilder crmBuilder = new ConfigResponseMessageBuilder(); ConfigResponseData1Builder crdBuilder = new ConfigResponseData1Builder(); ResourceCostMap result = null; String errorCode = RESPONSE_ERROR_CODE_FAILED; try { optional = future.checkedGet(); if (optional.isPresent()) { result = optional.get(); crdBuilder.setConfigCostmapResponseData(new ConfigCostmapResponseDataBuilder() .setResourceId(result.getResourceId()) .setTag(result.getTag()) .setMeta(result.getMeta()) .setMap(result.getMap()) .build()); errorCode = RESPONSE_ERROR_CODE_OK; } } catch (Exception e) { LOG.warn("Reading resource failed! ResourceId: " + rid); } crmBuilder .setMeta((Meta) new Meta1Builder().setConfigResponseErrorCode(errorCode).build()) .setConfigResponseData((ConfigResponseData) crdBuilder.build()); crBuilder.setConfigResponseMessage(crmBuilder.build()); outputBuilder.setResponse(crBuilder.build()); return outputBuilder.build(); } @Override public Future<RpcResult<QueryOutput>> query(QueryInput input) { if (!(input.getType().equals(ResourceTypeConfig.class))) { LOG.warn("Unsupported Request!"); return RpcResultBuilder.<QueryOutput>failed().buildFuture(); } Request _request = input.getRequest(); if (!(_request instanceof ConfigRequest)) { LOG.warn("Request is inconsistent with input"); return RpcResultBuilder.<QueryOutput>failed().buildFuture(); } ConfigRequest request = (ConfigRequest) _request; ConfigRequestMessage requestMessage = request.getConfigRequestMessage(); String resourceId = requestMessage.getConfigResourceId(); if (!validateConfigResourceType(requestMessage.getConfigResourceType())) { LOG.warn("Unsupported ResourceType in Request!"); return RpcResultBuilder.<QueryOutput>failed().buildFuture(); } final ReadWriteTransaction rwx = dataBroker.newReadWriteTransaction(); QueryOutput output = null; if (requestMessage.getConfigType() == ConfigRequestMessage.ConfigType.Get) { if (requestMessage.getConfigResourceType() == "networkmap") { output = readResourceNetworkMap(resourceId, rwx); } else if (requestMessage.getConfigResourceType() == "costmap") { rwx.read(LogicalDatastoreType.CONFIGURATION, ManualMapsUtils.getResourceCostMapIID(resourceId)); } } else if (requestMessage.getConfigType() == ConfigRequestMessage.ConfigType.Delete) { if (requestMessage.getConfigResourceType() == "networkmap") { ManualMapsUtils.deleteResourceNetworkMap(resourceId, rwx); } else if (requestMessage.getConfigResourceType() == "costmap") { ManualMapsUtils.deleteResourceCostMap(resourceId, rwx); } } else if (requestMessage.getConfigType() == ConfigRequestMessage.ConfigType.Create) { if (requestMessage.getConfigResourceType() == "networkmap") { ConfigNetworkmapData networkmapData = (ConfigNetworkmapData) requestMessage.getConfigResourceData(); ManualMapsUtils.createResourceNetworkMap(resourceId, networkmapData.getMap(), rwx); } else if (requestMessage.getConfigResourceType() == "costmap") { ConfigCostmapData costmapData = (ConfigCostmapData) requestMessage.getConfigResourceData(); ManualMapsUtils.createResourceCostMap(resourceId, costmapData.getMeta(), costmapData.getMap(), rwx); } } rwx.submit(); return null; } }