diff options
author | Jan Srnicek <jsrnicek@cisco.com> | 2017-05-12 07:57:57 +0200 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2017-05-12 07:12:28 +0000 |
commit | 31bad643f16b6986434571b46158e6c662a240be (patch) | |
tree | ba12c79969f554d9b659de327ba770b40cd57651 | |
parent | 9129ae7114c4215f5b61da4fd8360755127f815e (diff) |
HC2VPP-128 - interface role impl
Provides logic to store data in config datatree
Change-Id: Ia1304a84016f3df2b01a227d414fe75e3c647784
Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
10 files changed, 419 insertions, 0 deletions
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ 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. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>io.fd.hc2vpp.common</groupId> + <artifactId>impl-parent</artifactId> + <version>1.17.07-SNAPSHOT</version> + <relativePath>../../common/impl-parent</relativePath> + </parent> + + <groupId>io.fd.hc2vpp.iface.role</groupId> + <artifactId>impl</artifactId> + <version>1.17.07-SNAPSHOT</version> + <name>${project.artifactId}</name> + + <dependencies> + <dependency> + <groupId>io.fd.hc2vpp.iface.role</groupId> + <artifactId>api</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + </dependency> + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>translate-spi</artifactId> + <version>1.17.04-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-multibindings</artifactId> + </dependency> + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>translate-impl</artifactId> + <version>1.17.04-SNAPSHOT</version> + </dependency> + </dependencies> +</project>
\ 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<Role, RoleKey, RoleBuilder> { + + @Nonnull + @Override + public List<RoleKey> getAllIds(@Nonnull final InstanceIdentifier<Role> instanceIdentifier, + @Nonnull final ReadContext readContext) throws ReadFailedException { + throw new UnsupportedOperationException("Operational read not supported for interface roles"); + } + + @Override + public void merge(@Nonnull final Builder<? extends DataObject> builder, @Nonnull final List<Role> list) { + ((RolesBuilder) builder).setRole(list); + } + + @Nonnull + @Override + public RoleBuilder getBuilder(@Nonnull final InstanceIdentifier<Role> instanceIdentifier) { + return new RoleBuilder(); + } + + @Override + public void readCurrentAttributes(@Nonnull final InstanceIdentifier<Role> 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<InterfaceRoleStateAugmentation> augId = + InstanceIdentifier.create(InterfacesState.class) + .child(Interface.class) + .augmentation(InterfaceRoleStateAugmentation.class); + registry.addStructuralReader(augId, InterfaceRoleStateAugmentationBuilder.class); + + final InstanceIdentifier<Roles> 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<Role, RoleKey> { + + private static final Logger LOG = LoggerFactory.getLogger(InterfaceRoleWriteCustomizer.class); + + @Override + public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Role> 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<Role> 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<Role> 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<Role> 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 @@ <modules> <module>api</module> + <module>impl</module> </modules> </project>
\ 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 @@ <vpp.classifier.version>1.17.07-SNAPSHOT</vpp.classifier.version> <l3-impl.version>1.17.07-SNAPSHOT</l3-impl.version> <vpp-management-impl.version>1.17.07-SNAPSHOT</vpp-management-impl.version> + <iface.role.version>1.17.07-SNAPSHOT</iface.role.version> <distribution.modules> 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 @@ <artifactId>vpp-management-impl</artifactId> <version>${vpp-management-impl.version}</version> </dependency> + <dependency> + <groupId>io.fd.hc2vpp.iface.role</groupId> + <artifactId>impl</artifactId> + <version>${iface.role.version}</version> + </dependency> </dependencies> </project> |