diff options
Diffstat (limited to 'srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read')
11 files changed, 1003 insertions, 1 deletions
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6PolicyReaderFactory.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6PolicyReaderFactory.java new file mode 100644 index 000000000..79b18d235 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6PolicyReaderFactory.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Inject; +import com.google.inject.name.Named; +import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.hc2vpp.srv6.Srv6PolicyIIds; +import io.fd.hc2vpp.srv6.read.policy.NamedSegmentCustomizer; +import io.fd.hc2vpp.srv6.read.policy.PolicyCustomizer; +import io.fd.hc2vpp.srv6.read.steering.InterfaceCustomizer; +import io.fd.hc2vpp.srv6.read.steering.PrefixCustomizer; +import io.fd.hc2vpp.srv6.read.steering.PrefixesStateCustomizer; +import io.fd.hc2vpp.srv6.util.CandidatePathContextManager; +import io.fd.hc2vpp.srv6.util.LocatorContextManager; +import io.fd.hc2vpp.srv6.util.PolicyContextManager; +import io.fd.honeycomb.translate.impl.read.GenericListReader; +import io.fd.honeycomb.translate.impl.read.GenericReader; +import io.fd.honeycomb.translate.read.ReaderFactory; +import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.SegmentRoutingBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.autoroute.include.AutorouteIncludeBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.NamedSegmentListsBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.PoliciesBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.PrefixesBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.segment.routing.TrafficEngineeringBuilder; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.VppL2AutorouteIncludeAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.segment.routing.traffic.engineering.policies.policy.autoroute.include.InterfacesBuilder; + +public class Srv6PolicyReaderFactory implements ReaderFactory { + + @Inject + @Named("interface-context") + private NamingContext interfaceContext; + + @Inject + private FutureJVppCore vppApi; + + @Inject + private LocatorContextManager locatorContext; + + @Inject + private PolicyContextManager policyContext; + + @Inject + private CandidatePathContextManager candidateContext; + + @Override + public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { + registry.addStructuralReader(Srv6PolicyIIds.SR, SegmentRoutingBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE, TrafficEngineeringBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE_PLS, PoliciesBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE_PLS_POL_AI, AutorouteIncludeBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE_PLS_POL_AI_PFS, PrefixesBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE_PLS_POL_AI_IFCS, InterfacesBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE_PLS_POL_AI_IFAUG, + VppL2AutorouteIncludeAugmentationBuilder.class); + registry.addStructuralReader(Srv6PolicyIIds.SR_TE_NSLS, NamedSegmentListsBuilder.class); + + registry.subtreeAdd(ImmutableSet + .of(Srv6PolicyIIds.SR_POLICY_BSID, Srv6PolicyIIds.SR_POLICY_BSID_STATE, + Srv6PolicyIIds.SR_POLICY_VPP, Srv6PolicyIIds.SR_POLICY_VPP_SR, + Srv6PolicyIIds.SR_POLICY_VPP_SR_STATE, Srv6PolicyIIds.SR_POLICY_STATE, + Srv6PolicyIIds.SR_POLICY_CPS, Srv6PolicyIIds.SR_POLICY_CPS_CP, + Srv6PolicyIIds.SR_POLICY_CPS_CP_STATE, Srv6PolicyIIds.SR_POLICY_CPS_CP_BSID, + Srv6PolicyIIds.SR_POLICY_CPS_CP_BSID_STATE, Srv6PolicyIIds.SR_POLICY_CPS_CP_SLS, + Srv6PolicyIIds.SR_POLICY_CPS_CP_SLS_SL, Srv6PolicyIIds.SR_POLICY_CPS_CP_SLS_SL_CFG), + new GenericListReader<>(Srv6PolicyIIds.SR_TE_PLS_POL, + new PolicyCustomizer(vppApi, policyContext, candidateContext))); + registry.add( + new GenericReader<>(Srv6PolicyIIds.SR_TE_PLS_POL_AI_PFS_STATE, + new PrefixesStateCustomizer(vppApi))); + + registry.subtreeAdd(ImmutableSet.of(Srv6PolicyIIds.SR_TE_PLS_POL_AI_PFS_PF_STATE), + new GenericListReader<>(Srv6PolicyIIds.SR_TE_PLS_POL_AI_PFS_PF_IID, + new PrefixCustomizer(vppApi))); + registry.subtreeAdd(ImmutableSet.of(Srv6PolicyIIds.SR_TE_PLS_POL_AI_IFCS_IFC_STATE), + new GenericListReader<>(Srv6PolicyIIds.SR_TE_PLS_POL_AI_IFCS_IFC_IID, + new InterfaceCustomizer(vppApi, interfaceContext))); + + registry.subtreeAdd( + ImmutableSet.of(Srv6PolicyIIds.NSL_STATE, Srv6PolicyIIds.NSL_SGS, Srv6PolicyIIds.NSL_SGS_SG, + Srv6PolicyIIds.NSL_SGS_SG_STATE), + new GenericListReader<>(Srv6PolicyIIds.SR_TE_NSLS_NSL_IID, + new NamedSegmentCustomizer(vppApi, policyContext, candidateContext))); + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6ReaderFactory.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6ReaderFactory.java index 312280dce..41c33f98b 100644 --- a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6ReaderFactory.java +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/Srv6ReaderFactory.java @@ -43,7 +43,7 @@ public class Srv6ReaderFactory implements ReaderFactory { private LocalSidFunctionReadBindingRegistry bindingRegistry; @Inject - protected LocatorContextManager locatorContext; + private LocatorContextManager locatorContext; @Override public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/NamedSegmentCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/NamedSegmentCustomizer.java new file mode 100644 index 000000000..9f9c0e2ab --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/NamedSegmentCustomizer.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package io.fd.hc2vpp.srv6.read.policy; + +import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; +import io.fd.hc2vpp.srv6.read.policy.request.PolicyReadRequest; +import io.fd.hc2vpp.srv6.util.CandidatePathContextManager; +import io.fd.hc2vpp.srv6.util.PolicyContextManager; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.NamedSegmentListsBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.NamedSegmentList; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.NamedSegmentListBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.NamedSegmentListKey; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class NamedSegmentCustomizer extends FutureJVppCustomizer + implements ListReaderCustomizer<NamedSegmentList, NamedSegmentListKey, NamedSegmentListBuilder> { + private final PolicyContextManager policyContext; + private final CandidatePathContextManager candidateContext; + + public NamedSegmentCustomizer(@Nonnull final FutureJVppCore futureJVppCore, + final PolicyContextManager policyContext, + final CandidatePathContextManager candidateContext) { + super(futureJVppCore); + this.policyContext = policyContext; + this.candidateContext = candidateContext; + } + + @Nonnull + @Override + public List<NamedSegmentListKey> getAllIds(@Nonnull final InstanceIdentifier<NamedSegmentList> instanceIdentifier, + @Nonnull final ReadContext readContext) throws ReadFailedException { + PolicyReadRequest + policyReadRequest = new PolicyReadRequest(getFutureJVpp(), policyContext, candidateContext); + policyReadRequest.checkValid(); + return policyReadRequest.readNamedSegmentListKeys(instanceIdentifier, readContext); + } + + @Override + public void merge(@Nonnull final Builder<? extends DataObject> builder, + @Nonnull final List<NamedSegmentList> list) { + ((NamedSegmentListsBuilder) builder).setNamedSegmentList(list); + } + + @Nonnull + @Override + public NamedSegmentListBuilder getBuilder(@Nonnull final InstanceIdentifier<NamedSegmentList> instanceIdentifier) { + return new NamedSegmentListBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull final InstanceIdentifier<NamedSegmentList> instanceIdentifier, + @Nonnull final NamedSegmentListBuilder builder, + @Nonnull final ReadContext readContext) throws ReadFailedException { + PolicyReadRequest readRequest = new PolicyReadRequest(getFutureJVpp(), policyContext, candidateContext); + readRequest.readNamedSegmentList(instanceIdentifier, builder, readContext); + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/PolicyCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/PolicyCustomizer.java new file mode 100644 index 000000000..c4c323b52 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/PolicyCustomizer.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.policy; + +import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; +import io.fd.hc2vpp.srv6.read.policy.request.PolicyReadRequest; +import io.fd.hc2vpp.srv6.util.CandidatePathContextManager; +import io.fd.hc2vpp.srv6.util.PolicyContextManager; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.PoliciesBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.policies.Policy; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.policies.PolicyBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.policies.PolicyKey; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class PolicyCustomizer extends FutureJVppCustomizer + implements ListReaderCustomizer<Policy, PolicyKey, PolicyBuilder> { + + private final PolicyContextManager policyContext; + private final CandidatePathContextManager candidateContext; + + public PolicyCustomizer(@Nonnull final FutureJVppCore futureJVppCore, PolicyContextManager policyContext, + final CandidatePathContextManager candidateContext) { + super(futureJVppCore); + this.policyContext = policyContext; + this.candidateContext = candidateContext; + } + + @Nonnull + @Override + public List<PolicyKey> getAllIds(@Nonnull InstanceIdentifier<Policy> id, @Nonnull ReadContext context) + throws ReadFailedException { + PolicyReadRequest policyReadRequest = new PolicyReadRequest(getFutureJVpp(), policyContext, candidateContext); + return policyReadRequest.readAllKeys(id, context); + } + + @Override + public void merge(@Nonnull Builder<? extends DataObject> builder, @Nonnull List<Policy> readData) { + ((PoliciesBuilder) builder).setPolicy(readData); + } + + @Nonnull + @Override + public PolicyBuilder getBuilder(@Nonnull InstanceIdentifier<Policy> id) { + return new PolicyBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull InstanceIdentifier<Policy> id, @Nonnull PolicyBuilder builder, + @Nonnull ReadContext ctx) throws ReadFailedException { + PolicyReadRequest readRequest = new PolicyReadRequest(getFutureJVpp(), policyContext, candidateContext); + readRequest.readSpecific(id, ctx, builder); + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/request/PolicyReadRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/request/PolicyReadRequest.java new file mode 100644 index 000000000..8117d4d91 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/policy/request/PolicyReadRequest.java @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.policy.request; + +import com.google.common.base.Preconditions; +import io.fd.hc2vpp.srv6.read.ReadRequest; +import io.fd.hc2vpp.srv6.util.CandidatePathContextManager; +import io.fd.hc2vpp.srv6.util.JVppRequest; +import io.fd.hc2vpp.srv6.util.PolicyContextManager; +import io.fd.hc2vpp.srv6.util.Srv6Util; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; +import io.fd.vpp.jvpp.core.dto.SrPoliciesDetails; +import io.fd.vpp.jvpp.core.dto.SrPoliciesDetailsReplyDump; +import io.fd.vpp.jvpp.core.dto.SrPoliciesDump; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import io.fd.vpp.jvpp.core.types.Srv6Sid; +import io.fd.vpp.jvpp.core.types.Srv6SidList; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.BindingSidAllocMode; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.DataplaneType; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.PathExplicitlyDefined; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.PolicyAdminState; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.SegmentListOperState; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.SegmentType; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.SidValueType; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.binding.sid.properties.BindingSidBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.binding.sid.properties.binding.sid.StateBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.candidate.paths.CandidatePathsBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.candidate.paths.candidate.paths.CandidatePath; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.candidate.paths.candidate.paths.CandidatePathBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.NamedSegmentList; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.NamedSegmentListBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.NamedSegmentListKey; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.named.segment.list.SegmentsBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.named.segment.list.segments.Segment; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.named.segment.list.segments.SegmentBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.named.segment.lists.named.segment.lists.named.segment.list.segments.SegmentKey; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.path.segment.list.properties.SegmentListsBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.path.segment.list.properties.segment.lists.SegmentList; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.path.segment.list.properties.segment.lists.SegmentListBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.policies.Policy; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.policies.PolicyBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policies.policies.PolicyKey; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.SegmentRoutingPolicyBehavior; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.SegmentRoutingPolicyType; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.VppSrPolicyAugmentation; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.VppSrPolicyAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.segment.routing.traffic.engineering.policies.policy.VppSrPolicyBuilder; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.policy.context.rev180607.srv6.candidate.path.context.attributes.srv6.candidate.path.mappings.Srv6CandidatePathMapping; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.policy.context.rev180607.srv6.policy.context.attributes.srv6.policy.mappings.Srv6PolicyMapping; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.Ipv6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.fib.table.management.rev180521.VniReference; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PolicyReadRequest extends JVppRequest + implements ReadRequest<Policy, PolicyKey, PolicyBuilder> { + + private static final String DASH_SEPARATOR = "-"; + private static final Logger LOG = LoggerFactory.getLogger(PolicyReadRequest.class); + private static final SrPoliciesDump STATIC_DUMP_REQUEST = new SrPoliciesDump(); + private static final SrPoliciesDetailsReplyDump STATIC_EMPTY_REPLY = new SrPoliciesDetailsReplyDump(); + private final PolicyContextManager policyCtx; + private final CandidatePathContextManager candidateCtx; + private final DumpCacheManager<SrPoliciesDetailsReplyDump, Void> dumpManager; + + public PolicyReadRequest(FutureJVppCore futureJVpp, PolicyContextManager policyCtx, + final CandidatePathContextManager candidateCtx) { + super(futureJVpp); + this.policyCtx = policyCtx; + this.candidateCtx = candidateCtx; + this.dumpManager = new DumpCacheManager.DumpCacheManagerBuilder<SrPoliciesDetailsReplyDump, Void>().acceptOnly( + SrPoliciesDetailsReplyDump.class) + .withExecutor((identifier, params) -> getReplyForRead( + getApi().srPoliciesDump(STATIC_DUMP_REQUEST).toCompletableFuture(), identifier)) + .build(); + } + + @Nonnull + public List<PolicyKey> readAllKeys(@Nonnull InstanceIdentifier<Policy> id, @Nonnull ReadContext ctx) + throws ReadFailedException { + return dumpManager.getDump(id, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY).srPoliciesDetails.stream() + .map(srPoliciesDetails -> arrayToIpv6AddressNoZone(srPoliciesDetails.bsid.addr)) + .map(bsid -> parsePolicyKey(ctx, bsid)) + .collect(Collectors.toList()); + } + + private PolicyKey parsePolicyKey(final @Nonnull ReadContext ctx, final Ipv6Address bsid) { + Srv6PolicyMapping policy = policyCtx.getPolicy(bsid, ctx.getMappingContext()); + return new PolicyKey(policy.getColor(), new IpAddress(policy.getEndpoint())); + } + + @Override + public void readSpecific(@Nonnull InstanceIdentifier<Policy> id, @Nonnull ReadContext ctx, + @Nonnull PolicyBuilder builder) throws ReadFailedException { + PolicyKey key = id.firstKeyOf(Policy.class); + Ipv6Address bsid = + policyCtx.getPolicyBsid(key.getColor(), key.getEndpoint().getIpv6Address(), ctx.getMappingContext()); + + dumpManager.getDump(id, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY).srPoliciesDetails.stream() + .filter(srPoliciesDetails -> arrayToIpv6AddressNoZone(srPoliciesDetails.bsid.addr).getValue() + .equals(bsid.getValue())) + .findFirst() + .ifPresent((SrPoliciesDetails details) -> bindPolicy(details, ctx, builder)); + } + + private void bindPolicy(SrPoliciesDetails srPoliciesDetails, @Nonnull ReadContext ctx, + final PolicyBuilder builder) { + + Ipv6Address bsid = arrayToIpv6AddressNoZone(srPoliciesDetails.bsid.addr); + Srv6PolicyMapping policy = policyCtx.getPolicy(bsid, ctx.getMappingContext()); + IpAddress endpoint = new IpAddress(policy.getEndpoint()); + builder.setName(policy.getName()).setEndpoint(endpoint).setColor(policy.getColor()); + builder.setKey(new PolicyKey(policy.getColor(), endpoint)); + builder.setBindingSid(new BindingSidBuilder().setState( + new StateBuilder().setType(DataplaneType.Srv6).setAllocMode(BindingSidAllocMode.Explicit) + .setValue(new SidValueType(new IpAddress(bsid))).build()).build()); + builder.addAugmentation(VppSrPolicyAugmentation.class, new VppSrPolicyAugmentationBuilder() + .setVppSrPolicy(new VppSrPolicyBuilder().setState( + new org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.policy.StateBuilder() + .setPolicyBehavior( + SegmentRoutingPolicyBehavior.forValue((int) srPoliciesDetails.isEncap)) + .setPolicyType(SegmentRoutingPolicyType.forValue((int) srPoliciesDetails.type)) + .setTableId(new VniReference(Integer.toUnsignedLong(srPoliciesDetails.fibTable))) + .setAddressFamily(Ipv6.class) + .build()).build()) + .build()); + + builder.setState( + new org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.policy.properties.StateBuilder() + .setName(policy.getName()).setEndpoint(endpoint) + .setColor(policy.getColor()).setAdminState(PolicyAdminState.UP) + .build()); + + builder.setCandidatePaths( + new CandidatePathsBuilder().setCandidatePath(resolveCandidatePaths(srPoliciesDetails, ctx)).build()); + } + + private List<CandidatePath> resolveCandidatePaths(final SrPoliciesDetails srPoliciesDetails, + final ReadContext ctx) { + List<CandidatePath> candidatePaths = new ArrayList<>(); + //only one candidate path can be selected and present on device at the same time + if (srPoliciesDetails.sidLists == null) { + LOG.debug("No policy segments found for BSID: {}", srPoliciesDetails.bsid); + return candidatePaths; + } + Ipv6Address bsid = arrayToIpv6AddressNoZone(srPoliciesDetails.bsid.addr); + Srv6CandidatePathMapping candidatePath = + candidateCtx.getCandidatePath(bsid, ctx.getMappingContext()); + + CandidatePathBuilder candidatePathBuilder = + new CandidatePathBuilder() + .setDistinguisher(candidatePath.getDistinguisher()) + .setPreference(candidatePath.getPreference()) + .setProvisioningMethod(candidatePath.getProvisioningMethod()) + .setName(candidatePath.getName()); + + candidatePathBuilder.setState( + new org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.candidate.paths.candidate.paths.candidate.path.StateBuilder() + .setDistinguisher(candidatePath.getDistinguisher()) + .setPreference(candidatePath.getPreference()) + .setProvisioningMethod(candidatePath.getProvisioningMethod()) + .setComputationMethod(PathExplicitlyDefined.class) + .setName(candidatePath.getName()) + .build()); + candidatePathBuilder.setBindingSid(new BindingSidBuilder().setState( + new StateBuilder().setAllocMode(BindingSidAllocMode.Explicit).setType(DataplaneType.Srv6) + .setValue(new SidValueType(new IpAddress(bsid))).build()).build()); + + List<SegmentList> segments = new ArrayList<>(); + for (Srv6SidList sidlist : srPoliciesDetails.sidLists) { + long weight = Integer.toUnsignedLong(sidlist.weight); + SegmentListBuilder segmentListBuilder = + new SegmentListBuilder().setName(Srv6Util.getCandidatePathName(bsid, weight)); + segmentListBuilder.setState( + new org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.path.segment.list.StateBuilder() + .setName(Srv6Util.getCandidatePathName(bsid, weight)) + .setWeight(weight) + .setOperState(SegmentListOperState.ACTIVE) + .build()); + segments.add(segmentListBuilder.build()); + } + candidatePathBuilder.setSegmentLists(new SegmentListsBuilder().setSegmentList(segments).build()); + candidatePaths.add(candidatePathBuilder.build()); + return candidatePaths; + } + + public List<NamedSegmentListKey> readNamedSegmentListKeys(final InstanceIdentifier<NamedSegmentList> id, + final ReadContext ctx) throws ReadFailedException { + return dumpManager.getDump(id, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY).srPoliciesDetails.stream() + .map(srPoliciesDetails -> { + String bsid = arrayToIpv6AddressNoZone(srPoliciesDetails.bsid.addr).getValue(); + return Arrays.stream(srPoliciesDetails.sidLists).map(srv6SidList -> srv6SidList.weight) + .map(weight -> bsid + DASH_SEPARATOR + weight).collect(Collectors.toList()); + }).flatMap(Collection::stream).map(NamedSegmentListKey::new).distinct().collect(Collectors.toList()); + } + + public void readNamedSegmentList(final InstanceIdentifier<NamedSegmentList> id, + final NamedSegmentListBuilder builder, + final ReadContext ctx) + throws ReadFailedException { + NamedSegmentListKey key = id.firstKeyOf(NamedSegmentList.class); + builder.setKey(key) + .setName(key.getName()) + .setState( + new org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.segment.list.properties.StateBuilder() + .setName(key.getName()) + .build()); + + Long weight = parseWeight(key); + String bsid = parseBsid(key); + Preconditions.checkNotNull(bsid, "Weight/Bsid not resolved for Iid: {}", id); + + builder.setSegments(new SegmentsBuilder().build()); + dumpManager.getDump(id, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY).srPoliciesDetails.stream() + .filter(srPoliciesDetails -> arrayToIpv6AddressNoZone(srPoliciesDetails.bsid.addr).getValue() + .equals(bsid)) + .forEach(srPoliciesDetails -> Arrays.stream(srPoliciesDetails.sidLists) + .forEach(srv6SidList -> { + if (srv6SidList.weight == weight.intValue()) { + List<Segment> segments = IntStream.range(0, srv6SidList.numSids) + .mapToObj(i -> parseSrv6Sid(i, srv6SidList.sids[i])) + .collect(Collectors.toList()); + builder.setSegments(new SegmentsBuilder().setSegment(segments).build()); + } + })); + } + + private Segment parseSrv6Sid(final int i, final Srv6Sid srv6Sid) { + // shifting index by 1 so it matches original indexing + long index = i + 1; + SegmentBuilder builder = new SegmentBuilder().setKey(new SegmentKey(index)).setState( + new org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.segment.properties.StateBuilder() + .setIndex(index) + .setType(SegmentType.Type2) + .setSidValue(new SidValueType( + new IpAddress(new Ipv6Address(arrayToIpv6AddressNoZone(srv6Sid.addr))))) + .build()); + return builder.build(); + } + + + private Long parseWeight(final NamedSegmentListKey key) { + String[] values = key.getName().split(DASH_SEPARATOR); + + return values.length == 2 + ? Long.parseLong(values[1]) + : 0; + } + + private String parseBsid(final NamedSegmentListKey key) { + String[] values = key.getName().split(DASH_SEPARATOR); + return values.length == 2 ? values[0] : null; + } + +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/InterfaceCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/InterfaceCustomizer.java new file mode 100644 index 000000000..9151a9822 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/InterfaceCustomizer.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.steering; + +import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; +import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.hc2vpp.srv6.read.steering.request.L2SteeringRequest; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.segment.routing.traffic.engineering.policies.policy.autoroute.include.InterfacesBuilder; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.InterfaceBuilder; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.InterfaceKey; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class InterfaceCustomizer extends FutureJVppCustomizer + implements ListReaderCustomizer<Interface, InterfaceKey, InterfaceBuilder> { + + private final NamingContext interfaceContext; + + public InterfaceCustomizer(@Nonnull final FutureJVppCore futureJVppCore, + @Nonnull final NamingContext interfaceContext) { + super(futureJVppCore); + this.interfaceContext = interfaceContext; + } + + @Nonnull + @Override + public List<InterfaceKey> getAllIds(@Nonnull InstanceIdentifier<Interface> id, @Nonnull ReadContext context) + throws ReadFailedException { + return + new L2SteeringRequest(getFutureJVpp(), interfaceContext).readAllKeys(id, context); + } + + @Override + public void merge(@Nonnull Builder<? extends DataObject> builder, @Nonnull List<Interface> readData) { + ((InterfacesBuilder) builder).setInterface(readData); + } + + @Nonnull + @Override + public InterfaceBuilder getBuilder(@Nonnull InstanceIdentifier<Interface> id) { + return new InterfaceBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull InstanceIdentifier<Interface> id, @Nonnull InterfaceBuilder builder, + @Nonnull ReadContext ctx) throws ReadFailedException { + L2SteeringRequest readRequest = new L2SteeringRequest(getFutureJVpp(), interfaceContext); + readRequest.readSpecific(id, ctx, builder); + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/PrefixCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/PrefixCustomizer.java new file mode 100644 index 000000000..b0ee7c3f8 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/PrefixCustomizer.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.steering; + +import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; +import io.fd.hc2vpp.srv6.read.steering.request.L3SteeringRequest; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.PrefixesBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.Prefix; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.PrefixBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.PrefixKey; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class PrefixCustomizer extends FutureJVppCustomizer + implements ListReaderCustomizer<Prefix, PrefixKey, PrefixBuilder> { + + public PrefixCustomizer(@Nonnull final FutureJVppCore futureJVppCore) { + super(futureJVppCore); + } + + @Nonnull + @Override + public List<PrefixKey> getAllIds(@Nonnull InstanceIdentifier<Prefix> id, @Nonnull ReadContext context) + throws ReadFailedException { + return + new L3SteeringRequest(getFutureJVpp()).readAllKeys(id, context); + } + + @Override + public void merge(@Nonnull Builder<? extends DataObject> builder, @Nonnull List<Prefix> readData) { + ((PrefixesBuilder) builder).setPrefix(readData); + } + + @Nonnull + @Override + public PrefixBuilder getBuilder(@Nonnull InstanceIdentifier<Prefix> id) { + return new PrefixBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull InstanceIdentifier<Prefix> id, @Nonnull PrefixBuilder builder, + @Nonnull ReadContext ctx) throws ReadFailedException { + L3SteeringRequest readRequest = new L3SteeringRequest(getFutureJVpp()); + readRequest.readSpecific(id, ctx, builder); + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/PrefixesStateCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/PrefixesStateCustomizer.java new file mode 100644 index 000000000..b099939eb --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/PrefixesStateCustomizer.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package io.fd.hc2vpp.srv6.read.steering; + +import com.google.common.collect.ImmutableSet; +import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; +import io.fd.hc2vpp.srv6.read.steering.request.L3SteeringRequest; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ReaderCustomizer; +import io.fd.honeycomb.translate.util.RWUtils; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.Prefixes; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.PrefixesBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.State; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.StateBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class PrefixesStateCustomizer extends FutureJVppCustomizer implements ReaderCustomizer<State, StateBuilder> { + + public PrefixesStateCustomizer(@Nonnull final FutureJVppCore futureJVppCore) { + super(futureJVppCore); + } + + @Nonnull + @Override + public StateBuilder getBuilder(@Nonnull final InstanceIdentifier<State> instanceIdentifier) { + return new StateBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull final InstanceIdentifier<State> instanceIdentifier, + @Nonnull final StateBuilder stateBuilder, @Nonnull final ReadContext readContext) + throws ReadFailedException { + L3SteeringRequest request = new L3SteeringRequest(getFutureJVpp()); + List<IpPrefix> ipPrefixes = + request.readAllIpPrefixes(RWUtils.cutId(instanceIdentifier, Prefixes.class), readContext); + // checks whether L3 steering contains default routes to steer all traffic to SRv6 policy. If found sets + // allPrefixes flag to true in autoroute-include/prefixes/state + boolean allPrefixes = ipPrefixes.containsAll( + ImmutableSet.of(new IpPrefix(new Ipv4Prefix("0.0.0.0/0")), new IpPrefix(new Ipv6Prefix("::/0")))); + + stateBuilder.setPrefixesAll(allPrefixes); + } + + @Override + public void merge(@Nonnull final Builder<? extends DataObject> builder, @Nonnull final State state) { + ((PrefixesBuilder) builder).setState(state); + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/L2SteeringRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/L2SteeringRequest.java new file mode 100644 index 000000000..eb9370787 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/L2SteeringRequest.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.steering.request; + +import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.hc2vpp.srv6.read.ReadRequest; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.vpp.jvpp.core.dto.SrSteeringPolDetails; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.InterfaceBuilder; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces._interface.StateBuilder; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Request for steering of L2 traffic + */ + +public class L2SteeringRequest extends SteeringRequest + implements ReadRequest<Interface, InterfaceKey, InterfaceBuilder> { + + static final int L2_TRAFFIC_TYPE = 2; + private final NamingContext ifcNamingContext; + + public L2SteeringRequest(FutureJVppCore api, NamingContext namingContext) { + super(api); + this.ifcNamingContext = namingContext; + } + + @Override + @Nonnull + public List<InterfaceKey> readAllKeys(@Nonnull InstanceIdentifier<Interface> identifier, @Nonnull ReadContext ctx) + throws ReadFailedException { + return dumpManager.getDump(identifier, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY) + .srSteeringPolDetails.stream() + .filter(srSteeringPolDetails -> ((int) srSteeringPolDetails.trafficType) == L2_TRAFFIC_TYPE) + .map(srSteeringPolDetails -> srSteeringPolDetails.swIfIndex) + .map(ifIndex -> new InterfaceKey(ifcNamingContext.getName(ifIndex, ctx.getMappingContext()))) + .collect(Collectors.toList()); + } + + @Override + public void readSpecific(@Nonnull InstanceIdentifier<Interface> identifier, @Nonnull ReadContext ctx, + @Nonnull InterfaceBuilder builder) throws ReadFailedException { + int index = + ifcNamingContext.getIndex(identifier.firstKeyOf(Interface.class).getInputInterface(), + ctx.getMappingContext()); + + dumpManager.getDump(identifier, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY) + .srSteeringPolDetails.stream() + .filter(srSteeringPolDetails -> ((int) srSteeringPolDetails.trafficType) == L2_TRAFFIC_TYPE) + .filter(srSteeringPolDetails -> srSteeringPolDetails.swIfIndex == index) + .findFirst() + .ifPresent(srSteeringPolDetails -> parseL2Steering(srSteeringPolDetails, builder, ctx)); + } + + private void parseL2Steering(SrSteeringPolDetails srSteeringPolDetails, final InterfaceBuilder builder, + ReadContext ctx) { + String name = ifcNamingContext.getName(srSteeringPolDetails.swIfIndex, ctx.getMappingContext()); + builder.setInputInterface(name).setKey(new InterfaceKey(name)) + .setState(new StateBuilder().setInputInterface(name).build()); + } +} + diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/L3SteeringRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/L3SteeringRequest.java new file mode 100644 index 000000000..1043746e9 --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/L3SteeringRequest.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.steering.request; + +import com.google.common.base.Preconditions; +import io.fd.hc2vpp.srv6.read.ReadRequest; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.vpp.jvpp.core.dto.SrSteeringPolDetails; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.util.List; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.include.prefix.StateBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.Prefixes; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.Prefix; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.PrefixBuilder; +import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.PrefixKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Request for steering of L3 traffic + */ + +public class L3SteeringRequest extends SteeringRequest + implements ReadRequest<Prefix, PrefixKey, PrefixBuilder> { + + private static final int L3_TRAFFIC_TYPE_IPV6 = 6; + private static final int L3_TRAFFIC_TYPE_IPV4 = 4; + + public L3SteeringRequest(final FutureJVppCore api) { + super(api); + } + + @Override + public void checkValid() { + super.checkValid(); + } + + @Override + @Nonnull + public List<PrefixKey> readAllKeys(@Nonnull InstanceIdentifier<Prefix> identifier, @Nonnull ReadContext ctx) + throws ReadFailedException { + return dumpManager.getDump(identifier, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY) + .srSteeringPolDetails.stream() + .filter( + srSteeringPolDetails -> ((int) srSteeringPolDetails.trafficType) != + L2SteeringRequest.L2_TRAFFIC_TYPE) + .map(this::parseL3SteeringKey) + .collect(Collectors.toList()); + } + + public List<IpPrefix> readAllIpPrefixes(@Nonnull InstanceIdentifier<Prefixes> identifier, @Nonnull ReadContext ctx) + throws ReadFailedException { + return dumpManager.getDump(identifier, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY) + .srSteeringPolDetails.stream() + .filter( + srSteeringPolDetails -> ((int) srSteeringPolDetails.trafficType) != + L2SteeringRequest.L2_TRAFFIC_TYPE) + .map(this::parseIpPrefix) + .collect(Collectors.toList()); + } + + @Override + public void readSpecific(@Nonnull InstanceIdentifier<Prefix> identifier, @Nonnull ReadContext ctx, + @Nonnull PrefixBuilder builder) throws ReadFailedException { + checkValid(); + PrefixKey key = identifier.firstKeyOf(Prefix.class); + dumpManager.getDump(identifier, ctx.getModificationCache()).or(STATIC_EMPTY_REPLY) + .srSteeringPolDetails.stream() + .filter( + srSteeringPolDetails -> ((int) srSteeringPolDetails.trafficType) != + L2SteeringRequest.L2_TRAFFIC_TYPE) + .filter(srSteeringPolDetails -> parseL3SteeringKey(srSteeringPolDetails).equals(key)) + .findFirst() + .ifPresent(srSteeringPolDetails1 -> parseL3Steering(srSteeringPolDetails1, builder)); + } + + private void parseL3Steering(SrSteeringPolDetails srSteeringPolDetails, final PrefixBuilder builder) { + PrefixKey key = parseL3SteeringKey(srSteeringPolDetails); + builder.setKey(key).setIpPrefix(key.getIpPrefix()) + .setState(new StateBuilder().setIpPrefix(key.getIpPrefix()).build()); + } + + private PrefixKey parseL3SteeringKey(SrSteeringPolDetails policyDetails) { + return new PrefixKey(parseIpPrefix(policyDetails)); + } + + private IpPrefix parseIpPrefix(final SrSteeringPolDetails policyDetails) { + boolean isIpv6 = isIpv6L3TrafficType(policyDetails.trafficType); + IpPrefix ipPrefix; + if (isIpv6) { + Ipv6Prefix ipv6Prefix = toIpv6Prefix(policyDetails.prefixAddr, policyDetails.maskWidth); + ipPrefix = new IpPrefix(ipv6Prefix); + } else { + Ipv4Prefix ipv4Prefix = toIpv4Prefix(policyDetails.prefixAddr, policyDetails.maskWidth); + ipPrefix = new IpPrefix(ipv4Prefix); + } + return ipPrefix; + } + + private boolean isIpv6L3TrafficType(final byte trafficType) { + Preconditions.checkArgument(trafficType == L3_TRAFFIC_TYPE_IPV4 || trafficType == L3_TRAFFIC_TYPE_IPV6, + "Unsupported traffic type for L3 steering"); + + return trafficType == L3_TRAFFIC_TYPE_IPV6; + } +} diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/SteeringRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/SteeringRequest.java new file mode 100644 index 000000000..04b67f67e --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/read/steering/request/SteeringRequest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.read.steering.request; + +import io.fd.hc2vpp.srv6.util.JVppRequest; +import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; +import io.fd.vpp.jvpp.core.dto.SrSteeringPolDetailsReplyDump; +import io.fd.vpp.jvpp.core.dto.SrSteeringPolDump; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; + +/** + * General template for steering requests + */ +abstract class SteeringRequest extends JVppRequest { + + static final SrSteeringPolDetailsReplyDump STATIC_EMPTY_REPLY = new SrSteeringPolDetailsReplyDump(); + private static final SrSteeringPolDump STATIC_DUMP_REQUEST = new SrSteeringPolDump(); + final DumpCacheManager<SrSteeringPolDetailsReplyDump, Void> dumpManager; + + SteeringRequest(final FutureJVppCore api) { + super(api); + this.dumpManager = + new DumpCacheManager.DumpCacheManagerBuilder<SrSteeringPolDetailsReplyDump, Void>().acceptOnly( + SrSteeringPolDetailsReplyDump.class) + .withExecutor((identifier, params) -> getReplyForRead( + getApi().srSteeringPolDump(STATIC_DUMP_REQUEST).toCompletableFuture(), identifier)) + .build(); + } +} |