Allow vLB to check multiple vDNSs 53/37253/1
authorMarco Platania <platania@research.att.com>
Tue, 20 Mar 2018 21:09:13 +0000 (17:09 -0400)
committerMarco Platania <platania@research.att.com>
Tue, 20 Mar 2018 21:09:13 +0000 (17:09 -0400)
Modify the health check plugin to allow the vLB to run health check against multiple vDNS instances

Change-Id: Ia0d577750378f5c7631be88be85b42d090a71289
Issue-ID: INT-433
Signed-off-by: Marco Platania <platania@research.att.com>
vnfs/vLBMS/apis/health-vnf-onap-plugin/health-vnf-onap-plugin-impl/pom.xml
vnfs/vLBMS/apis/health-vnf-onap-plugin/health-vnf-onap-plugin-impl/src/main/java/org/onap/vnf/health/read/ElementStateCustomizer.java
vnfs/vLBMS/apis/vlb-business-vnf-onap-plugin/vlb-business-vnf-onap-plugin-api/src/main/yang/vlb-business-vnf-onap-plugin.yang
vnfs/vLBMS/apis/vlb-business-vnf-onap-plugin/vlb-business-vnf-onap-plugin-impl/src/main/java/org/onap/vnf/vlb/ElementCrudService.java
vnfs/vLBMS/apis/vlb-business-vnf-onap-plugin/vlb-business-vnf-onap-plugin-impl/src/main/java/org/onap/vnf/vlb/write/DnsInstanceManager.java
vnfs/vLBMS/apis/vlb-business-vnf-onap-plugin/vlb-business-vnf-onap-plugin-impl/src/main/java/org/onap/vnf/vlb/write/ElementCustomizer.java

index d53b137..4735133 100644 (file)
             <version>${project.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.onap.demo.vnf.vlb</groupId>
+            <artifactId>vlb-business-vnf-onap-plugin-impl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
         <!-- Honeycomb infrastructure-->
         <dependency>
             <groupId>io.fd.honeycomb</groupId>
index 5486928..15d0c22 100644 (file)
@@ -23,6 +23,9 @@ package org.onap.vnf.health.read;
 import org.onap.vnf.health.CrudService;
 import org.onap.vnf.health.RESTManager;
 import org.onap.vnf.health.RESTManager.Pair;
+import org.onap.vnf.vlb.write.DnsInstanceManager;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vlb.business.vnf.onap.plugin.rev160918.vlb.business.vnf.onap.plugin.params.vdns.instances.VdnsInstance;
 
 import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.read.ReadFailedException;
@@ -38,6 +41,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -66,15 +70,18 @@ import org.slf4j.LoggerFactory;
 public final class ElementStateCustomizer implements InitializingReaderCustomizer<HealthCheck, HealthCheckBuilder> {
 
     private final CrudService<HealthCheck> crudService;
+    private DnsInstanceManager dnsInstanceManager;
     private static final Logger LOG = LoggerFactory.getLogger(ElementStateCustomizer.class);
     private final String SCRIPT;
     private final String OUTPUT;
     private final String VNFC;
     private final Boolean PRIMARY;
     private static SimpleDateFormat SDF;
+    private String vPktGenIp;
 
     public ElementStateCustomizer(final CrudService<HealthCheck> crudService) throws IOException {
         this.crudService = crudService;
+        dnsInstanceManager = DnsInstanceManager.getInstance();
 
         // initialize data format
         SDF = new SimpleDateFormat("MM-dd-yyyy:HH.mm.ss");
@@ -89,6 +96,10 @@ public final class ElementStateCustomizer implements InitializingReaderCustomize
                VNFC = prop.getProperty("vnfc");
                PRIMARY = Boolean.parseBoolean(prop.getProperty("primary"));
        prop_file.close();
+
+       if(PRIMARY) {
+               vPktGenIp = readFromFile("/opt/config/oam_vpktgen_ip.txt");
+       }
     }
     
     @Override
@@ -110,18 +121,6 @@ public final class ElementStateCustomizer implements InitializingReaderCustomize
                                       @Nonnull final HealthCheckBuilder builder,
                                       @Nonnull final ReadContext ctx) throws ReadFailedException {
 
-       List<String> ipAddr = new ArrayList<String>();
-       if(PRIMARY) {
-               String ret = readFromFile("/opt/config/oam_vpktgen_ip.txt");
-               if(ret != null) {
-                       ipAddr.add(ret);
-               }
-               ret = readFromFile("/opt/config/oam_vdns_ip.txt");
-               if(ret != null) {
-                       ipAddr.add(ret);
-               }
-       }
-
        // assess the health status of the local service (try at most three times, otherwise return an error).
        String healthStatus;
        String [] cmdArgs = {"/bin/bash", "-c", SCRIPT};
@@ -157,13 +156,20 @@ public final class ElementStateCustomizer implements InitializingReaderCustomize
                LOG.info("Failed to assess the health status of the local component. Return status = \"unhealthy\"");
        }
 
-        // perform read of details of data specified by key of Element in id
-        // final HealthCheck data = crudService.readSpecific(id);
-
        // check the status of other VNF components, if any
        if(PRIMARY) {
-               for(int i = 0; i < ipAddr.size(); i++) {
-                       if(!getRemoteVnfcHealthStatus(ipAddr.get(i))) {
+               // check the vPacketGenerator first
+               if(vPktGenIp != null) {
+                       if(!getRemoteVnfcHealthStatus(vPktGenIp)) {
+                               healthStatus = "unhealthy";
+                       }
+               }
+
+               // check all the vDNS instances
+               Map<String, VdnsInstance> activeVdnsInstances = dnsInstanceManager.getDnsInstancesAsMap();
+               Iterator<String> iter = activeVdnsInstances.keySet().iterator();
+               while(iter.hasNext()){
+                       if(!getRemoteVnfcHealthStatus(activeVdnsInstances.get(iter.next()).getOamIpAddr())) {
                                healthStatus = "unhealthy";
                        }
                }
index 229ad7a..583f87e 100644 (file)
@@ -33,21 +33,6 @@ module vlb-business-vnf-onap-plugin {
         // curl -u admin:admin  http://localhost:8181/restconf/operational/vlb-business-vnf-onap-plugin:vlb-business-vnf-onap-plugin-state
     }
 
-//    grouping vlb-business-vnf-onap-plugin-params {
-//        list element {
-//
-//            key id;
-//            leaf id {
-//                type uint32;
-//            }
-//
-//            leaf description {
-//                type string;
-//            }
-//        }
-//    }
-
-
     grouping vlb-business-vnf-onap-plugin-params {
         container vdns-instances {
             list vdns-instance {
@@ -57,7 +42,11 @@ module vlb-business-vnf-onap-plugin {
                     type string;
                 }
 
-                leaf is-enabled {
+                leaf oam-ip-addr {
+                       type string;
+                }
+
+                leaf enabled {
                     type boolean;
                 }
             }
index d17c6c1..2a92603 100644 (file)
  * limitations under the License.
  */
 
+ /*
+ * Modifications copyright (c) 2018 AT&T Intellectual Property
+ */
+
 package org.onap.vnf.vlb;
 
 import io.fd.honeycomb.translate.read.ReadFailedException;
@@ -101,7 +105,8 @@ final class ElementCrudService implements CrudService<VdnsInstance> {
         return new VdnsInstanceBuilder()
                 .setIpAddr(key.getIpAddr())
                 .setKey(key)
-                .setIsEnabled(true)
+                .setOamIpAddr("10.0.80.0")
+                .setEnabled(true)
                 .build();
     }
 
index dc3e924..3740076 100644 (file)
@@ -22,6 +22,8 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vlb.business.vnf.onap.plugin.rev160918.vlb.business.vnf.onap.plugin.params.vdns.instances.VdnsInstance;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,26 +49,40 @@ import org.slf4j.LoggerFactory;
 
 public class DnsInstanceManager {
 
+       private static DnsInstanceManager thisInstance = null;
        private static final Logger LOG = LoggerFactory.getLogger(DnsInstanceManager.class);
-       private Map<String, Boolean> dnsInstances = new HashMap<String, Boolean>();
+       private Map<String, VdnsInstance> dnsInstances = new HashMap<String, VdnsInstance>();
 
        /*
         * Add a new DNS instance to the map and create a GRE tunnel 
         * towards that instance if isEnabled is set to true.
         */
-       void addDnsInstance(String ipAddr, Boolean isEnabled) {
+
+       public static DnsInstanceManager getInstance() {
+               if(thisInstance == null) {
+                       thisInstance = new DnsInstanceManager();
+               }
+
+               return thisInstance;
+       }
+
+       private DnsInstanceManager() {
+
+       }
+
+       void addDnsInstance(String ipAddr, VdnsInstance data) {
                // Call updateDnsInstance in case the DNS instance already exists.
                // This is somewhat redundant because Honeycomb already runs this check.
                if(dnsInstances.containsKey(ipAddr)) {
-                       updateDnsInstance(ipAddr, isEnabled);
+                       updateDnsInstance(ipAddr, data);
                        return;
                }
 
-               dnsInstances.put(ipAddr, isEnabled);
-               LOG.debug("DNS instance " + ipAddr + " with status isEnabled=" + isEnabled + " has been added.");
+               dnsInstances.put(ipAddr, data);
+               LOG.debug("DNS instance " + ipAddr + " with status isEnabled=" + data.isEnabled() + " has been added.");
 
                // Create a GRE tunnel towards the new DNS instance if isEnabled is true.
-               if(isEnabled) {
+               if(data.isEnabled()) {
                        addGreTunnel(ipAddr);
                }
        }
@@ -75,14 +91,15 @@ public class DnsInstanceManager {
         * Update an existing DNS instance and create or remove a GRE
         * tunnel based on the current value of the isEnabled flag.
         */
-       void updateDnsInstance(String ipAddr, Boolean isEnabled) {
+       void updateDnsInstance(String ipAddr, VdnsInstance data) {
                // This is somewhat redundant because Honeycomb already runs this check.
-               if(dnsInstances.get(ipAddr) == isEnabled) {
+               boolean isEnabled = data.isEnabled();
+               if(dnsInstances.get(ipAddr).isEnabled() == isEnabled) {
                        LOG.debug("DNS instance " + ipAddr + " with status isEnabled=" + isEnabled + " already exists. No update is necessary.");
                        return;
                }
 
-               dnsInstances.put(ipAddr, isEnabled);
+               dnsInstances.put(ipAddr, data);
                LOG.debug("DNS instance " + ipAddr + " has been updated with status isEnabled=" + isEnabled + ".");
 
                if(isEnabled) {
@@ -105,7 +122,7 @@ public class DnsInstanceManager {
                }
 
                // Remove a GRE tunnel towards this DNS instance if it exists.
-               if(dnsInstances.get(ipAddr)) {
+               if(dnsInstances.get(ipAddr).isEnabled()) {
                        deleteGreTunnel(ipAddr);
                }
 
@@ -139,4 +156,11 @@ public class DnsInstanceManager {
                        e.printStackTrace();
                }
        }
-}
+
+       /*
+        * Auxiliary function that returns vDNS instances as map.
+        */
+       public Map<String, VdnsInstance> getDnsInstancesAsMap() {
+               return dnsInstances;
+       }
+}
\ No newline at end of file
index d8da0b5..10457a6 100644 (file)
  * limitations under the License.
  */
 
+ /*
+ * Modifications copyright (c) 2018 AT&T Intellectual Property
+ */
+
 package org.onap.vnf.vlb.write;
 
 import org.onap.vnf.vlb.CrudService;
@@ -24,8 +28,6 @@ import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vlb.business.vnf.onap.plugin.rev160918.vlb.business.vnf.onap.plugin.params.vdns.instances.VdnsInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vlb.business.vnf.onap.plugin.rev160918.vlb.business.vnf.onap.plugin.params.vdns.instances.VdnsInstanceKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Writer for {@link Element} list node from our YANG model.
@@ -34,11 +36,10 @@ public final class ElementCustomizer implements ListWriterCustomizer<VdnsInstanc
 
     private final CrudService<VdnsInstance> crudService;
     private DnsInstanceManager dnsInstanceManager;
-    private static final Logger LOG = LoggerFactory.getLogger(ElementCustomizer.class);
 
     public ElementCustomizer(@Nonnull final CrudService<VdnsInstance> crudService) {
         this.crudService = crudService;
-        dnsInstanceManager = new DnsInstanceManager();
+        dnsInstanceManager = DnsInstanceManager.getInstance();
     }
 
     @Override
@@ -47,7 +48,7 @@ public final class ElementCustomizer implements ListWriterCustomizer<VdnsInstanc
         //perform write of data,or throw exception
         //invoked by PUT operation,if provided data doesn't exist in Config data
         crudService.writeData(id, dataAfter);
-        dnsInstanceManager.addDnsInstance(dataAfter.getIpAddr(), dataAfter.isIsEnabled());
+        dnsInstanceManager.addDnsInstance(dataAfter.getIpAddr(), dataAfter);
     }
 
     @Override
@@ -58,7 +59,7 @@ public final class ElementCustomizer implements ListWriterCustomizer<VdnsInstanc
         //perform update of data,or throw exception
         //invoked by PUT operation,if provided data does exist in Config data
         crudService.updateData(id, dataBefore, dataAfter);
-        dnsInstanceManager.updateDnsInstance(dataAfter.getIpAddr(), dataAfter.isIsEnabled());
+        dnsInstanceManager.updateDnsInstance(dataAfter.getIpAddr(), dataAfter);
     }
 
     @Override