Skip to content

Commit

Permalink
Add start of jfrog CICD polling tool and notes.
Browse files Browse the repository at this point in the history
  • Loading branch information
greearb committed May 6, 2020
1 parent f8c06d0 commit bfc93ec
Show file tree
Hide file tree
Showing 3 changed files with 194 additions and 0 deletions.
45 changes: 45 additions & 0 deletions NOTES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,48 @@ layouts), a new directory in testbeds/ should be created, and populated with tes
LANforge scenario and test configuration files. See 'ben-home' for examples.
See lanforge/lanforge-scripts/gui/README.txt for details on ways to grab the appropriate text,
but you will also need familiarity with LANforge to accomplish this easily.


# Test controller setup. Assuming Fedora-30 or similar is installed.

# Enable vnc, install some things, disable selinux so vnc will work.
./lf_kinstall.pl --do_vnc --do_pkgs --do_selinux 0

# As user lanforge (or other user should work too)
# You will need to put the proper keys in ~/.ssh/ in order to
# do the clone.
mkdir ~/git
cd ~/git
git clone [email protected]:Telecominfraproject/wlan-testing.git
git clone [email protected]:Telecominfraproject/wlan-lanforge-scripts.git
cd wlan-testing/lanforge
ln -s ../../wlan-lanforge-scripts lanforge-scripts

# Make a copy of a test bed similar to what you have, for instance:
cd ~/git/wlan-testing/testbeds
cp -ar example_test_bed my_new_test_bed

# Edit the new test bed details as needed, this may be somewhat tricky
# if your test bed is different from others.
# See ~/git/wlan-lanforge-scripts/gui/README.txt for some hints on setting up
# scenarios and such.



# On LANforge machine, make sure GUI is in auto-start mode:
https://www.candelatech.com/cookbook/misc/autostart

* Create uplink-nat profile.
* Create upstream DUT
* Create AP DUT
* Create scenario that uses uplink-nat profile and upstream-dhcp to provide VR+NAT access to the world.
* Add stations for the radios, properly linked to DUT radio(s).

* Create WCT test, verify it works OK, save scenario
* Interleave sort, set pass/fail limits

* Create AP-Auto test
* configure DUT
* configure radios
* configure advanced (dual-band only in our case)
* configure stability settings
50 changes: 50 additions & 0 deletions cicd/README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
Potential polling method for CICD integration.

* Polling should decrease network security head-aches such as setting
up VPN access for all test beds.

***

Implementation:

* Web server accessible to all CICD test beds runs a 'test orchestrator' logic, henceforth TO
* This TO will periodically query jfrog for latest openwrt builds (see jfrog.pl)
* If new build is found, a text file containing pertinent info, including the HW platform
will be created, example:

CICD_URL=https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/
CICD_FILE_NAME=ea8300-2020-04-24-046ab4f.tar.gz
CICD_URL_DATE=24-Apr-2020 18:28
CICD_HW=ea8300
CICD_FILEDATE=2020-04-24
CICD_GITHASH=046ab4f

* TO has manually configured list of test-beds, with some info about each test
bed, including the DUT HW platform and testing capabilities.
* It picks a test bed that matches the new build HW.
* That test bed will have a URL directory for it and it alone.
* The TO writes a new test configuration file into this directory.
The test configuration file will have the info above, and also have other
info including the tests to run and where to upload results when complete.


* Test bed polling:
* The test-bed (hence forth TB) will poll its directory on the TO web server to look for new jobs.
* When new job is found, the TB will download the test config file, and use scp to upload a file
to the TO to indicate it is working on the test.
* When test is complete, TB will upload results to TO server. TO now knows test bed is available
for more jobs.

* TO Polls periodically for results from test-beds, and when found it will re-generate historical
graphs and reports. If feasible, it could also email or otherwise notifiy whoever is interested in
these results. It could poke the results into testrails or similar at this point.


* If we can implement something like CTF, then it could cause the test config files to be placed into
the test-bed directory, potentially with URLs pointing to user-specified locations for testing private
builds.





99 changes: 99 additions & 0 deletions cicd/jfrog.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/usr/bin/perl

# Query jfrog URL and get list of builds.

use strict;
use warnings;
use Getopt::Long;

my $user = "cicd_user";
my $passwd = "";
my $url = "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/";
my $files_processed = "jfrog_files_processed.txt";
my $next_info = "jfrog_files_next.txt";
my $help = 0;

my $usage = qq($0
[--user { jfrog user (default: cicd_user) }
[--passwd { jfrog password }
[--url { jfrog URL, default is OpenWrt URL: https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ }
[--files_processed { text file containing file names we have already processed }
[--next_info { output text file containing info about the next file to process }
Example:
$0 --user cicd_user --passwd secret --url https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ \
--files_processed jfrog_files_processed.txt --next_info jfrog_files_next.txt
);

GetOptions
(
'user=s' => \$user,
'passwd=s' => \$passwd,
'url=s' => \$url,
'files_processed=s' => \$files_processed,
'next_info=s' => \$next_info,
'help|?' => \$help,
) || (print($usage) && exit(1));

if ($help) {
print($usage) && exit(0);
}

if ($passwd eq "") {
print("ERROR: You must specify jfrog password.\n");
exit(1);
}

my $i;

#Read in already_processed builds
my @processed = ();
my $listing = `cat $files_processed`;
my @lines = split(/\n/, $listing);
for ($i = 0; $i<@lines; $i++) {
my $ln = $lines[$i];
chomp($ln);
print("Already processed: $ln");
push(@processed, $ln);
}

my $cmd = "curl -u $user:$passwd $url";
print ("Calling command: $cmd\n");
$listing = `$cmd`;
@lines = split(/\n/, $listing);
for ($i = 0; $i<@lines; $i++) {
my $ln = $lines[$i];
chomp($ln);

if ($ln =~ /href=\"(.*)\">(.*)<\/a>\s+(.*)\s+\S+\s+\S+/) {
my $fname = $1;
my $name = $2;
my $date = $3;

if ( grep( /^$fname\s+/, @processed ) ) {
# Skip this one, already processed.
next;
}

open(FILE, ">", $next_info);
print FILE "CICD_URL=$url\nCICD_FILE_NAME=$fname\nCICD_URL_DATE=$date\n";

if ($fname =~ /^(\S+)-(\d\d\d\d-\d\d-\d\d)-(\S+).tar.gz/) {
my $hw = $1;
my $fdate = $2;
my $githash = $3;
print FILE "CICD_HW=$1\nCICD_FILEDATE=$fdate\nCICD_GITHASH=$githash\n";
}

close(FILE);

print("Next: File Name: $fname Display Name: $name Date: $date\n");
print("To download: curl --location -o /tmp/$fname -u $user:$passwd $url/$fname\n");
exit(0);
}

#print "$ln\n";
}

exit 0;

0 comments on commit bfc93ec

Please sign in to comment.