ios-xe renderer reporting capabilities 37/40037/4
authorMatej Perina <matej.perina@pantheon.sk>
Thu, 9 Jun 2016 07:50:37 +0000 (09:50 +0200)
committerMatej Perina <matej.perina@pantheon.sk>
Wed, 15 Jun 2016 10:06:17 +0000 (10:06 +0000)
Change-Id: I16ca6bb9ef0a2843624d668136d8dd7ffe015a20
Signed-off-by: Matej Perina <matej.perina@pantheon.sk>
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/IosXeRendererProviderImpl.java
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/Action.java [new file with mode: 0644]
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/ChainAction.java [new file with mode: 0644]
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/Classifier.java [new file with mode: 0644]
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/EtherTypeClassifier.java [new file with mode: 0644]
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/IpProtoClassifier.java [new file with mode: 0644]

index f888de8f1a783d426ae1c14584836031291e27cd..d6e5ad4f8e53cba70d590cc0fb889560f7619530 100644 (file)
@@ -8,8 +8,12 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl;
 
-import com.google.common.base.Preconditions;
+import java.util.List;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.api.IosXeRendererProvider;
@@ -21,10 +25,30 @@ import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.listener.
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.NodeManager;
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl;
 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerZipImpl;
+import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.ChainAction;
+import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.Classifier;
+import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.EtherTypeClassifier;
+import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf.IpProtoClassifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.CapabilitiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinitionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinitionBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+
 /**
  * Purpose: bootstrap provider implementation of Ios-xe renderer
  */
@@ -87,5 +111,54 @@ public class IosXeRendererProviderImpl implements IosXeRendererProvider, Binding
         rendererConfigurationListener = new RendererConfigurationListenerImpl(dataBroker, rendererName, policyManagerZip);
         // supported node list maintenance
         // TODO: upkeep of available renderer-nodes
+
+        // provide renderer capabilities
+        writeRendererCapabilities();
+    }
+
+    private void writeRendererCapabilities() {
+        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+
+        ChainAction action = new ChainAction();
+        List<SupportedActionDefinition> actionDefinitions =
+                ImmutableList.of(new SupportedActionDefinitionBuilder().setActionDefinitionId(action.getId())
+                    .setSupportedParameterValues(action.getSupportedParameterValues())
+                    .build());
+
+        Classifier etherClassifier = new EtherTypeClassifier(null);
+        Classifier ipProtoClassifier = new IpProtoClassifier(etherClassifier.getId());
+        List<SupportedClassifierDefinition> classifierDefinitions = ImmutableList
+            .of(new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(etherClassifier.getId())
+                .setParentClassifierDefinitionId(etherClassifier.getParent())
+                .setSupportedParameterValues(etherClassifier.getSupportedParameterValues())
+                .build(),
+                new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(ipProtoClassifier.getId())
+                .setParentClassifierDefinitionId(ipProtoClassifier.getParent())
+                .setSupportedParameterValues(ipProtoClassifier.getSupportedParameterValues())
+                .build());
+
+        Renderer renderer = new RendererBuilder().setName(NodeManager.iosXeRenderer)
+            .setCapabilities(new CapabilitiesBuilder().setSupportedActionDefinition(actionDefinitions)
+                .setSupportedClassifierDefinition(classifierDefinitions)
+                .build())
+            .build();
+
+        InstanceIdentifier<Renderer> iid = InstanceIdentifier.builder(Renderers.class)
+        .child(Renderer.class, new RendererKey(new RendererName(NodeManager.iosXeRenderer)))
+        .build();
+        writeTransaction.merge(LogicalDatastoreType.OPERATIONAL, iid, renderer, true);
+        CheckedFuture<Void, TransactionCommitFailedException> future = writeTransaction.submit();
+        Futures.addCallback(future, new FutureCallback<Void>() {
+
+            @Override
+            public void onFailure(Throwable throwable) {
+                LOG.error("Could not register renderer {}: {}", renderer, throwable);
+            }
+
+            @Override
+            public void onSuccess(Void result) {
+                LOG.debug("Renderer {} successfully registered.", renderer);
+            }
+        });
     }
 }
diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/Action.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/Action.java
new file mode 100644 (file)
index 0000000..fb4e5ca
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf;
+
+import java.util.List;
+
+import org.opendaylight.groupbasedpolicy.api.Validator;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.action.definition.SupportedParameterValues;
+
+public abstract class Action implements Validator<ActionInstance> {
+
+    /**
+     * Get the action definition for this action.
+     *
+     * @return the {@link ActionDefinition} for this action
+     */
+    public abstract ActionDefinitionId getId();
+
+    /**
+     * The result represents supported parameters for the action by renderer.
+     *
+     * @return list of supported parameters by the action
+     */
+    public abstract List<SupportedParameterValues> getSupportedParameterValues();
+
+}
diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/ChainAction.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/ChainAction.java
new file mode 100644 (file)
index 0000000..01fb987
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.opendaylight.groupbasedpolicy.api.ValidationResult;
+import org.opendaylight.groupbasedpolicy.api.sf.ChainActionDefinition;
+import org.opendaylight.groupbasedpolicy.dto.ValidationResultBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.action.definition.SupportedParameterValues;
+
+public class ChainAction extends Action {
+
+    @Override
+    public ActionDefinitionId getId() {
+        return ChainActionDefinition.ID;
+    }
+
+    @Override
+    public ValidationResult validate(ActionInstance actionInstance) {
+        return new ValidationResultBuilder().success().build();
+    }
+
+    @Override
+    public List<SupportedParameterValues> getSupportedParameterValues() {
+        // allow action definition has no parameter
+        return Collections.emptyList();
+    }
+}
diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/Classifier.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/Classifier.java
new file mode 100644 (file)
index 0000000..ffb78e8
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf;
+
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
+
+/**
+ * Represent a classifier definition.
+ */
+public abstract class Classifier {
+
+    protected final ClassifierDefinitionId parent;
+
+    protected Classifier(ClassifierDefinitionId parent) {
+        this.parent = parent;
+    }
+
+    /**
+     * Get the classifier definition id for this classifier.
+     *
+     * @return the {@link ClassifierDefinitionId} for this classifier
+     */
+    public abstract ClassifierDefinitionId getId();
+
+    /**
+     * Get parent for this classifier.
+     *
+     * @return parent classifier, see {@link Classifier}
+     */
+    public final ClassifierDefinitionId getParent() {
+        return parent;
+    }
+
+    /**
+     * The result represents supported parameters for the classifier by renderer.
+     *
+     * @return list of supported parameters by the classifier
+     */
+    public abstract List<SupportedParameterValues> getSupportedParameterValues();
+
+}
diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/EtherTypeClassifier.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/EtherTypeClassifier.java
new file mode 100644 (file)
index 0000000..7c1aa53
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf;
+
+import java.util.List;
+
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.IntBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueBuilder;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Match on the ether type of the traffic.
+ */
+public class EtherTypeClassifier extends Classifier {
+
+    public EtherTypeClassifier(ClassifierDefinitionId parent) {
+        super(parent);
+    }
+
+    @Override
+    public ClassifierDefinitionId getId() {
+        return EtherTypeClassifierDefinition.ID;
+    }
+
+    @Override
+    public List<SupportedParameterValues> getSupportedParameterValues() {
+
+        List<SupportedIntValue> values = ImmutableList.of(
+                new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv4_VALUE).build(),
+                new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv6_VALUE).build());
+        SupportedParameterValuesBuilder builder = new SupportedParameterValuesBuilder();
+        builder.setParameterName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
+        builder.setParameterType(new IntBuilder().setSupportedIntValue(values).build());
+
+        return ImmutableList.of(builder.build());
+    }
+}
diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/IpProtoClassifier.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/sf/IpProtoClassifier.java
new file mode 100644 (file)
index 0000000..e185737
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.sf;
+
+import java.util.List;
+
+import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.IntBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueBuilder;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Match on the IP protocol of IP traffic.
+ */
+public class IpProtoClassifier extends Classifier {
+
+    public IpProtoClassifier(ClassifierDefinitionId parent) {
+        super(parent);
+    }
+
+    @Override
+    public ClassifierDefinitionId getId() {
+        return IpProtoClassifierDefinition.ID;
+    }
+
+    @Override
+    public List<SupportedParameterValues> getSupportedParameterValues() {
+
+        List<SupportedIntValue> values = ImmutableList.of(
+                new SupportedIntValueBuilder().setValue(IpProtoClassifierDefinition.ICMP_VALUE).build(),
+                new SupportedIntValueBuilder().setValue(IpProtoClassifierDefinition.SCTP_VALUE).build(),
+                new SupportedIntValueBuilder().setValue(IpProtoClassifierDefinition.TCP_VALUE).build(),
+                new SupportedIntValueBuilder().setValue(IpProtoClassifierDefinition.UDP_VALUE).build());
+        SupportedParameterValuesBuilder builder = new SupportedParameterValuesBuilder();
+        builder.setParameterName(new ParameterName(IpProtoClassifierDefinition.PROTO_PARAM));
+        builder.setParameterType(new IntBuilder().setSupportedIntValue(values).build());
+
+        return ImmutableList.of(builder.build());
+    }
+}