From 3426556541256f93d2cba65df3b9c8d1d1772861 Mon Sep 17 00:00:00 2001 From: platania Date: Thu, 16 Feb 2017 11:20:22 -0500 Subject: Initial OpenECOMP Demo commit Change-Id: Ibf8696196a7ac2c84ac8aa7cde1982c9c89fb64d Signed-off-by: platania --- vnfs/VESreporting_vLB/LICENSE.TXT | 22 ++ vnfs/VESreporting_vLB/Makefile | 41 ++++ vnfs/VESreporting_vLB/README.md | 25 +++ vnfs/VESreporting_vLB/dep.xml | 25 +++ vnfs/VESreporting_vLB/go-client.sh | 6 + vnfs/VESreporting_vLB/pom.xml | 55 +++++ vnfs/VESreporting_vLB/vpp_measurement_reporter.c | 246 +++++++++++++++++++++++ 7 files changed, 420 insertions(+) create mode 100644 vnfs/VESreporting_vLB/LICENSE.TXT create mode 100644 vnfs/VESreporting_vLB/Makefile create mode 100644 vnfs/VESreporting_vLB/README.md create mode 100644 vnfs/VESreporting_vLB/dep.xml create mode 100755 vnfs/VESreporting_vLB/go-client.sh create mode 100644 vnfs/VESreporting_vLB/pom.xml create mode 100644 vnfs/VESreporting_vLB/vpp_measurement_reporter.c (limited to 'vnfs/VESreporting_vLB') 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 @@ + + demo + + tar.gz + + + + + . + / + + *.sh + *.md + *.TXT + *.c + Makefile + + + + + + + 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 @@ + + + + org.openecomp.demo.vnf + demo-aggregator + 1.0.0 +../pom.xml + + + 4.0.0 + org.openecomp.demo.vnf.ves + ves_vlb_reporting + + 1.0.0 + + + + + maven-jar-plugin + + + default-jar + never + + + + + + maven-assembly-plugin + 2.5.3 + + dep.xml + + + + create-archive + package + + single + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + false + + + + + + + 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 +#include +#include +#include +#include +#include + +#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 | \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]; +} -- cgit 1.2.3-korg