From 31bad643f16b6986434571b46158e6c662a240be Mon Sep 17 00:00:00 2001 From: Jan Srnicek Date: Fri, 12 May 2017 07:57:57 +0200 Subject: HC2VPP-128 - interface role impl Provides logic to store data in config datatree Change-Id: Ia1304a84016f3df2b01a227d414fe75e3c647784 Signed-off-by: Jan Srnicek --- interface-role/impl/asciidoc/Readme.adoc | 12 +++ interface-role/impl/pom.xml | 60 +++++++++++++ .../fd/hc2vpp/iface/role/InterfaceRoleModule.java | 39 +++++++++ .../role/read/InterfaceRoleReadCustomizer.java | 58 +++++++++++++ .../role/read/InterfaceRoleReaderFactory.java | 46 ++++++++++ .../role/write/InterfaceRoleWriteCustomizer.java | 60 +++++++++++++ .../role/write/InterfaceRoleWriterFactory.java | 39 +++++++++ .../interface_role_postman_collection.json | 97 ++++++++++++++++++++++ interface-role/pom.xml | 1 + vpp-integration/minimal-distribution/pom.xml | 7 ++ 10 files changed, 419 insertions(+) create mode 100644 interface-role/impl/asciidoc/Readme.adoc create mode 100644 interface-role/impl/pom.xml create mode 100644 interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/InterfaceRoleModule.java create mode 100644 interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReadCustomizer.java create mode 100644 interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReaderFactory.java create mode 100644 interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriteCustomizer.java create mode 100644 interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriterFactory.java create mode 100644 interface-role/interface_role_postman_collection.json diff --git a/interface-role/impl/asciidoc/Readme.adoc b/interface-role/impl/asciidoc/Readme.adoc new file mode 100644 index 000000000..d99f6e1d3 --- /dev/null +++ b/interface-role/impl/asciidoc/Readme.adoc @@ -0,0 +1,12 @@ += impl + +Add support for configuration of following interface roles: + +* virtual-domain-interface(Tenant network interface) + + +* public-interface(Public interface for external access) + + +Data stored in configuration storage only. +Does not support operational read. \ No newline at end of file diff --git a/interface-role/impl/pom.xml b/interface-role/impl/pom.xml new file mode 100644 index 000000000..c017bfb73 --- /dev/null +++ b/interface-role/impl/pom.xml @@ -0,0 +1,60 @@ + + + + + 4.0.0 + + + io.fd.hc2vpp.common + impl-parent + 1.17.07-SNAPSHOT + ../../common/impl-parent + + + io.fd.hc2vpp.iface.role + impl + 1.17.07-SNAPSHOT + ${project.artifactId} + + + + io.fd.hc2vpp.iface.role + api + ${project.version} + + + com.google.inject + guice + + + io.fd.honeycomb + translate-spi + 1.17.04-SNAPSHOT + + + com.google.inject.extensions + guice-multibindings + + + io.fd.honeycomb + translate-impl + 1.17.04-SNAPSHOT + + + \ No newline at end of file diff --git a/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/InterfaceRoleModule.java b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/InterfaceRoleModule.java new file mode 100644 index 000000000..66b56450f --- /dev/null +++ b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/InterfaceRoleModule.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 Cisco 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.iface.role; + +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; +import io.fd.hc2vpp.iface.role.read.InterfaceRoleReaderFactory; +import io.fd.hc2vpp.iface.role.write.InterfaceRoleWriterFactory; +import io.fd.honeycomb.translate.read.ReaderFactory; +import io.fd.honeycomb.translate.write.WriterFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InterfaceRoleModule extends AbstractModule { + + private static final Logger LOG = LoggerFactory.getLogger(InterfaceRoleModule.class); + + @Override + protected void configure() { + LOG.info("Configuring interface role module"); + Multibinder.newSetBinder(binder(), ReaderFactory.class).addBinding().to(InterfaceRoleReaderFactory.class); + Multibinder.newSetBinder(binder(), WriterFactory.class).addBinding().to(InterfaceRoleWriterFactory.class); + LOG.info("Interface role module configured"); + } +} diff --git a/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReadCustomizer.java b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReadCustomizer.java new file mode 100644 index 000000000..352b33c3c --- /dev/null +++ b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReadCustomizer.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Cisco 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.iface.role.read; + +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.ReadFailedException; +import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; +import java.util.List; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.RolesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.Role; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.RoleBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.RoleKey; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class InterfaceRoleReadCustomizer implements ListReaderCustomizer { + + @Nonnull + @Override + public List getAllIds(@Nonnull final InstanceIdentifier instanceIdentifier, + @Nonnull final ReadContext readContext) throws ReadFailedException { + throw new UnsupportedOperationException("Operational read not supported for interface roles"); + } + + @Override + public void merge(@Nonnull final Builder builder, @Nonnull final List list) { + ((RolesBuilder) builder).setRole(list); + } + + @Nonnull + @Override + public RoleBuilder getBuilder(@Nonnull final InstanceIdentifier instanceIdentifier) { + return new RoleBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull final InstanceIdentifier instanceIdentifier, + @Nonnull final RoleBuilder roleBuilder, @Nonnull final ReadContext readContext) + throws ReadFailedException { + throw new UnsupportedOperationException("Operational read not supported for interface roles"); + } +} diff --git a/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReaderFactory.java b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReaderFactory.java new file mode 100644 index 000000000..3641742bf --- /dev/null +++ b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/read/InterfaceRoleReaderFactory.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017 Cisco 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.iface.role.read; + +import io.fd.honeycomb.translate.impl.read.GenericListReader; +import io.fd.honeycomb.translate.read.ReaderFactory; +import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315.InterfaceRoleStateAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315.InterfaceRoleStateAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.Roles; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.RolesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.Role; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class InterfaceRoleReaderFactory implements ReaderFactory { + + @Override + public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { + final InstanceIdentifier augId = + InstanceIdentifier.create(InterfacesState.class) + .child(Interface.class) + .augmentation(InterfaceRoleStateAugmentation.class); + registry.addStructuralReader(augId, InterfaceRoleStateAugmentationBuilder.class); + + final InstanceIdentifier rolesId = augId.child(Roles.class); + registry.addStructuralReader(rolesId, RolesBuilder.class); + registry.add(new GenericListReader<>(rolesId.child(Role.class), new InterfaceRoleReadCustomizer())); + } +} diff --git a/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriteCustomizer.java b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriteCustomizer.java new file mode 100644 index 000000000..fab3ed8c0 --- /dev/null +++ b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriteCustomizer.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017 Cisco 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.iface.role.write; + + +import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer; +import io.fd.honeycomb.translate.write.WriteContext; +import io.fd.honeycomb.translate.write.WriteFailedException; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.Role; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.RoleKey; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InterfaceRoleWriteCustomizer implements ListWriterCustomizer { + + private static final Logger LOG = LoggerFactory.getLogger(InterfaceRoleWriteCustomizer.class); + + @Override + public void writeCurrentAttributes(@Nonnull final InstanceIdentifier instanceIdentifier, + @Nonnull final Role role, + @Nonnull final WriteContext writeContext) throws WriteFailedException { + LOG.debug("Writing interface role {} for interface {}", role, + instanceIdentifier.firstKeyOf(Interface.class).getName()); + } + + @Override + public void updateCurrentAttributes(@Nonnull final InstanceIdentifier instanceIdentifier, + @Nonnull final Role roleBefore, + @Nonnull final Role roleAfter, + @Nonnull final WriteContext writeContext) + throws WriteFailedException { + LOG.debug("Updating interface role from {} to {} for interface {}", roleBefore, roleAfter, + instanceIdentifier.firstKeyOf(Interface.class).getName()); + } + + @Override + public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier instanceIdentifier, + @Nonnull final Role role, + @Nonnull final WriteContext writeContext) throws WriteFailedException { + LOG.debug("Removing interface role {} for interface {}", role, + instanceIdentifier.firstKeyOf(Interface.class).getName()); + } +} diff --git a/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriterFactory.java b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriterFactory.java new file mode 100644 index 000000000..537c3795e --- /dev/null +++ b/interface-role/impl/src/main/java/io/fd/hc2vpp/iface/role/write/InterfaceRoleWriterFactory.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 Cisco 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.iface.role.write; + +import io.fd.honeycomb.translate.impl.write.GenericListWriter; +import io.fd.honeycomb.translate.write.WriterFactory; +import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315.InterfaceRoleAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.Roles; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.role.rev170315._interface.role.grouping.roles.Role; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class InterfaceRoleWriterFactory implements WriterFactory { + + @Override + public void init(@Nonnull final ModifiableWriterRegistryBuilder registryBuilder) { + final InstanceIdentifier roleId = InstanceIdentifier.create(Interfaces.class) + .child(Interface.class).augmentation(InterfaceRoleAugmentation.class) + .child(Roles.class).child(Role.class); + registryBuilder.add(new GenericListWriter<>(roleId, new InterfaceRoleWriteCustomizer())); + } +} diff --git a/interface-role/interface_role_postman_collection.json b/interface-role/interface_role_postman_collection.json new file mode 100644 index 000000000..caabac1ac --- /dev/null +++ b/interface-role/interface_role_postman_collection.json @@ -0,0 +1,97 @@ +{ + "id": "bff7e146-feff-fdb7-86d1-07441f73c6e2", + "name": "Interface role postman collection", + "description": "", + "order": [ + "3f88fde7-2cba-48c9-9386-53396ec83464", + "5d8e79c1-7083-31b1-687f-ad00b9089379", + "b4befe86-f1de-d7e3-f445-58d44e2553af", + "2844ace4-49ed-8216-706f-4ba9028da767" + ], + "folders": [], + "timestamp": 1492683147840, + "owner": "658985", + "public": false, + "requests": [ + { + "id": "2844ace4-49ed-8216-706f-4ba9028da767", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8183/restconf/config/ietf-interfaces:interfaces/interface/local0/roles/role/local0-role", + "preRequestScript": null, + "pathVariables": {}, + "method": "GET", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1494501640856, + "name": "Get role mapping ", + "description": "", + "collectionId": "bff7e146-feff-fdb7-86d1-07441f73c6e2", + "responses": [], + "rawModeData": "{\n\t\"role\":{\n\t\t\"role-name\":\"local0-role\",\n\t\t\"role-type\":\"virtual-domain-interface\",\n\t\t\"description\":\"interface for public access\"\n\t}\n}" + }, + { + "id": "3f88fde7-2cba-48c9-9386-53396ec83464", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8183/restconf/config/ietf-interfaces:interfaces/interface/local0/roles/role/local0-role", + "preRequestScript": null, + "pathVariables": {}, + "method": "PUT", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1494501555944, + "name": "Add role mapping", + "description": "", + "collectionId": "bff7e146-feff-fdb7-86d1-07441f73c6e2", + "responses": [], + "rawModeData": "{\n\t\"role\":{\n\t\t\"role-name\":\"local0-role\",\n\t\t\"role-type\":\"public-interface\",\n\t\t\"description\":\"interface for public access\"\n\t}\n}" + }, + { + "id": "5d8e79c1-7083-31b1-687f-ad00b9089379", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8183/restconf/config/ietf-interfaces:interfaces/interface/local0/roles/role/local0-role", + "preRequestScript": null, + "pathVariables": {}, + "method": "PUT", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1494501569167, + "name": "Update role mapping", + "description": "", + "collectionId": "bff7e146-feff-fdb7-86d1-07441f73c6e2", + "responses": [], + "rawModeData": "{\n\t\"role\":{\n\t\t\"role-name\":\"local0-role\",\n\t\t\"role-type\":\"virtual-domain-interface\",\n\t\t\"description\":\"interface for public access\"\n\t}\n}" + }, + { + "id": "b4befe86-f1de-d7e3-f445-58d44e2553af", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://localhost:8183/restconf/config/ietf-interfaces:interfaces/interface/local0/roles/role/local0-role", + "preRequestScript": null, + "pathVariables": {}, + "method": "DELETE", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1492698130815, + "name": "Remove role mapping", + "description": "", + "collectionId": "bff7e146-feff-fdb7-86d1-07441f73c6e2", + "responses": [], + "rawModeData": "{\n\t\"role\":{\n\t\t\"role-name\":\"local0-role\",\n\t\t\"role-type\":\"virtual-domain-interface\",\n\t\t\"description\":\"interface for public access\"\n\t}\n}" + } + ] +} \ No newline at end of file diff --git a/interface-role/pom.xml b/interface-role/pom.xml index 8fbf97a94..9493d9164 100644 --- a/interface-role/pom.xml +++ b/interface-role/pom.xml @@ -19,5 +19,6 @@ api + impl \ No newline at end of file diff --git a/vpp-integration/minimal-distribution/pom.xml b/vpp-integration/minimal-distribution/pom.xml index 889d8fd58..92033315e 100644 --- a/vpp-integration/minimal-distribution/pom.xml +++ b/vpp-integration/minimal-distribution/pom.xml @@ -43,12 +43,14 @@ 1.17.07-SNAPSHOT 1.17.07-SNAPSHOT 1.17.07-SNAPSHOT + 1.17.07-SNAPSHOT io.fd.hc2vpp.common.integration.VppCommonModule, io.fd.hc2vpp.management.VppManagementModule, io.fd.hc2vpp.lisp.LispModule, io.fd.hc2vpp.v3po.V3poModule, + io.fd.hc2vpp.iface.role.InterfaceRoleModule, io.fd.hc2vpp.l3.InterfaceL3Module, io.fd.hc2vpp.l3.SubInterfaceL3Module, io.fd.hc2vpp.l3.ProxyArpModule, @@ -151,5 +153,10 @@ vpp-management-impl ${vpp-management-impl.version} + + io.fd.hc2vpp.iface.role + impl + ${iface.role.version} + -- cgit 1.2.3-korg