/* * Copyright (c) 2016 Cisco Systems. 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.groupbasedpolicy.renderer.vpp.commands; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General; import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.StaticRoutes1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.StaticRoutes1Builder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4Builder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.Route; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.Static; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocol; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol.StaticRoutesBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.RoutingProtocolVppAttr; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.RoutingProtocolVppAttrBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.VniReference; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.routing.routing.instance.routing.protocols.routing.protocol.VppProtocolAttributesBuilder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; public class RoutingCommand extends AbstractConfigCommand { private static final Logger LOG = LoggerFactory.getLogger(RoutingCommand.class); public static String ROUTER_INSTANCE_NAME = "vpp-routing-instance"; public static String DEFAULT_ROUTING_PROTOCOL = "learned-protocol-0"; private List<Route> routes; private String routerProtocol; private Long vrfId; private RoutingCommand(RoutingCommandBuilder builder) { operation = builder.getOperation(); routerProtocol = builder.getRouterProtocol(); vrfId = builder.getVrfId(); routes = builder.getRoutes(); } public static RoutingCommandBuilder builder() { return new RoutingCommandBuilder(); } List<Route> getRoutes() { return routes; } String getRouterProtocol() { return routerProtocol; } Long getVrfId() { return vrfId; } @Override public InstanceIdentifier getIid() { String routerProtocol = this.routerProtocol; if (Strings.isNullOrEmpty(routerProtocol)) { routerProtocol = DEFAULT_ROUTING_PROTOCOL; } return VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routerProtocol)); } void put(ReadWriteTransaction rwTx) { InstanceIdentifier<RoutingProtocol> routingInstanceIid = VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routerProtocol)); rwTx.put(LogicalDatastoreType.CONFIGURATION, routingInstanceIid, getRoutingProtocolBuilder().build(), true); } void merge(ReadWriteTransaction rwTx) { rwTx.merge(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routerProtocol)), getRoutingProtocolBuilder().build(), true); } void delete(ReadWriteTransaction rwTx) { try { rwTx.delete(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey( routerProtocol))); } catch (IllegalStateException ex) { LOG.debug("Routing protocol not deleted from DS {}", this, ex); } } @Override public String toString() { return "RoutingCommand [routerProtocol=" + routerProtocol + ", routes=" + routes + ", operations=" + operation + "]"; } private RoutingProtocolBuilder getRoutingProtocolBuilder() { return new RoutingProtocolBuilder() .setEnabled(true) .setType(Static.class) .setName(routerProtocol) .addAugmentation(RoutingProtocolVppAttr.class, new RoutingProtocolVppAttrBuilder().setVppProtocolAttributes( new VppProtocolAttributesBuilder().setPrimaryVrf(new VniReference(vrfId)).build()).build()) .setStaticRoutes(new StaticRoutesBuilder().addAugmentation(StaticRoutes1.class, new StaticRoutes1Builder().setIpv4(new Ipv4Builder().setRoute(routes).build()).build()).build()); } public static class RoutingCommandBuilder { private General.Operations operation; private String routerProtocol; private Long vrfId; private List<Route> routes; public General.Operations getOperation() { return operation; } public RoutingCommandBuilder setOperation(General.Operations operation) { this.operation = operation; return this; } String getRouterProtocol() { return routerProtocol; } public RoutingCommandBuilder setRouterProtocol(String routerProtocol) { this.routerProtocol = routerProtocol; return this; } Long getVrfId() { return vrfId; } public RoutingCommandBuilder setVrfId(Long vrfId) { this.vrfId = vrfId; return this; } List<Route> getRoutes() { return routes; } public RoutingCommandBuilder setRoutes(List<Route> routes) { this.routes = routes; return this; } /** * RoutingCommand build method. * * @return RoutingCommand * @throws IllegalArgumentException if routerProtocol, operation or vrfId is null. */ public RoutingCommand build() { Preconditions.checkArgument(this.operation != null); Preconditions.checkArgument(this.routerProtocol != null); Preconditions.checkArgument(this.vrfId != null); return new RoutingCommand(this); } } }