/* * Copyright (c) 2014 Cisco Systems, Inc. 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.sxp.controller.util.io; import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import org.opendaylight.controller.config.yang.sxp.controller.conf.Connection; import org.opendaylight.controller.config.yang.sxp.controller.conf.ConnectionTimers; import org.opendaylight.controller.config.yang.sxp.controller.conf.Connections; import org.opendaylight.controller.config.yang.sxp.controller.conf.SxpController; import org.opendaylight.controller.config.yang.sxp.controller.conf.SxpNode; import org.opendaylight.controller.config.yang.sxp.controller.conf.Timers; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.sxp.controller.core.DatastoreAccess; import org.opendaylight.sxp.controller.listeners.NodeIdentityListener; import org.opendaylight.sxp.util.inet.NodeIdConv; import org.opendaylight.sxp.util.time.TimeConv; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBindingBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.peer.sequence.fields.PeerSequenceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomainsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpPeerGroupsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connection.fields.ConnectionTimersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.ConnectionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.connections.ConnectionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.databases.fields.MasterDatabase; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.databases.fields.MasterDatabaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.node.fields.SecurityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.node.identity.fields.TimersBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** * <pre> * ODL-Karaf @see http://localhost:8181/restconf/config/network-topology:network-topology/topology/sxp * </pre> */ public final class ConfigLoader implements AutoCloseable { private final DatastoreAccess datastoreAccess; public ConfigLoader(DatastoreAccess datastoreAccess) { this.datastoreAccess = Preconditions.checkNotNull(datastoreAccess); } /** * @param nodeName NodeId used for initialization * @param logicalDatastoreType Logical datastore type where topology will be initialized * @param datastoreAccess Datastore access used for initialization * @return If Topology was successfully initialized */ public static boolean initTopologyNode(final String nodeName, final LogicalDatastoreType logicalDatastoreType, final DatastoreAccess datastoreAccess) { InstanceIdentifier<Node> nodeIdentifier = NodeIdentityListener.SUBSCRIBED_PATH.child(Node.class, new NodeKey( new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId( nodeName))); return datastoreAccess.checkAndPut(nodeIdentifier, new NodeBuilder().setKey(new NodeKey( new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId( nodeName))).build(), logicalDatastoreType, false); } /** * @param configuration Configuration containing data about SxpNode that will be written into DataStore */ public void load(SxpController configuration) { if (configuration == null || configuration.getSxpNode() == null || configuration.getSxpNode().isEmpty()) { return; } configuration.getSxpNode().forEach(n -> { final String nodeId = NodeIdConv.toString(n.getNodeId()); if (initTopologyNode(nodeId, LogicalDatastoreType.CONFIGURATION, datastoreAccess)) { datastoreAccess.checkAndPut(NodeIdentityListener.SUBSCRIBED_PATH.child(Node.class, new NodeKey( new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId( nodeId))).augmentation(SxpNodeIdentity.class), parseNode(n), LogicalDatastoreType.CONFIGURATION, false); } }); } /** * @param node SxpNode containing data * @return SxpNodeIdentity containing provided data */ private SxpNodeIdentity parseNode(SxpNode node) { SxpNodeIdentityBuilder identityBuilder = new SxpNodeIdentityBuilder(); identityBuilder.setEnabled(node.getEnabled()); identityBuilder.setSourceIp(node.getSourceIp()); identityBuilder.setVersion(node.getVersion()); identityBuilder.setTcpPort(node.getTcpPort()); identityBuilder.setMappingExpanded(node.getMappingExpanded()); identityBuilder.setSecurity( new SecurityBuilder().setPassword(Preconditions.checkNotNull(node.getSecurity()).getPassword()) .build()); identityBuilder.setSxpPeerGroups(new SxpPeerGroupsBuilder().build()); identityBuilder.setDescription(node.getDescription()); List<SxpDomain> domains = new ArrayList<>(); SxpDomainBuilder domain = new SxpDomainBuilder(); domain.setDomainName(org.opendaylight.sxp.core.SxpNode.DEFAULT_DOMAIN); domain.setConnections(parseConnections(node.getConnections())); domain.setMasterDatabase(parseMasterDatabase(node.getMasterDatabase())); domains.add(domain.build()); identityBuilder.setSxpDomains(new SxpDomainsBuilder().setSxpDomain(domains).build()); identityBuilder.setTimers(parseNodeTimers(node.getTimers())); return identityBuilder.build(); } /** * @param connections Connections containing data * @return Connections wrapping data */ private org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.Connections parseConnections( Connections connections) { ConnectionsBuilder connectionsBuilder = new ConnectionsBuilder().setConnection(new ArrayList<>()); if (connections != null && connections.getConnection() != null) { connectionsBuilder.setConnection( connections.getConnection().stream().map(this::parseConnection).collect(Collectors.toList())); } return connectionsBuilder.build(); } /** * @param timers Timers containing timer data * @return Timers wrapping data */ private org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.node.identity.fields.Timers parseNodeTimers( Timers timers) { TimersBuilder timersBuilder = new TimersBuilder(); if (timers != null) { //Speaker timersBuilder.setHoldTimeMinAcceptable(timers.getHoldTimeMinAcceptable()); timersBuilder.setKeepAliveTime(timers.getKeepAliveTime()); //Listener timersBuilder.setHoldTime(timers.getHoldTime()); timersBuilder.setHoldTimeMax(timers.getHoldTimeMax()); timersBuilder.setHoldTimeMin(timers.getHoldTimeMin()); timersBuilder.setDeleteHoldDownTime(timers.getDeleteHoldDownTime()); timersBuilder.setReconciliationTime(timers.getDeleteHoldDownTime()); //Node timersBuilder.setRetryOpenTime(timers.getRetryOpenTime()); } return timersBuilder.build(); } /** * @param connections Connection containing data about peer * @return Connection data wrapper */ private org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.connections.Connection parseConnection( Connection connections) { ConnectionBuilder connectionBuilder = new ConnectionBuilder(); connectionBuilder.setPeerAddress(connections.getPeerAddress()); connectionBuilder.setTcpPort(connections.getTcpPort()); connectionBuilder.setMode(connections.getMode()); connectionBuilder.setPassword(connections.getPassword()); connectionBuilder.setDescription(connections.getDescription()); connectionBuilder.setVersion(connections.getVersion()); connectionBuilder.setConnectionTimers(parseConnectionTimers(connections.getConnectionTimers())); return connectionBuilder.build(); } /** * @param timers Timers containing data about connection timers * @return Timers data wrapper */ private org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connection.fields.ConnectionTimers parseConnectionTimers( ConnectionTimers timers) { ConnectionTimersBuilder timersBuilder = new ConnectionTimersBuilder(); //Speaker timersBuilder.setHoldTimeMinAcceptable(timers.getHoldTimeMinAcceptable()); timersBuilder.setKeepAliveTime(timers.getKeepAliveTime()); //Listener timersBuilder.setHoldTime(timers.getHoldTime()); timersBuilder.setHoldTimeMax(timers.getHoldTimeMax()); timersBuilder.setHoldTimeMin(timers.getHoldTimeMin()); timersBuilder.setDeleteHoldDownTime(timers.getDeleteHoldDownTime()); timersBuilder.setReconciliationTime(timers.getDeleteHoldDownTime()); return timersBuilder.build(); } /** * @param database MasterDatabase containing bindings * @return MasterDatabase data wrapper */ private MasterDatabase parseMasterDatabase( org.opendaylight.controller.config.yang.sxp.controller.conf.MasterDatabase database) { List<MasterDatabaseBinding> bindings = new ArrayList<>(); MasterDatabaseBuilder databaseBuilder = new MasterDatabaseBuilder(); databaseBuilder.setMasterDatabaseBinding(bindings); MasterDatabaseBindingBuilder bindingBuilder = new MasterDatabaseBindingBuilder(); bindingBuilder.setTimestamp(TimeConv.toDt(System.currentTimeMillis())); bindingBuilder.setPeerSequence(new PeerSequenceBuilder().setPeer(new ArrayList<>()).build()); if (database != null && database.getBinding() != null) { database.getBinding().stream().forEach(b -> { bindingBuilder.setSecurityGroupTag(b.getSgt()); b.getIpPrefix().stream().forEach(p -> bindings.add(bindingBuilder.setIpPrefix(p).build())); }); } return databaseBuilder.build(); } /** * @param database MasterDatabase containing bindings * @return MasterDatabase data wrapper */ public static MasterDatabase parseMasterDatabase( org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.configuration.MasterDatabase database) { List<MasterDatabaseBinding> bindings = new ArrayList<>(); MasterDatabaseBuilder databaseBuilder = new MasterDatabaseBuilder(); databaseBuilder.setMasterDatabaseBinding(bindings); MasterDatabaseBindingBuilder bindingBuilder = new MasterDatabaseBindingBuilder(); bindingBuilder.setTimestamp(TimeConv.toDt(System.currentTimeMillis())); bindingBuilder.setPeerSequence(new PeerSequenceBuilder().setPeer(new ArrayList<>()).build()); if (database != null && database.getBinding() != null) { database.getBinding().stream().forEach(b -> { bindingBuilder.setSecurityGroupTag(b.getSgt()); b.getIpPrefix().stream().forEach(p -> bindings.add(bindingBuilder.setIpPrefix(p).build())); }); } return databaseBuilder.build(); } /** * @param connections Connection containing data about peer * @return Connection data wrapper */ public static org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.Connections parseConnections( org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.Connections connections) { ConnectionsBuilder connectionsBuilder = new ConnectionsBuilder().setConnection(new ArrayList<>()); if (connections != null && connections.getConnection() != null) { connectionsBuilder.setConnection(connections.getConnection()); } return connectionsBuilder.build(); } @Override public void close() { datastoreAccess.close(); } }