aboutsummaryrefslogtreecommitdiffstats
path: root/vnfs/VESreporting_vLB
diff options
context:
space:
mode:
Diffstat (limited to 'vnfs/VESreporting_vLB')
-rw-r--r--vnfs/VESreporting_vLB/LICENSE.TXT22
-rw-r--r--vnfs/VESreporting_vLB/Makefile41
-rw-r--r--vnfs/VESreporting_vLB/README.md25
-rw-r--r--vnfs/VESreporting_vLB/dep.xml25
-rwxr-xr-xvnfs/VESreporting_vLB/go-client.sh6
-rw-r--r--vnfs/VESreporting_vLB/pom.xml55
-rw-r--r--vnfs/VESreporting_vLB/vpp_measurement_reporter.c246
7 files changed, 420 insertions, 0 deletions
diff --git a/vnfs/VESreporting_vLB/LICENSE.TXT b/vnfs/VESreporting_vLB/LICENSE.TXT
new file mode 100644
index 00000000..ae12da20
--- /dev/null
+++ b/vnfs/VESreporting_vLB/LICENSE.TXT
@@ -0,0 +1,22 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
diff --git a/vnfs/VESreporting_vLB/Makefile b/vnfs/VESreporting_vLB/Makefile
new file mode 100644
index 00000000..094adabe
--- /dev/null
+++ b/vnfs/VESreporting_vLB/Makefile
@@ -0,0 +1,41 @@
+
+#############################################################################
+#
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#############################################################################
+
+CC=gcc
+
+ARCH=$(shell getconf LONG_BIT)
+CODE_ROOT=$(CURDIR)/../../..
+LIBS_DIR=$(CODE_ROOT)/libs/x86_$(ARCH)
+INCLUDE_DIR=$(CODE_ROOT)/code/evel_library
+
+#******************************************************************************
+# Standard compiler flags. *
+#******************************************************************************
+CPPFLAGS=
+CFLAGS=-Wall -g -fPIC
+
+all: vpp_measurement_reporter
+
+clean:
+ rm -f vpp_measurement_reporter
+
+vpp_measurement_reporter: vpp_measurement_reporter.c
+ $(CC) $(CPPFLAGS) $(CFLAGS) -o vpp_measurement_reporter \
+ -L $(LIBS_DIR) \
+ -I $(INCLUDE_DIR) \
+ vpp_measurement_reporter.c -lm -lpthread -level -lcurl
diff --git a/vnfs/VESreporting_vLB/README.md b/vnfs/VESreporting_vLB/README.md
new file mode 100644
index 00000000..dc47e62f
--- /dev/null
+++ b/vnfs/VESreporting_vLB/README.md
@@ -0,0 +1,25 @@
+
+PROJECT DESCRIPTION
+---
+This project contains the source code and scripts for the periodic generation of network measurement reports. The folder contains:
+
+ - README.md: this file.
+
+ - LICENSE.TXT: the license text.
+
+ - vpp_measurement_reporter.c: source code that uses the ECOMP Vendor Event Listener Library (VES) to read metrics from the network interface and send periodic measurement reports to the VES collector in DCAE. The VES library used here has been cloned from the GitHub repository at https://github.com/att/evel-library on February 1, 2017.
+
+ - Makefile: makefile that compiles vpp_measurement_reporter.c and generates vpp_measurement_reporter binary.
+
+ - go-client.sh: bash script that starts up the vpp_measurement_reporter binary generated by Makefile. It reads input parameters like DCAE IP address and port from configuration files contained in /opt/config.
+
+
+USAGE
+---
+To run the vpp_measurement_reporter, please execute the following steps:
+
+ - Make the go-client.sh script executable
+ chmod +x go-client.sh
+
+ - Run the go-client.sh script
+ ./go-client.sh
diff --git a/vnfs/VESreporting_vLB/dep.xml b/vnfs/VESreporting_vLB/dep.xml
new file mode 100644
index 00000000..fc18229f
--- /dev/null
+++ b/vnfs/VESreporting_vLB/dep.xml
@@ -0,0 +1,25 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+ <id>demo</id>
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <fileSets>
+
+ <fileSet>
+ <directory>.</directory>
+ <outputDirectory>/</outputDirectory>
+ <includes>
+ <include>*.sh</include>
+ <include>*.md</include>
+ <include>*.TXT</include>
+ <include>*.c</include>
+ <include>Makefile</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+</assembly>
+
+
diff --git a/vnfs/VESreporting_vLB/go-client.sh b/vnfs/VESreporting_vLB/go-client.sh
new file mode 100755
index 00000000..3d1b159a
--- /dev/null
+++ b/vnfs/VESreporting_vLB/go-client.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+export LD_LIBRARY_PATH="/opt/VES/libs/x86_64/"
+DCAE_COLLECTOR_IP=$(cat /opt/config/dcae_collector_ip.txt)
+DCAE_COLLECTOR_PORT=$(cat /opt/config/dcae_collector_port.txt)
+./vpp_measurement_reporter $DCAE_COLLECTOR_IP $DCAE_COLLECTOR_PORT eth1
diff --git a/vnfs/VESreporting_vLB/pom.xml b/vnfs/VESreporting_vLB/pom.xml
new file mode 100644
index 00000000..04783951
--- /dev/null
+++ b/vnfs/VESreporting_vLB/pom.xml
@@ -0,0 +1,55 @@
+<!--<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">-->
+<project>
+<parent>
+ <groupId>org.openecomp.demo.vnf</groupId>
+ <artifactId>demo-aggregator</artifactId>
+ <version>1.0.0</version>
+<relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.openecomp.demo.vnf.ves</groupId>
+ <artifactId>ves_vlb_reporting</artifactId>
+ <!-- <name>vfw_pg_streams</name>-->
+ <version>1.0.0</version>
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>default-jar</id>
+ <phase>never</phase>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.5.3</version>
+ <configuration>
+ <descriptor>dep.xml</descriptor>
+ </configuration>
+ <executions>
+ <execution>
+ <id>create-archive</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+<plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <configuration>
+ <skip>false</skip>
+ </configuration>
+</plugin>
+
+ </plugins>
+ </build>
+
+</project>
diff --git a/vnfs/VESreporting_vLB/vpp_measurement_reporter.c b/vnfs/VESreporting_vLB/vpp_measurement_reporter.c
new file mode 100644
index 00000000..1a1e7ac8
--- /dev/null
+++ b/vnfs/VESreporting_vLB/vpp_measurement_reporter.c
@@ -0,0 +1,246 @@
+
+/*************************************************************************//**
+ *
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/time.h>
+#include <math.h>
+
+#include "evel.h"
+
+#define BUFSIZE 128
+#define READ_INTERVAL 10
+
+typedef struct dummy_vpp_metrics_struct {
+ int bytes_in;
+ int bytes_out;
+ int packets_in;
+ int packets_out;
+} vpp_metrics_struct;
+
+void read_vpp_metrics(vpp_metrics_struct *, char *);
+
+int main(int argc, char** argv)
+{
+ EVEL_ERR_CODES evel_rc = EVEL_SUCCESS;
+ EVENT_MEASUREMENT* vpp_m = NULL;
+ EVENT_HEADER* vpp_m_header = NULL;
+ int bytes_in_this_round;
+ int bytes_out_this_round;
+ int packets_in_this_round;
+ int packets_out_this_round;
+ vpp_metrics_struct* last_vpp_metrics = malloc(sizeof(vpp_metrics_struct));
+ vpp_metrics_struct* curr_vpp_metrics = malloc(sizeof(vpp_metrics_struct));
+ struct timeval time_val;
+ time_t start_epoch;
+ time_t last_epoch;
+ char hostname[BUFSIZE];
+ char* fqdn = argv[1];
+ int port = atoi(argv[2]);
+ char* vnic = argv[3];
+
+ printf("\nVector Packet Processing (VPP) measurement collection\n");
+ fflush(stdout);
+
+ if (argc != 4)
+ {
+ fprintf(stderr, "Usage: %s <FQDN>|<IP address> <port> <interface>\n", argv[0]);
+ exit(-1);
+ }
+
+ /**************************************************************************/
+ /* Initialize */
+ /**************************************************************************/
+ if(evel_initialize(fqdn, /* FQDN */
+ port, /* Port */
+ NULL, /* optional path */
+ NULL, /* optional topic */
+ 0, /* HTTPS? */
+ "", /* Username */
+ "", /* Password */
+ EVEL_SOURCE_VIRTUAL_MACHINE, /* Source type */
+ "vLoadBalancer", /* Role */
+ 1)) /* Verbosity */
+ {
+ fprintf(stderr, "\nFailed to initialize the EVEL library!!!\n");
+ exit(-1);
+ }
+ else
+ {
+ printf("\nInitialization completed\n");
+ }
+
+ gethostname(hostname, BUFSIZE);
+ memset(last_vpp_metrics, 0, sizeof(vpp_metrics_struct));
+ read_vpp_metrics(last_vpp_metrics, vnic);
+ gettimeofday(&time_val, NULL);
+ start_epoch = time_val.tv_sec * 1000000 + time_val.tv_usec;
+ sleep(READ_INTERVAL);
+
+ /***************************************************************************/
+ /* Collect metrics from the VNIC */
+ /***************************************************************************/
+ while(1) {
+ // Read the number of vDNSs currently active
+ int active_dns = 0;
+ FILE* fd = fopen("active_dns.txt", "r");
+ while(!feof(fd)) {
+ if(fscanf(fd, "%d", &active_dns) != 1) /* Avoid infinite loops if the file doesn't contain exactly one number */
+ break;
+ }
+
+ if(fclose(fd)) {
+ printf("Error when closing file\n");
+ return 1;
+ }
+
+ memset(curr_vpp_metrics, 0, sizeof(vpp_metrics_struct));
+ read_vpp_metrics(curr_vpp_metrics, vnic);
+
+ if(active_dns > 0 && (curr_vpp_metrics->bytes_in - last_vpp_metrics->bytes_in > 0)) {
+ bytes_in_this_round = (int) round((curr_vpp_metrics->bytes_in - last_vpp_metrics->bytes_in) / active_dns);
+ }
+ else {
+ bytes_in_this_round = 0;
+ }
+ if(active_dns > 0 && (curr_vpp_metrics->bytes_out - last_vpp_metrics->bytes_out > 0)) {
+ bytes_out_this_round = (int) round((curr_vpp_metrics->bytes_out - last_vpp_metrics->bytes_out) / active_dns);
+ }
+ else {
+ bytes_out_this_round = 0;
+ }
+ if(active_dns > 0 && (curr_vpp_metrics->packets_in - last_vpp_metrics->packets_in > 0)) {
+ packets_in_this_round = (int) round((curr_vpp_metrics->packets_in - last_vpp_metrics->packets_in) / active_dns);
+ }
+ else {
+ packets_in_this_round = 0;
+ }
+ if(active_dns > 0 && (curr_vpp_metrics->packets_out - last_vpp_metrics->packets_out > 0)) {
+ packets_out_this_round = (int) round((curr_vpp_metrics->packets_out - last_vpp_metrics->packets_out) / active_dns);
+ }
+ else {
+ packets_out_this_round = 0;
+ }
+
+ vpp_m = evel_new_measurement(READ_INTERVAL);
+
+ if(vpp_m != NULL) {
+ printf("New measurement report created...\n");
+ evel_measurement_vnic_use_add(vpp_m, /* Pointer to the measurement */
+ vnic, /* ASCII string with the vNIC's ID */
+ packets_in_this_round, /* Packets received */
+ packets_out_this_round, /* Packets transmitted */
+ 0, /* Broadcast packets received */
+ 0, /* Broadcast packets transmitted */
+ bytes_in_this_round, /* Total bytes received */
+ bytes_out_this_round, /* Total bytes transmitted */
+ 0, /* Multicast packets received */
+ 0, /* Multicast packets transmitted */
+ 0, /* Unicast packets received */
+ 0); /* Unicast packets transmitted */
+
+ /***************************************************************************/
+ /* Set parameters in the MEASUREMENT header packet */
+ /***************************************************************************/
+ last_epoch = start_epoch + READ_INTERVAL * 1000000;
+ vpp_m_header = (EVENT_HEADER *)vpp_m;
+ vpp_m_header->start_epoch_microsec = start_epoch;
+ vpp_m_header->last_epoch_microsec = last_epoch;
+ strcpy(vpp_m_header->reporting_entity_id.value, "No UUID available");
+ strcpy(vpp_m_header->reporting_entity_name, hostname);
+ evel_rc = evel_post_event(vpp_m_header);
+
+ if(evel_rc == EVEL_SUCCESS) {
+ printf("Measurement report correctly sent to the collector!\n");
+ }
+ else {
+ printf("Post failed %d (%s)\n", evel_rc, evel_error_string());
+ }
+ }
+ else {
+ printf("New measurement report failed (%s)\n", evel_error_string());
+ }
+
+ last_vpp_metrics->bytes_in = curr_vpp_metrics->bytes_in;
+ last_vpp_metrics->bytes_out = curr_vpp_metrics->bytes_out;
+ last_vpp_metrics->packets_in = curr_vpp_metrics->packets_in;
+ last_vpp_metrics->packets_out = curr_vpp_metrics->packets_out;
+ gettimeofday(&time_val, NULL);
+ start_epoch = time_val.tv_sec * 1000000 + time_val.tv_usec;
+
+ sleep(READ_INTERVAL);
+ }
+
+ /***************************************************************************/
+ /* Terminate */
+ /***************************************************************************/
+ sleep(1);
+ free(last_vpp_metrics);
+ free(curr_vpp_metrics);
+ evel_terminate();
+ printf("Terminated\n");
+
+ return 0;
+}
+
+void read_vpp_metrics(vpp_metrics_struct *vpp_metrics, char *vnic) {
+ // Define an array of char that contains the parameters of the unix 'cut' command
+ char* params[] = {"-f3", "-f11", "-f4", "-f12"};
+ // Define the unix command to execute in order to read metrics from the vNIC
+ char* cmd_prefix = "sudo cat /proc/net/dev | grep \"";
+ char* cmd_mid = "\" | tr -s \' \' | cut -d\' \' ";
+ char cmd[BUFSIZE];
+ // Define other variables
+ char buf[BUFSIZE]; /* buffer used to store VPP metrics */
+ int temp[] = {0, 0, 0, 0}; /* temp array that contains VPP values */
+ FILE *fp; /* file descriptor to pipe cmd to shell */
+ int i;
+
+ for(i = 0; i < 4; i++) {
+ // Clear buffers
+ memset(buf, 0, BUFSIZE);
+ memset(cmd, 0, BUFSIZE);
+ // Build shell command to read metrics from the vNIC
+ strcat(cmd, cmd_prefix);
+ strcat(cmd, vnic);
+ strcat(cmd, cmd_mid);
+ strcat(cmd, params[i]);
+
+ // Open a pipe and read VPP values
+ if ((fp = popen(cmd, "r")) == NULL) {
+ printf("Error opening pipe!\n");
+ return;
+ }
+
+ while (fgets(buf, BUFSIZE, fp) != NULL);
+ temp[i] = atoi(buf);
+
+ if(pclose(fp)) {
+ printf("Command not found or exited with error status\n");
+ return;
+ }
+ }
+
+ // Store metrics read from the vNIC in the struct passed from the main function
+ vpp_metrics->bytes_in = temp[0];
+ vpp_metrics->bytes_out = temp[1];
+ vpp_metrics->packets_in = temp[2];
+ vpp_metrics->packets_out = temp[3];
+}