Add service-resiliency compliance check 83/101583/7
authorThierry Jiao <thierry.jiao@orange.com>
Fri, 10 Jun 2022 13:17:22 +0000 (15:17 +0200)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Thu, 30 Jun 2022 07:06:36 +0000 (07:06 +0000)
- Implement new method of compliance check dedicated to
service-resiliency input
- Add JUnit test of this new method

JIRA: TRNSPRTPCE-670
Signed-off-by: Thierry Jiao <thierry.jiao@orange.com>
Change-Id: I522f0bc02bb9723408172b53d1f4b190db11d667

servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/ServiceCreateValidation.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerServiceResiliencyCheck.java [new file with mode: 0644]
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyServiceResiliencyTest.java [new file with mode: 0644]

index 93f80eca1ae333ba1a440e6aacb2a4d01e36de39..ef3fbd420e25e51a5fba6f02eef35803fef28fab 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.validation.checks.CheckCoherencyHardSoft;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerServiceResiliencyCheck;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerTxRxCheck;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
@@ -82,6 +83,18 @@ public final class ServiceCreateValidation {
         } else {
             LOG.warn("Common-id not specified !");
         }
+
+        if (input.getServiceResiliency() != null) {
+            LOG.debug("Service-resiliency specified");
+            ComplianceCheckResult complianceCheckResult = ServicehandlerServiceResiliencyCheck
+                    .check(input.getServiceResiliency());
+            if (complianceCheckResult.hasPassed()) {
+                LOG.debug("Service-resiliency checked !");
+            } else {
+                return OperationResult.failed(complianceCheckResult.getMessage());
+            }
+        }
+
         return OperationResult.ok("Validation successful.");
     }
 
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerServiceResiliencyCheck.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerServiceResiliencyCheck.java
new file mode 100644 (file)
index 0000000..2d5b173
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright © 2022 Orange, 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.transportpce.servicehandler.validation.checks;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.resiliency.ServiceResiliency;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to check compliance of service-resiliency input.
+ */
+public final class ServicehandlerServiceResiliencyCheck {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ServicehandlerServiceResiliencyCheck.class);
+    public static final String LOG_ATTRIBUTE_NOT_DEDICATED = "An attribute not dedicated for this type of "
+            + "resiliency was filled";
+    public static final String LOG_RESILIENCY_TYPE_UNMANAGED = "Resiliency unmanaged for compliance check !";
+    public static final String LOG_RESILIENCY_NULL = "Resiliency is null !";
+
+    /**
+     * Function to check coherency of service-resiliency inputs.
+     *
+     * @param serviceResiliency ServiceResiliency to check
+     * @return <code> true </code>  if coherent
+     *         <code> false </code> otherwise
+     */
+    public static ComplianceCheckResult check(ServiceResiliency serviceResiliency) {
+        if (serviceResiliency.getResiliency() != null) {
+            switch (serviceResiliency.getResiliency().getSimpleName()) {
+                case "Unprotected":
+                    return checkUnprotectedResiliency(serviceResiliency);
+
+                case "UnprotectedDiverselyRouted":
+                    return checkUnprotectedDiverselyRoutedResiliency(serviceResiliency);
+
+                case "Protected":
+                    return checkProtectedResiliency(serviceResiliency);
+
+                case "Restorable":
+                case "ExternalTriggerRestorable":
+                    return checkRestorableAndExternalTriggerRestorableResiliency(serviceResiliency);
+
+                default:
+                    LOG.warn(LOG_RESILIENCY_TYPE_UNMANAGED);
+                    return new ComplianceCheckResult(false, LOG_RESILIENCY_TYPE_UNMANAGED);
+            }
+        } else {
+            LOG.warn(LOG_RESILIENCY_NULL);
+            return new ComplianceCheckResult(false, LOG_RESILIENCY_NULL);
+        }
+    }
+
+    private static ComplianceCheckResult checkUnprotectedResiliency(ServiceResiliency serviceResiliency) {
+        return serviceResiliency.getRevertive() == null
+                && serviceResiliency.getWaitToRestore() == null
+                && serviceResiliency.getHoldoffTime() == null
+                && serviceResiliency.getPreCalculatedBackupPathNumber() == null
+                && serviceResiliency.getCoupledService() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private static ComplianceCheckResult checkUnprotectedDiverselyRoutedResiliency(
+            ServiceResiliency serviceResiliency) {
+        return serviceResiliency.getRevertive() == null
+                && serviceResiliency.getWaitToRestore() == null
+                && serviceResiliency.getHoldoffTime() == null
+                && serviceResiliency.getPreCalculatedBackupPathNumber() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private static ComplianceCheckResult checkProtectedResiliency(ServiceResiliency serviceResiliency) {
+        return (serviceResiliency.getWaitToRestore() == null
+                || (serviceResiliency.getRevertive() != null && serviceResiliency.getRevertive()))
+                && serviceResiliency.getPreCalculatedBackupPathNumber() == null
+                && serviceResiliency.getCoupledService() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private static ComplianceCheckResult checkRestorableAndExternalTriggerRestorableResiliency(
+            ServiceResiliency serviceResiliency) {
+        return (serviceResiliency.getWaitToRestore() == null
+                || (serviceResiliency.getRevertive() != null && serviceResiliency.getRevertive()))
+                && serviceResiliency.getCoupledService() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private ServicehandlerServiceResiliencyCheck() {
+    }
+}
diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyServiceResiliencyTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyServiceResiliencyTest.java
new file mode 100644 (file)
index 0000000..22a728e
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2022 Orange, 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.transportpce.servicehandler.validation.checks;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Protected;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Restorable;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Unprotected;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.UnprotectedDiverselyRouted;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.resiliency.ServiceResiliencyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.resiliency.service.resiliency.CoupledServiceBuilder;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CheckCoherencyServiceResiliencyTest {
+
+    @Test
+    public void testCheckWhenResiliencyNull() {
+        ComplianceCheckResult result = ServicehandlerServiceResiliencyCheck.check(
+                new ServiceResiliencyBuilder().setRevertive(true).build());
+
+        Assert.assertFalse(result.hasPassed());
+        Assert.assertEquals(ServicehandlerServiceResiliencyCheck.LOG_RESILIENCY_NULL, result.getMessage());
+    }
+
+    @Test
+    public void testCheckWhenUnprotectedResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(Unprotected.class);
+
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(input.setRevertive(true).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setWaitToRestore(Uint64.valueOf(1)).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setHoldoffTime(Uint64.valueOf(1)).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setPreCalculatedBackupPathNumber(Uint8.valueOf(1)).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setCoupledService(new CoupledServiceBuilder().build()).build()).hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenUnprotectedResiliencyWithCorrectAttributes() {
+        Assert.assertTrue(ServicehandlerServiceResiliencyCheck.check(
+                new ServiceResiliencyBuilder()
+                        .setResiliency(Unprotected.class)
+                        .build())
+                .hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenUnprotectedDiverselyRoutedResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(UnprotectedDiverselyRouted.class);
+
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(input.setRevertive(true).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setWaitToRestore(Uint64.valueOf(1)).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setHoldoffTime(Uint64.valueOf(1)).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setPreCalculatedBackupPathNumber(Uint8.valueOf(1)).build()).hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenUnprotectedDiverselyRoutedResiliencyWithCorrectAttributes() {
+        Assert.assertTrue(ServicehandlerServiceResiliencyCheck.check(
+                new ServiceResiliencyBuilder().setResiliency(UnprotectedDiverselyRouted.class)
+                        .setCoupledService(new CoupledServiceBuilder().build()).build()).hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenProtectedResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(Protected.class);
+
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setWaitToRestore(Uint64.valueOf(1)).setRevertive(false).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setPreCalculatedBackupPathNumber(Uint8.valueOf(1)).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setCoupledService(new CoupledServiceBuilder().build()).build()).hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenProtectedResiliencyWithCorrectAttributes() {
+        Assert.assertTrue(ServicehandlerServiceResiliencyCheck.check(
+                new ServiceResiliencyBuilder()
+                        .setResiliency(Protected.class)
+                        .setRevertive(true)
+                        .setWaitToRestore(Uint64.valueOf(1))
+                        .setHoldoffTime(Uint64.valueOf(1))
+                        .build())
+                .hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenRestorableOrExternalTriggerRestorableResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(Restorable.class);
+
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setWaitToRestore(Uint64.valueOf(1)).setRevertive(false).build()).hasPassed());
+        Assert.assertFalse(ServicehandlerServiceResiliencyCheck.check(
+                input.setCoupledService(new CoupledServiceBuilder().build()).build()).hasPassed());
+    }
+
+    @Test
+    public void testCheckWhenRestorableOrExternalTriggerRestorableResiliencyWithCorrectAttributes() {
+        Assert.assertTrue(ServicehandlerServiceResiliencyCheck.check(
+                new ServiceResiliencyBuilder()
+                        .setResiliency(Restorable.class)
+                        .setRevertive(true)
+                        .setWaitToRestore(Uint64.valueOf(1))
+                        .setHoldoffTime(Uint64.valueOf(1))
+                        .setPreCalculatedBackupPathNumber(Uint8.valueOf(1))
+                        .build())
+                .hasPassed());
+    }
+}