Update release in docs/conf.yaml
[transportpce.git] / servicehandler / src / test / java / org / opendaylight / transportpce / servicehandler / DowngradeConstraintsTest.java
index 75063dc12ffdcbc3e3af78dc2c1c954714665bad..b3bcaa70c0f5a32ba49e8b6c73c933386464c377 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2018 Orange, Inc. and others.  All rights reserved.
+ * Copyright © 2018 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,
  */
 package org.opendaylight.transportpce.servicehandler;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildHardConstraintWithCoRouting;
-import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildHardConstraintWithGeneral;
-import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildHardConstraintWithNullGeneral;
-import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildSoftConstraintWithCoRouting;
-import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildSoftConstraintWithGeneral;
-
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev190329.constraints.co.routing.or.general.CoRouting;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev190329.constraints.co.routing.or.general.General;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev190329.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev190329.routing.constraints.SoftConstraints;
+import static org.hamcrest.CoreMatchers.hasItems;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildHardConstraint;
+import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildSoftConstraint;
+
+import java.util.Set;
+import org.hamcrest.collection.IsMapContaining;
+import org.junit.jupiter.api.Test;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.DiversityConstraints.DiversityType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.common.constraints.LinkIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service.constraints.ServiceIdentifierListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
 
 /**
  * Class to test downgrading and updating Constraints .
- *
  * @author Ahmed Helmy ( ahmad.helmy@orange.com )
- *
+ * @author Gilles Thouenon (gilles.thouenon@orange.com)
  */
 public class DowngradeConstraintsTest {
 
-
-
     @Test
-    public void testUpdateSoftConstraintsBothCoRouting() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithCoRouting();
-        SoftConstraints initialSoftConstraints = buildSoftConstraintWithCoRouting();
+    void testUpdateSoftConstraintsForCustomerCode() {
+        // test no addition when hard customer-code is null or empty
+        HardConstraints initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
-                  initialHardConstraints, initialSoftConstraints);
-
-        assertEquals(
-                generatedSoftConstraints.getCustomerCode().get(0),
-                initialHardConstraints.getCustomerCode().get(0));
-        assertEquals(
-                ((CoRouting)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getCoRouting().getExistingService().get(0),
-                ((CoRouting)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getCoRouting().getExistingService().get(0));
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getCustomerCode(),
+            "updated soft constraints should contain no customer code");
+        Set<String> softCustomerCode = Set.of("soft-customer-code 3", "soft-customer-code 4");
+        initialSoftConstraints =
+            buildSoftConstraint(softCustomerCode, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getCustomerCode(), generatedSoftConstraints.getCustomerCode());
+
+        // test addition of hard customer-code when no soft customer-code
+        Set<String> hardCustomerCode = Set.of("hard-customer-code 1", "hard-customer-code 2");
+        initialHardConstraints =
+            buildHardConstraint(hardCustomerCode, false, null, null, null, null, false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(generatedSoftConstraints.getCustomerCode(),initialHardConstraints.getCustomerCode(),
+            "updated soft constraints should contain the customer code of hard constraint");
+        // test addition of hard customer-code when existing soft customer-code
+        initialSoftConstraints =
+            buildSoftConstraint(softCustomerCode, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+                initialHardConstraints, initialSoftConstraints);
+        assertThat("updated soft constraints should contain 4 customer code",
+            generatedSoftConstraints.getCustomerCode(), hasSize(4));
+        assertThat(generatedSoftConstraints.getCustomerCode(),
+            containsInAnyOrder("hard-customer-code 1", "hard-customer-code 2", "soft-customer-code 3",
+                "soft-customer-code 4"));
     }
 
     @Test
-    public void testUpdateSoftConstraintsBothGeneral() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithGeneral();
-        SoftConstraints initialSoftConstraints = buildSoftConstraintWithGeneral();
+    void testUpdateSoftConstraintsForDiversity() {
+        HardConstraints initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
-                initialHardConstraints, initialSoftConstraints);
-
-        assertEquals(
-                generatedSoftConstraints.getCustomerCode().get(0),
-                initialHardConstraints.getCustomerCode().get(0));
-        assertEquals(
-                ((General)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getDiversity().getExistingService().get(0),
-                ((General)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getDiversity().getExistingService().get(0));
-
-        assertEquals(
-                ((General)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getExclude().getSupportingServiceName().get(0),
-                ((General)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getExclude().getSupportingServiceName().get(0));
-        assertEquals(
-                ((General)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getExclude().getNodeId(),
-                ((General)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getExclude().getNodeId());
-        assertEquals(
-                ((General)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getInclude().getSupportingServiceName().get(0),
-                ((General)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getInclude().getSupportingServiceName().get(0));
-
-        assertEquals(
-                ((General)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getInclude().getNodeId(),
-                ((General)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getInclude().getNodeId());
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getDiversity(),
+            "updated soft constraints should contain no diversity constraint");
+        Set<String> softDiversityServiceid = Set.of("soft-service 3");
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, softDiversityServiceid, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getDiversity(), generatedSoftConstraints.getDiversity());
+
+        // test addition of hard diversity when no soft diversity
+        Set<String> hardDiversityServiceid = Set.of("hard-service 1", "hard-service 2");
+        initialHardConstraints =
+            buildHardConstraint(null, false, hardDiversityServiceid, null, null, null, false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(generatedSoftConstraints.getDiversity(), initialHardConstraints.getDiversity(),
+            "updated soft constraints should contain the diversity of hard constraint");
+
+        // test addition of hard diversity when existing soft diversity
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, softDiversityServiceid, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertThat("updated soft constraints should contain diversity with 3 services",
+            generatedSoftConstraints.getDiversity().getServiceIdentifierList().size(), is(3));
+        assertEquals(DiversityType.Serial, generatedSoftConstraints.getDiversity().getDiversityType(),
+            "updated soft constraints should have diversity type of serial");
+        assertThat(generatedSoftConstraints.getDiversity().getServiceIdentifierList(),
+            IsMapContaining.hasKey(new ServiceIdentifierListKey("hard-service 1")));
+        assertThat(generatedSoftConstraints.getDiversity().getServiceIdentifierList(),
+            IsMapContaining.hasKey(new ServiceIdentifierListKey("hard-service 2")));
+        assertThat(generatedSoftConstraints.getDiversity().getServiceIdentifierList(),
+            IsMapContaining.hasKey(new ServiceIdentifierListKey("soft-service 3")));
     }
 
     @Test
-    public void testUpdateSoftConstraintsHardGeneralAndSoftCoRouting() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithGeneral();
-        SoftConstraints initialSoftConstraints = buildSoftConstraintWithCoRouting();
-
-
+    void testUpdateSoftConstraintsForExclude() {
+        HardConstraints initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
-                initialHardConstraints, initialSoftConstraints);
-
-        assertEquals(
-                generatedSoftConstraints.getCustomerCode().get(0),
-                initialHardConstraints.getCustomerCode().get(0));
-        assertTrue(
-                generatedSoftConstraints.getCoRoutingOrGeneral() instanceof  General);
-
-
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getExclude(),
+            "updated soft constraints should contain no exclude constraint");
+
+        initialSoftConstraints = buildSoftConstraint(null, false, null, "link", null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getExclude(), generatedSoftConstraints.getExclude(),
+            "updated soft constraints should not be changed");
+
+        // test addition of hard exclude with fiber list when no soft exclude
+        initialHardConstraints =
+            buildHardConstraint(null, false, null, "fiber1", null, null, false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(generatedSoftConstraints.getExclude(), initialHardConstraints.getExclude(),
+            "updated soft constraints should contain the exclude constraint of hard constraint");
+
+        // test addition of hard exclude with fiber list when existing soft
+        // exclude with fiber list
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, null, "fiber2", null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertThat("updated soft constraints should contain exclude with 3 fiber bundles",
+            generatedSoftConstraints.getExclude().getFiberBundle().size(), is(3));
+        assertThat(generatedSoftConstraints.getExclude().getFiberBundle(),
+            containsInAnyOrder("fiber-1", "fiber-2", "fiber-3"));
+
+        // test addition of hard exclude with link list when no soft exclude
+        initialHardConstraints = buildHardConstraint(null, false, null, "link1", null, null, false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(generatedSoftConstraints.getExclude(), initialHardConstraints.getExclude(),
+            "updated soft constraints should contain the exclude constraint of hard constraint");
+
+        // test addition of hard exclude with link list when existing soft
+        // exclude with link list
+        initialSoftConstraints = buildSoftConstraint(null, false, null, "link2", null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertThat("updated soft constraints should contain exclude with 3 links",
+            generatedSoftConstraints.getExclude().getLinkIdentifier().size(), is(3));
+        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+            .setLinkId("link-id 1").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+            .setLinkId("link-id 2").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+            .setLinkId("link-id 3").setLinkNetworkId("openroadm-topology").build()));
     }
 
-
     @Test
-    public void testUpdateSoftConstraintsHardCoRoutingAndSoftCoGeneral() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithCoRouting();
-        SoftConstraints initialSoftConstraints = buildSoftConstraintWithGeneral();
-
-
+    void testUpdateSoftConstraintsForInclude() {
+        HardConstraints initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
-                initialHardConstraints, initialSoftConstraints);
-
-        assertEquals(
-                generatedSoftConstraints.getCustomerCode().get(0),
-                initialHardConstraints.getCustomerCode().get(0));
-        assertTrue(
-                generatedSoftConstraints.getCoRoutingOrGeneral() instanceof  CoRouting);
-
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getInclude(),
+            "updated soft constraints should contain no include constraint");
+
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, "link", null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getInclude(), generatedSoftConstraints.getInclude(),
+            "updated soft constraints should not be changed");
+
+        // test addition of hard include with fiber list when no soft include
+        initialHardConstraints =
+            buildHardConstraint(null, false, null, null, "fiber1", null, false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(generatedSoftConstraints.getInclude(), initialHardConstraints.getInclude(),
+            "updated soft constraints should contain the include constraint of hard constraint");
+
+        // test addition of hard include with fiber list when existing soft
+        // include with fiber list
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, "fiber2", null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertThat("updated soft constraints should contain exclude with 3 fiber bundles",
+            generatedSoftConstraints.getInclude().getFiberBundle().size(), is(3));
+        assertThat(generatedSoftConstraints.getInclude().getFiberBundle(),
+            containsInAnyOrder("fiber-1", "fiber-2", "fiber-3"));
+
+        // test addition of hard include with link list when no soft include
+        initialHardConstraints = buildHardConstraint(null, false, null, null, "link1", null, false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(generatedSoftConstraints.getInclude(), initialHardConstraints.getInclude(),
+            "updated soft constraints should contain the include constraint of hard constraint");
+
+        // test addition of hard include with link list when existing soft
+        // include with link list
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, "link2", null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertThat("updated soft constraints should contain include with 3 links",
+            generatedSoftConstraints.getInclude().getLinkIdentifier().size(), is(3));
+        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+                .setLinkId("link-id 1").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+                .setLinkId("link-id 2").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+                .setLinkId("link-id 3").setLinkNetworkId("openroadm-topology").build()));
     }
 
     @Test
-    public void testDowngradeHardConstraintsWithHardGeneralConstraintsSuccess() {
+    void testUpdateSoftConstraintsForLatency() {
         HardConstraints initialHardConstraints =
-                buildHardConstraintWithGeneral();
-
-
-        HardConstraints generatedHardConstraints =
-                DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
-
-        assertTrue(generatedHardConstraints.getCoRoutingOrGeneral() instanceof  General);
-
-        assertNotNull((General)generatedHardConstraints.getCoRoutingOrGeneral());
-
-        assertEquals(
-                ((General) generatedHardConstraints.getCoRoutingOrGeneral()).getLatency().getMaxLatency(),
-                ((General) initialHardConstraints.getCoRoutingOrGeneral()).getLatency().getMaxLatency());
-
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getLatency(),
+            "updated soft constraints should contain no latency constraint");
+
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, Double.valueOf(12.2), false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getLatency(), generatedSoftConstraints.getLatency(),
+            "updated soft constraints should not be changed");
+        assertEquals((float) 12.2, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f,
+            "updated soft constraints value should be '12.2'");
+
+        // test addition of hard latency when no soft latency
+        initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, Double.valueOf(16.59), false, false, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals((float) 16.59, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f,
+            "updated soft constraints value should be '16.59'");
+
+        // test addition of hard latency when existing different soft latency
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, Double.valueOf(12.2), false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals((float) 12.2, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f,
+            "updated soft constraints value should be '12.2'");
     }
 
     @Test
-    public void testDowngradeHardConstraintsWithNullGeneralHardConstraints() {
+    void testUpdateSoftConstraintsForDistance() {
         HardConstraints initialHardConstraints =
-                buildHardConstraintWithNullGeneral();
-
-        HardConstraints generatedHardConstraints =
-                DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
-
-        assertNull(generatedHardConstraints.getCoRoutingOrGeneral());
-
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getDistance(),
+            "updated soft constraints should contain no distance constraint");
+
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, "750.2", null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getDistance(), generatedSoftConstraints.getDistance(),
+            "updated soft constraints should not be changed");
+        assertEquals((float) 750.2, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f,
+            "updated soft constraints value should be '750.2'");
+
+        // test addition of hard distance when no soft distance
+        initialHardConstraints = buildHardConstraint(null, false, null, null, null, null, false, false, "555.5", null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals((float) 555.5, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f,
+            "updated soft constraints value should be '555.5'");
+
+        // test addition of hard distance when existing different soft distance
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, "750.2", null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals((float) 555.5, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f,
+            "updated soft constraints value should be '555.5'");
     }
 
     @Test
-    public void testDowngradeHardConstraintsWithHardCoRoutingConstraints() {
+    void testUpdateSoftConstraintsForHopCountAndTEmetric() {
         HardConstraints initialHardConstraints =
-                buildHardConstraintWithCoRouting();
-
-        HardConstraints generatedHardConstraints =
-                DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
-
-        assertNull(generatedHardConstraints.getCoRoutingOrGeneral());
-
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getHopCount(),
+            "updated soft constraints should contain no hop-count constraint");
+
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, true, true, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getHopCount(), generatedSoftConstraints.getHopCount(),
+            "updated soft constraints should not be changed");
+        assertEquals(3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue(),
+            "updated soft constraints max-wdm-hop-count should be '3'");
+        assertEquals(5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue(),
+            "updated soft constraints max-otn-hop-count should be '5'");
+        assertEquals(8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue(),
+            "updated soft constraints max-wdm-TE-metric should be '8'");
+        assertEquals(11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue(),
+            "updated soft constraints max-otn-TE-metric should be '11'");
+
+        // test addition of hard hop-count when no soft hop-count
+        initialHardConstraints = buildHardConstraint(null, false, null, null, null, null, true, true, null, null);
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialHardConstraints.getHopCount(), generatedSoftConstraints.getHopCount(),
+            "updated soft constraints should contain hard constraint");
+        assertEquals(3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue(),
+            "updated soft constraints max-wdm-hop-count should be '3'");
+        assertEquals(5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue(),
+            "updated soft constraints max-otn-hop-count should be '5'");
+        assertEquals(8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue(),
+            "updated soft constraints max-wdm-TE-metric should be '8'");
+        assertEquals(11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue(),
+            "updated soft constraints max-otn-TE-metric should be '11'");
+
+        // test addition of hard hop-count when existing soft hop-count
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, true, true, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue(),
+            "updated soft constraints max-wdm-hop-count should be '3'");
+        assertEquals(5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue(),
+            "updated soft constraints max-otn-hop-count should be '5'");
+        assertEquals(8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue(),
+            "updated soft constraints max-wdm-TE-metric should be '8'");
+        assertEquals(11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue(),
+            "updated soft constraints max-otn-TE-metric should be '11'");
     }
 
-
     @Test
-    public void testConvertToSoftConstraintsFromGeneralHardSuccess() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithGeneral();
-
-
-        SoftConstraints generatedSoftConstraints =
-                DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
-
-        assertEquals(
-                generatedSoftConstraints.getCustomerCode().get(0),
-                initialHardConstraints.getCustomerCode().get(0));
-        assertTrue(
-                generatedSoftConstraints.getCoRoutingOrGeneral() instanceof  General);
-
-        assertEquals(
-                ((General)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getDiversity().getExistingService().get(0),
-                ((General)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getDiversity().getExistingService().get(0));
-
+    void testUpdateSoftConstraintsForCoRouting() {
+        HardConstraints initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertNull(generatedSoftConstraints.getCoRouting(),
+            "updated soft constraints should contain no co-routing constraint");
+
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, true, false, null, "coRouting1");
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialSoftConstraints.getCoRouting(), generatedSoftConstraints.getCoRouting(),
+            "updated soft constraints should not be changed");
+        assertEquals(2, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size(),
+            "updated soft constraints should contain 2 co-routed services");
+        assertTrue(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                    .routing.ServiceIdentifierListKey("service 1"))
+            .getServiceApplicability().getEquipment().getRoadmSrg());
+        assertNull(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 1"))
+            .getServiceApplicability().getLink());
+        assertNull(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 2"))
+            .getServiceApplicability().getEquipment());
+        assertTrue(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                    .routing.ServiceIdentifierListKey("service 2"))
+            .getServiceApplicability().getLink());
+
+        // test addition of hard co-routing when no soft co-routing
+        initialHardConstraints =
+            buildHardConstraint(null, false, null, null, null, null, true, false, null, "coRouting2");
+        initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(initialHardConstraints.getCoRouting(), generatedSoftConstraints.getCoRouting(),
+            "updated soft constraints should contain hard constraint");
+        assertEquals(1, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size(),
+            "updated soft constraints should contain 1 co-routed service");
+        assertTrue(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 3"))
+            .getServiceApplicability().getSite());
+        assertNull(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 3"))
+            .getServiceApplicability().getLink());
+
+        // test addition of hard hop-count when existing soft hop-count
+        initialSoftConstraints =
+            buildSoftConstraint(null, false, null, null, null, null, true, false, null, "coRouting1");
+        generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
+            initialHardConstraints, initialSoftConstraints);
+        assertEquals(3, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size(),
+            "updated soft constraints should contain 3 co-routed service");
+        assertThat(generatedSoftConstraints.getCoRouting().getServiceIdentifierList(),
+            IsMapContaining.hasKey(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 1")));
+        assertThat(generatedSoftConstraints.getCoRouting().getServiceIdentifierList(),
+            IsMapContaining.hasKey(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 2")));
+        assertThat(generatedSoftConstraints.getCoRouting().getServiceIdentifierList(),
+            IsMapContaining.hasKey(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
+                        .routing.ServiceIdentifierListKey("service 3")));
     }
 
     @Test
-    public void testConvertToSoftConstraintsFromCoRoutingHardSuccess() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithCoRouting();
-
-
-        SoftConstraints generatedSoftConstraints =
-                DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
-
-        assertEquals(
-                generatedSoftConstraints.getCustomerCode().get(0),
-                initialHardConstraints.getCustomerCode().get(0));
-        assertTrue(
-                generatedSoftConstraints.getCoRoutingOrGeneral() instanceof  CoRouting);
-
-        assertEquals(
-                ((CoRouting)generatedSoftConstraints.getCoRoutingOrGeneral())
-                        .getCoRouting().getExistingService().get(0),
-                ((CoRouting)initialHardConstraints.getCoRoutingOrGeneral())
-                        .getCoRouting().getExistingService().get(0));
-
+    void testDowngradeHardConstraints() {
+        HardConstraints initialHardConstraints = null;
+        HardConstraints genHardConstraints = DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
+        assertNotNull(genHardConstraints, "generated hard-constraints should be empty, not null");
+        initialHardConstraints = new HardConstraintsBuilder().build();
+        genHardConstraints = DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
+        assertNotNull(genHardConstraints, "generated hard-constraints should be empty, not null");
+        initialHardConstraints = buildHardConstraint(null, false, null, "link1", null, Double.valueOf(12.8), false,
+            false, null, null);
+        genHardConstraints = DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
+        assertEquals((long) 12.8, genHardConstraints.getLatency().getMaxLatency().longValue(),
+            "Latency value should be 12.8");
+        assertNull(genHardConstraints.getCoRouting(),
+            "generated hard constraints should only contain max-latency value");
+        assertNull(genHardConstraints.getExclude(), "generated hard constraints should only contain max-latency value");
+        assertNull(genHardConstraints.getInclude(), "generated hard constraints should only contain max-latency value");
     }
 
     @Test
-    public void testConvertToSoftConstraintsFromHardNull() {
-        HardConstraints initialHardConstraints = buildHardConstraintWithNullGeneral();
-
-        SoftConstraints generatedSoftConstraints =
-                DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
-
-        assertNull(generatedSoftConstraints.getCoRoutingOrGeneral());
-
+    void testConvertToSoftConstraints() {
+        HardConstraints initialHardConstraints = null;
+        SoftConstraints genSoftConstraints = DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
+        assertNotNull(genSoftConstraints, "generated soft constraints should never be null");
+        assertNull(genSoftConstraints.getExclude(), "generated soft constraints should be empty");
+        assertNull(genSoftConstraints.getCoRouting(), "generated soft constraints should be empty");
+        assertNull(genSoftConstraints.getLatency(), "generated soft constraints should be empty");
+
+        Set<String> hardCustomerCode = Set.of("customer-code 1", "customer-code 2");
+        initialHardConstraints =
+            buildHardConstraint(hardCustomerCode, false, null, "link1", "node", null, false, false, null, null);
+        genSoftConstraints = DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
+        assertEquals(2, genSoftConstraints.getCustomerCode().size(),
+            "generated soft constraints should contain customer-code items");
+        assertTrue(genSoftConstraints.getCustomerCode().contains("customer-code 1"));
+        assertTrue(genSoftConstraints.getCustomerCode().contains("customer-code 2"));
+        assertNotNull(genSoftConstraints.getExclude(), "generated soft constraints should contain exclude constraint");
+        assertEquals(1, genSoftConstraints.getExclude().getLinkIdentifier().size(),
+            "generated soft constraints should contain exclude constraint with one link-id");
+        assertEquals("link-id 1",
+            genSoftConstraints.getExclude().getLinkIdentifier().stream().findAny().orElseThrow().getLinkId());
+        assertEquals("openroadm-topology",
+            genSoftConstraints.getExclude().getLinkIdentifier().stream().findAny().orElseThrow()
+                .getLinkNetworkId());
+        assertNotNull(genSoftConstraints.getInclude(), "generated soft constraints should contain include constraint");
+        assertEquals(2, genSoftConstraints.getInclude().getNodeId().size(),
+            "generated soft constraints should contain include constraint with two node-id");
+        assertTrue(genSoftConstraints.getInclude().getNodeId().contains(new NodeIdType("node-id-1")));
+        assertTrue(genSoftConstraints.getInclude().getNodeId().contains(new NodeIdType("node-id-3")));
+        assertNull(genSoftConstraints.getLatency(),
+            "generated soft constraints should not contain any latency constraint");
+        assertNull(genSoftConstraints.getDistance(),
+            "generated soft constraints should not contain any max-distance constraint");
+        assertNull(genSoftConstraints.getCoRouting(),
+            "generated soft constraints should not contain any co-routing constraint");
     }
-
 }