Redirecting...
+ {{ site.language.if_you_are_not_redirected_automatically }} {{ site.language.click_here }}. + + + diff --git a/_posts/2014-03-20-New-site-in-egypt.md b/_posts/2014-03-20-New-site-in-egypt.md index ca6e4e6..f89ce33 100644 --- a/_posts/2014-03-20-New-site-in-egypt.md +++ b/_posts/2014-03-20-New-site-in-egypt.md @@ -1,12 +1,12 @@ --- layout: post -title: Marhaba Egypt ! +title: Marhaba Egypt description: Egyptian Network for High-Energy Physics deploys site into AAROC headline: Egyptian Network for High-Energy Physics deploys site into AAROC modified: 2014-03-20 category: new-sites tags: [welcome, Egypt, new, sites, deployment] -image: +image: feature: ENHEP-banner.gif comments: true mathjax: @@ -18,6 +18,6 @@ After KENET, DIT and CNRST, we've got a new site on the ROC, hailing all the way # Status of ASRT ENHEP site -We've added the new site to the GOCDB and handed over ownership of it to the site administrators. The site BDII is happily reporting that services are up and running and nagios agrees. Once we've got the MERAKA dev site finished (see our [work with Ansible](https://github.com/AAROC/ansible-for-grid), we'll be able to start certification of the site. +We've added the new site to the GOCDB and handed over ownership of it to the site administrators. The site BDII is happily reporting that services are up and running and nagios agrees. Once we've got the MERAKA dev site finished (see our [work with Ansible](https://github.com/AAROC/ansible-for-grid), we'll be able to start certification of the site. This should be done by early next week, *insha'Allah* ! diff --git a/_posts/2014-03-20-first.md b/_posts/2014-03-20-first.md index 29f7163..400ea59 100644 --- a/_posts/2014-03-20-first.md +++ b/_posts/2014-03-20-first.md @@ -39,7 +39,3 @@ Perhaps the most satisfying development we've had in the last few months is the # It's dangerous out there, take this Research is a fun place to work, specifically because it's confusing, exciting, challenging and changing constantly. We'll always be putting out fires with angry cats and telling our stories over beers; hopefully with a few less bearded faces than we currently have, if you know what I mean. We're never going to be able to automate our operations and provide the right training and documentation that we need for our team to be perfect. It's a constant learning curve - but at least that curve can be integrated, hopefully to something that converges (sorry - math joke). We are working on some cool stuff with our friends all over the world to alleviate the load on our humans. This blog will, hopefully, tell the tale of how the we learned to stop putting out fires with cats and learn to trust the robots and our rational side instead - -{% if page.discourse %} - -{% endif %} diff --git a/_posts/2014-11-26-Terre-des-hackers.md b/_posts/2014-11-26-Terre-des-hackers.md index b4361f8..c289471 100644 --- a/_posts/2014-11-26-Terre-des-hackers.md +++ b/_posts/2014-11-26-Terre-des-hackers.md @@ -17,7 +17,7 @@ The panel consisted of Peter van Heusden (University of the Western Cape), Jonah Images are courtesy of [the Saint-Exupéry Foundation](http://www.antoinedesaintexupery.com). The thoughts revolve around quotes which I've selected from the book "Terre des Hommes". ---------------------------- @@ -50,7 +50,7 @@ There is sometimes a tension then between *getting things done* and *getting thi We come then to a metaphor : A dejected pilot stands beside his crashed airplane. He, like us, is an explorer. He has chosen to fly to new lands, and has crashed in a desert - land unknown to human feet. He will eventually repair his airplane, or be rescued by his fellow explorers, but has only the tools at hand to survive in the meantime. Not knowing what awaits him, he has taken on that airplane what one might call a "general solution" - the basic tools which can be used in any situation, given enough ingenuity and patience. A hammer, a radio transmitter, a wrench, a compass, a blowtorch, a warm jacket, a rifle (let us not forget that he has crashed in a very hostile territory). @@ -61,9 +61,9 @@ These are his tools for *disaster recovery*, but but it is above all his ***aero > [...] la vie du passé nous semble mieux répondre a notre nature, pour la seule raison qu'elle répond mieux a notre langage. -We are presented with an instrument of discovery, but it seems from "the future". Its controls, it's internal functioning, are exposed and seem foreign to us and we often find ourselves unable to find the terms needed to express our need for or usage of it. Sometimes, this makes it hard to ask for ask for newer, or better aeroplanes... after all, if it is only to deliver packages, why we can already do that with a boat or a train ? And these don't crash in the middle of the desert ! Yes, but aeroplanes go where boats or trains cannot, they see from a different angle, and from their altitude, the world takes on a vastly different aspect. +We are presented with an instrument of discovery, but it seems from "the future". Its controls, it's internal functioning, are exposed and seem foreign to us and we often find ourselves unable to find the terms needed to express our need for or usage of it. Sometimes, this makes it hard to ask for newer, or better aeroplanes... after all, if it is only to deliver packages, why we can already do that with a boat or a train ? And these don't crash in the middle of the desert ! Yes, but aeroplanes go where boats or trains cannot, they see from a different angle, and from their altitude, the world takes on a vastly different aspect. -St. Exupéry's point here is that we are beings bound by the language we speak, the terms we use - and often our reticence to adopt new ways is due to our sense of being at a lack of words. It is in our nature to explore, but in exploring, we need to remind ourselves that it end, not the means which drives us. +St. Exupéry's point here is that we are beings bound by the language we speak, the terms we use - and often our reticence to adopt new ways is due to our sense of being at a lack of words. It is in our nature to explore, but in exploring, we need to remind ourselves that it is the ends, not the means which drives us. > Nous sommes tous de jeunes barbares que nos jouets neufs émerveillent encore. […] @@ -79,7 +79,7 @@ Yes, we, these explorers, do tend to get blinded by the shiny. We forget that *l We forget that the aeroplane was made for a *reason*, which was to arrive somewhere. The very first ones were built essentially for the pilot, whose driving passion is to discover the unknown through discovery. But later ones were built for *passengers*, whose goal is simply to *arrive*. Their passion is the relative, or the business, or the exotic fruit, at the end of the journey and for them the aeroplane, although perhaps intriguing, is not of primary importance. -How was the aeroplane built ? The very first ones had all of the tubes, knobs, dials and guages in plain site (if one will forgive the homonymic pun), because the pilot needed to know every detail of the internal working of the aeroplane. However, later models hid these details both from pilots as well as of course from the passengers, since we came to learn the habits and workings of the machine. We made it less mysterious, and more functional, to respond better to our human, (or in this case, scientific), rather than technical needs. +How was the aeroplane built ? The very first ones had all of the tubes, knobs, dials and guages in plain sight (if one will forgive the homonymic pun), because the pilot needed to know every detail of the internal working of the aeroplane. However, later models hid these details both from pilots as well as of course from the passengers, since we came to learn the habits and workings of the machine. We made it less mysterious, and more functional, to respond better to our human, (or in this case, scientific), rather than technical needs. ## What home awaits us ? @@ -130,7 +130,7 @@ What kind of learning environment do we want for our future generations ? And wh > And all the boards did shrink;> Data, data, every where,
> Nor any drop to drink
->
Samuel Taylor Coleridge, "The Rime of the Ancient Mariner"
+>Not Samuel Taylor Coleridge, not "The Rime of the Ancient Mariner"
They have been told that such marvels exist, but how to use them, and what is actually offered is somewhat different. In order to build a "fertile delta", there needs to be better integration between training, research and innovation, especially mutually-reinforcing aspects. diff --git a/_posts/2014-12-31-Standby.md b/_posts/2014-12-31-Standby.md index c2a11dd..8d0a502 100644 --- a/_posts/2014-12-31-Standby.md +++ b/_posts/2014-12-31-Standby.md @@ -63,7 +63,7 @@ I, for one, am tired of writing reports and emails that few people read. If some ## Quick and dirty dashboard -Finally, we're working on a small, simple [dashboard]({{ site_url/SitRep }}) to give a snapshot of the state of our core services, but also those not covered by SAM. This is not meant to be a reimplementation of the [Operations Portal](http://operations-portal.egi.eu), or the [Virtual Organisation portal](http://http://operations-portal.egi.eu/vapor). It will give simple info about the state of the services which we use which are *not* included therein - the core services, the dev cluster, various websites etc that are outside of the realm of the grid, but still important to daily life of the ops team and relying communities. +Finally, we're working on a small, simple [dashboard]({{ site_url }}/SitRep) to give a snapshot of the state of our core services, but also those not covered by SAM. This is not meant to be a reimplementation of the [Operations Portal](http://operations-portal.egi.eu), or the [Virtual Organisation portal](http://http://operations-portal.egi.eu/vapor). It will give simple info about the state of the services which we use which are *not* included therein - the core services, the dev cluster, various websites etc that are outside of the realm of the grid, but still important to daily life of the ops team and relying communities. # Watch this space - or help out ! diff --git a/_posts/2015-06-07-Dissemination-beyond-the-project.md b/_posts/2015-06-07-Dissemination-beyond-the-project.md index e8349ed..6840e4d 100644 --- a/_posts/2015-06-07-Dissemination-beyond-the-project.md +++ b/_posts/2015-06-07-Dissemination-beyond-the-project.md @@ -46,8 +46,23 @@ We can use these to *publish* our articles, as well as invite others to publish This is a blog which the members of the Regional Operations Centre can contribute to. This blog tells the story of e-Infrastructure in Africa, where it comes from, what's currently happening and where it sees things going. Many of the articles are republished in [Open Science in Africa](https://medium.com/open-science-in-africa). Contributions are simply commits or pull requsts to the [repo](https://github.com/AAROC/aaroc.github.io), making it easy to contribute. -I'd like to be able to catalogue and link other interesting articles in this topic - please [reply with suggestions at the tpoic on the forum](http://discourse.sci-gaia.eu/t/where-are-we-disseminating-our-work/55) +I'd like to be able to catalogue and link other interesting articles in this topic - please [reply with suggestions at the topic on the forum](http://discourse.sci-gaia.eu/t/where-are-we-disseminating-our-work/55) + + # References and Footnotes + [^Cover]: The cover image is used with permission from [Flikr User antefixus U.E.](https://www.flickr.com/photos/21728045@N08/11200960143/in/photostream/) + + + diff --git a/_posts/2015-06-16-Announcing-PerfSONAR.md b/_posts/2015-06-16-Announcing-PerfSONAR.md new file mode 100644 index 0000000..d3fda6b --- /dev/null +++ b/_posts/2015-06-16-Announcing-PerfSONAR.md @@ -0,0 +1,74 @@ +--- +layout: post +title: "PerfSONAR by SANREN" +description: Ever wanted to know how the network is doing ? +headline: The South African NREN has got network performance covered +category: blog +tags: [Announcement, perfSONAR, SANREN, network, performance, open infrastructure] +image: + feature: spidernet.jpg +comments: true +discourse: false +--- + +# TL;DR - End-to-end performance is hard, SANREN has your back, with perfSONAR. + +Applications in a distributed environment can depend critically on the performance of the network over which they run. Getting the most out of the network involves first understanding where the bottlenecks are; SANREN's got you covered with perfSONAR. + +# The SANREN backbone and the rest of the network + +The South African NREN consists of a backbone connecting the main nodes at Universities across the country, as well as main laboratories and research infrastructure. This represents a game-changing investment in research infrastructure in South Africa, bringing researchers closer together and enabling a wide range of tools and services that were not feasible before. + +The 10 GB/s backbone is extended from the nodes to the various institutes which are served by the NREN in a more capilliary fashion. From the pops to the campuses to the LANs and eventually the end-user's device (phone, laptop) or srever in a data centre. This complexity is often overlooked, and the beautiful, impressive simplicity of one number - the core backbone bandwidth - seduces us into thinking that we're suddenly going to shift data at light speed. + +# Understanding end-to-end performance + +We expect that the 10 GB/s of the backbone is translated into our actual experience of the application at hand, ignoring the fact that these applications required data to move in something less like a straight (pipe)line and more like a massive delta. The *actual* performance of the application is often determined by the largely by the slowest component in it, not by the fastest. This may be anything from a congested switch to a misconfigured firewall or simply the network card installed on the receiving end. Aspects such as the kernel configuration of the sending and receiving machines - how it is configured to process the data coming over IP, and how this compares with the physical characteristics of the hardware - can also have a huge, unexpected impact. + +Most of our network devices are configured for reliability and for handling typical traffic on the web, not the massive sustained throughput needed by advanced research applications. It is not uncommon to sense frustation in a user's communcations when they are told that the university has 10 GB/s connectivity, but they are only experiencing orders of magnitude less than that. Understanding what to expect comes from knowing the relationship between the data you want and everything between it and the location in which it needs to be processed. Likewise, getting the most out of backbone investment like SANREN comes down to identifying and optimising every component on a path. + +While it's fairly easy to do this for the backbone components, the complexity of the system - due to the number and variety of components - lower down the line, is a severe challenge. In order to deliver the best service possible and get the most out of a massive investment, a special instrument is needed to probe the performance of the network *on specific paths* - from end to end. + +# Enter perfSONAR + + + +The tool for this job has been developed over decades of research in network engineering : [perfSONAR](http://www.perfsonar.net). In their own words - + +> "perfSONAR is a network measurement toolkit designed to provide federated coverage of paths, and help to establish end-to-end usage expectations. There are 1000s of perfSONAR instances deployed world wide, many of which are available for open testing of key measures of network performance. This global infrastructure helps to identify and isolate problems as they happen, making the role of supporting network users easier for engineering teams, and increasing productivity when utilizing network resources. " + +PerfSONAR provides a set of sensors which collect performance data on network traffic, and there are instances all across the globe, helping to identify and diagnose issues across almost any path that modern research data can travel. This is an extremely powerful tool. + +# PerfSONAR in South Africa + +PerfSONAR in South Africa has been operational for some time - since 2012 in fact - and has already led to significant improvements in data throughput from international laboratories like [CERN](http://www.cern.ch) to South Africa, supporting high-energy physics experiments, *e.g.* [ALICE](http://www.aliceinfo.cern.ch) and [ATLAS](http://www.atlas.ch). With currently 13 permanent nodes and the full backbone covered, it is firmly a part of the international perfSONAR network. + + +PerfSONAR is now a fixed feature of the South African NREN landscape and is used on a daily basis to support optimisation and improvement of the research network. It provides valuable supporting information to network engineers and administrators which need to identify bottlenecks and efficiently take action to resolve it - avoiding the usual "it's your side !" , "no it's your side" back and forth that can so often define network performance debungging. This is, in the final analysis, a great move for users, who get to experience the fastest possible network for their applications. + +# Now that we've found love... + +Of course, tools like perfSONAR only help to identify problems and misconfigurations, they don't automagically *fix* them; that would be just a little *too* awesome :wink:. Luckily there are a lot of proactive ways to address end-to-end performance tips and tricks which can be applied to speed up network transfers, from using different tools to tuning kernel parameters. The good folks at [Faster Data](http://fasterdata.es.net/) provide a comprehensive knowledgebase, which you can refer to if you want to squeeze every last bit of your available bandwidth. You may never get to the golden 10 GB/s, but hey at least you'll sleep better at night knowing there's just nothing more you can do ! + +# To know more + +If you want to find out more about what perfSONAR take a look at the [perfSONAR website](http://www.perfsonar.net) and links therein. A good resource for analysing end-to-end performance is the [ESNet](http://www.esnet.net) knowledgebase and links therein. + +To find out more about how perfSONAR is improving the use and capability of the NREN in South Africa, take a look at [Roderick's slides from TNC 2015](https://tnc15.terena.org/core/presentation/199) - where he goes into depth about the system's use in South Africa. If you're interested how perfSONAR could benefit you locally, don't hesitate to get in touch with Roderick Mooi (rmooi.at.csir.co.za) or Kevin Draai (kdraai.at.csir.co.za) at SANREN. + +Lastly, to use the SANREN perfSONAR tools, take a look at http://perfsonar.sanren.ac.za + +Make that data flow ! + +{% if page.discourse %} +# Discussion + + +{% endif %} diff --git a/_posts/2015-07-08-Top-bdii-restart.md b/_posts/2015-07-08-Top-bdii-restart.md new file mode 100644 index 0000000..5f333b6 --- /dev/null +++ b/_posts/2015-07-08-Top-bdii-restart.md @@ -0,0 +1,13 @@ +--- +layout: post +type: status +title: Top-BDII restart +description: Service restart notification +headline: It's dead, Jim ! +category: ops-updates +tags: [AAROC, bdii, operations, updates] +image: + feature: servicedied.jpg +comments: false +--- +The top-bdii at ZA-MERAKA has crashed, raising an alarm on the ops portal and causing several site probes to fail. The service has been restarted. A ticket recently opened will soon be closed. diff --git a/_posts/2015-07-10-CVE-2015-1793.md b/_posts/2015-07-10-CVE-2015-1793.md new file mode 100644 index 0000000..5f2b379 --- /dev/null +++ b/_posts/2015-07-10-CVE-2015-1793.md @@ -0,0 +1,25 @@ +--- +layout: post +type: status +title: A high-severity openssl vulnerability has been announced CVE-2015-1793 +description: Certificate chain verification vulnerability announcement CVE-2015-1793 +headline: Time to update your ssl (again !) +category: security +tags: [AAROC, CSIRT, operations, security, updates, CVE-2015-1793] +image: + feature: openssl_cve_2015_1793.png +comments: false +--- + +A new [security advisory](https://www.openssl.org/news/secadv_20150709.txt) from the OpenSSL project relating to versions starting at 1.0.1n 1.0.2b. + +**This issue affects OpenSSL versions 1.0.2c, 1.0.2b, 1.0.1n and 1.0.1o.** + + 1. OpenSSL 1.0.2b/1.0.2c users should upgrade to **1.0.2d** + 1. OpenSSL 1.0.1n/1.0.1o users should upgrade to **1.0.1p** + +If you need direct support from the CSIRT, please contact Roderick Mooi (rmooi.at.csir.co.za) + +## Updates + +**Update** - According to [RedHat](https://access.redhat.com/solutions/1523323) this CVE does not affect them. Presumably this includes derivates. Thanks @bazinski diff --git a/_posts/2015-07-14-CVMFS-update.md b/_posts/2015-07-14-CVMFS-update.md new file mode 100644 index 0000000..e2a936f --- /dev/null +++ b/_posts/2015-07-14-CVMFS-update.md @@ -0,0 +1,73 @@ +--- +layout: post +type: post +title: Iterating CVMFS +description: 'An update on our quest to deliver applications' +headline: 'Step 1: RTFM; Step 2: Repeat; Step3: Do it right this time...' +modified: +category: blog +tags: [cvmfs, CODE-RADE, CVMFS] +image: + feature: patience-yoda.jpg + attribution: 'http://quotesfans.com' +comments: true +mathjax: +discourse: true +--- + +# TL;DR + +A quick update on the work we're doing in the [CODE-RADE](https://github.com/AAROC/CODE-RADE-project) to bring a continuous delivery capability to the applications which can run on our infrastructure. A workflow to test the delivery of applicaitons in CVMFS needs to be implemented *and it better be automated*. + +# The problem at hand + +So, we've gone to quite a significant length to develop a platform which allows almost anyone to contribute applications to the ROC's repository. By sending a pull request or a commit directly to a repo in [https://github.com/SouthAfricaDigitalScience] -- but what happens when an application is built ? + +Applications are "delivered" to the sites via [CVMFS](http://cernvm.cern.ch/portal/cvmfs)[^maybedocker]. + +We need it to be checked against itself, but also run from the CVMFS repo to make sure that when it gets out into the "wild" - on the sites that mount the repo and execute the applications. One of the reasons we chose CVMFS as a delivery mechanism was to give the site administrators less overhead in managing applications. + +# Basic Workflow + + + +The part of the workflow representing testing and integration shown in [Figure 1](#Figure 1) is the meat of the problem - how do you reliably test user-contributed applications before integrating them into a repository which will be used at all sites ? - but the issue still remains of *actually getting the software into the repo*. Let's take a closer look at that... + +## Slightly more detailed workflow. + +So, once we have concluded the workflow in [Figure 1](#Figure 1), some orchestration has to happen : + + 1. On the build node: + 1. shift new artifacts into the CVMFS server + 1. unmount the dev repo + 1. On the CVMFS server: + 1. Put cvmfs dev repo into transaction + 1. Run regression tests on the new code - this includes all of the functional tests of all of the existing applications, _as well as_ the new application. + 1. If all pass, publish the new dev repo + 1. On the build node: + 1. mount the dev repo + 1. run regression tests + 1. Send a message that the new application has passed all tests + +:hurtrealbad: ***It is now time for a human to take over and pull the code into the production repo which is mounted on all the sites.*** :hurtrealbad: + +Unless I'm missing something obvious, this is the slightly more detailed workflow.... before you get all excited about publishing containers and all, Yoda has a message for you: + + + +That will come, that will come. In the meantime, go listen to some rad music: + ++ + + +
+ +... till next time ... :wave: :octocat: + +# Footnotes and References + +[^maybedocker]: The choice of CVMFS was made as it is the only high-performance read-only delivery mechanism out there, currently used heavily and well-tested by the WLCG VO's. It's not the only choice and we want to make delivery possible via Docker as well. More on that later. diff --git a/_posts/2015-07-24-CVE-2015-3246.md b/_posts/2015-07-24-CVE-2015-3246.md new file mode 100644 index 0000000..85b8ac1 --- /dev/null +++ b/_posts/2015-07-24-CVE-2015-3246.md @@ -0,0 +1,47 @@ +--- +layout: post +type: status +title: A CRITICAL-severity libuser vulnerability has been announced CVE-2015-3245. +description: EGI SVG Advisory 'Critical' risk libuser local root exploit for RedHat and derivatives. +headline: Users, though shalt not pass(word) ! +category: security +tags: [AAROC, CSIRT, operations, security, updates, CVE-2015-3246] +image: + feature: 'CVE-2015-3246.jpg' + attribution: "DeviantArt user Anna-Yaina - http://anna-yaina.deviantart.com/" +comments: false +--- + +# CRITICAL severity means take action now + +A new critical vulnerability [has been announced](https://wiki.egi.eu/wiki/EGI_CSIRT:Alerts/libuser-2015-07-24) by the [EGI CSIRT](https://wiki.egi.eu/wiki/EGI_CSIRT:Alerts). From the advisory : + +> This vulnerability is present in the case of access via a local user account and its password. + +Most of the back-end infrastructure is safe (at least, in the "grid" world), since : +> Fortunately much of the access to the EGI infrastructure is NOT via this method; so much of the EGI infrastructure is not likely to be affected. + +This is true of AAROC sites as well... BUT : + +> However, if access via login with a local user and password is enabled, then sites should act +> quickly to update. One scenario in EGI where access is likely to be via this method is where +> User Interfaces (UIs) are made available with a local passwd file. + +# Perun, take the wheel ! + +**Some** of our UI's are managed by [Perun](https://perun.c4.csir.co.za), which is not affected, but if you are allowing user login with password, please take immediate action. + +Essentially this means + +``` +yum update libuser +``` + +Stay safe and have a good weekend, y'all :smile: + +# Updates + +**Update 2015-07-30** + +As question on the target of the advisory were raised, sites are reminded that this advisory applies to all system with libuser installed and thus that they are expected to update to a non-vulnerable version. +However, as for any vulnerability, sites can apply temporary mitigation (see the recommendations) if an update is not an option. diff --git a/_posts/2015-07-27-CODE-RADE-Real-World.md b/_posts/2015-07-27-CODE-RADE-Real-World.md new file mode 100644 index 0000000..81e5a85 --- /dev/null +++ b/_posts/2015-07-27-CODE-RADE-Real-World.md @@ -0,0 +1,144 @@ +--- +layout: post +title: CODE-RADE in the Real World +description: 'What use is a user if the infrastructure is useless ?' +headline: "Let's get rid of those bottlenecks and get our science on !" +category: blog +tags: [blog, HPC, CODE-RADE, automation, jenkins, github, rock n roll] +image: + feature: bottleneck.jpg + attribution: +comments: true +mathjax: +discourse: false +--- + + +# TL;DR: We are building some awesome technical automation to deliver applications - but how does the actual intended audience actually use it ? + +Whoa ! That's a mouthful, even for a quasi-abstract, but stick with me, this one is all about "Ok, now what ?". The time has come to get real with CODE-RADE project, after many many months of laying down foundations. The basic premise of the project is to demolish the barrier to entry for new applications, by + + 1. Judicious use of web technologies + 1. Heavy use of automation + +Basically, we want a user or research group to propose an application that they want, _literally by sending a pull request_, have some fancy robots take over from there, then a few days later have the user submitting jobs to the grid with their new shiny. + +Delivering applications should be a simple as pushing a few commits to a repo; executing that application in a workflow should be as simple as writing a script that says not much more than + + + # Add the AAROC deployed apps module + module add deploy + # Add myApp and dependencies + module add myApp + # SCIENCE ! + . . . my_workflow . . . + + +# Step 4 - Profit ! + + +Unless you've been living on Mars until just this moment, or are reading this blog post from the [New Horizons](https://www.nasa.gov/mission_pages/newhorizons/main/) probe, you probably know the [Profit !!! meme](http://knowyourmeme.com/memes/profit). + + If not[^HiMars], here's how it works : + +> You have a goal, and you have a vague idea of how to reach it. The first two steps are easy, then some magic happens, finally, PROFIT !!! + +I propose that this is usually the case for researchers - they *know* their application better than the infrastructure operators do, and they usually know how to build it and execute it. The infrastructure operators, however, know how to deliver applications to their users - they might have some local customisations at their sites for how they deal with users, parallelism, file systems etc. In this analogy, the user[^UserResearcher] would know the first two steps of their goal-oriented path : + + 1. Compile the application against it's respective dependencies + 1. Check that the application executes correctly + +while the operator knows the other side of that model, and can ensure that the application is in the right path with the right permissions, etc. + +# A bit of background. + +Before we get into the steps that a user would need to take *right now* to deploy their application to the grid, let's take a brief look into the past. + +## No-one said it would be easy... + +Getting applications onto the infrastructure was one of the main blocking aspects of SAGrid, and most national distributed computing platforms. Without being able to run their code or workflows in a reasonable time, users and entire communities get discouraged and - in some cases - turn to home-brew solutions. However, the model we had in place assumed that there was an impermeable barrier between the user and the infrastructure, with the *"Software Manager"* playing the role of "priest", interceding for the user to the infrastructure's operations team. Essentially, this created a huge bottleneck, because special jobs had to be created, to be submitted site-by-site, in order to install the applications. What is more, functional checks were rarely made on the deployed applications, and updates to the packages were not guaranteed - they needed to be manually updated. + +## No-one said it should be this hard + +Wow, looking back that was quite *dumb*, for lack of a better word. Yes, we had nothing else to work with, and yes, *everyone else was doing it*, but that doesn't mean we can't make it less stupid ! We wanted to re-design the process so that it was more _user driven_ and _parallel_ than previously, with as few as possible bottlenecks. Essentially, we wanted to make the impermeable wall permeable, but brokering some trust between user and operator. All the user had to do was show the operator how the application had to be built; all the operator had to do was ensure that trusted applications were always available. Since most of the support effort previously was spent on ensuring that applications were compiled and linked correctly, and tracking down runtime errors, we wanted to eliminate or drastically reduce the occurence of these. The operators would be saying "ok, prove to me that you can execute in this environment witout doing bad things". + +# The Two-Way Mirror + +What if all the testing, checking and execution could be automated in some way ? A tireless robot could realistically test all desired configurations of an application, and could do so in an unbiased way - such that both the operator and the user could refer to the same build and say "yep, looks good". This is a kind of "two-way mirror", where the user can make verifiable statements about the application, and the operator can make verifiable statements about whether that application will execute on the remote side of the infrastructure[^BasicallyWN]. In the middle there is some opaqueness to both sides, but there is enough transparency to engender trust. + + + + +This is the basis of the trust brokerage and we've implemented it with [Jenkins](http://jenkins-ci.org). The details of the Continuous Integration setup for AAROC have been described at various previous posts in this blog and other slide decks, and here we want to focus on the user side of the process. What does a user have to do, step-by-step, in order to get their application to a point where it's executable ? + +# Your move, user... + +Let's start by putting the ball in the user's hand - we expect the user to prepare at least two scripts, and to place them in a change-controlled repository. As a default approach, this repo would be on [Github](https://github.com)[^NotJustGit], containing: + + 1. A `README` telling us what the application is and what dependencies it needs + 1. A `build.sh` script which **only** compiles the code and produces binary and library files (this is somtimes trivial, in the case of precompiled code) + 1. A `check-build.sh` script which provides a functional test of the code, as well as creates a modulefile for + +## Fork the demo repo + +Fork the [My-First-Deploy](https://github.com/SouthAfricaDigitalScience/my-first-deploy) repo to get an idea of what's going on; there's a nice README in there which explains how things work and where to get help. + +## Mount the CVMFS repo. + +All of the applications that have already been tested are already in the CVMFS repo, which you can easily mount on your laptop or local cluster. + +------- +
Instructions for mounting our CVMFS repositories
+ +-------- + + +We've even got a nice [playbook](https://github.com/AAROC/DevOps/blob/master/Ansible/cvmfs.yml) that you can use to make your machine a CVMFS client :smile:. This will give you direct access (via fuse) to the existing repo, and allow you to build code against the libraries therein. + +## Make sure it builds + +Your next task is to make the application build on something that you know - something "Linux" that is. Your main aim is to prove to the operators that the application will run, and they are operating a CentOS-based infrastructure. Some sites deploy Debian worker nodes too, which is why we have the Debian build slave - so basically if you can write a script that will compile your application against the libraries in CVMFS (and **only** those), then it will pass the first phase of testing. At this point, you can send a pull request and we can create the job to test the code on Jenkins. The script should be called `build.sh` for conventional reasons. + +***From here on out, every commit will trigger a Jenkins build*** + +## Make sure it runs + +Once you've made it compile, the next step is to prove that it will not give runtime errors. This means that a modulefile needs to be created for the application and a short script, by convention called `check-build.sh` is executed to load the modulefile for the applicaiton and execute functional tests. These tests have to be provided by you, the requestor, since you're the expert after all ! + +# Green Lights ! Ansible ! Transaction ! + +Once the `check-build` phase has successfully completed, a manual promotion is needed. We want this to be one of the few human steps to be made in the workflow, and we have to maintain some form of human interaction, mostly for quality and accountability reasons. Once a check has been made on the artifact, and perhaps a few messages have been exchanged between developer and expert, the application can be pulled into the `dev` repository. + +This involves putting the CVMFS repo into a "transaction" - a write-enabled mode in which updates of the repo can be made - and publishing a new version of the repo. All of this happens "behind the curtains", so to speak, from the user's point of view. All that they should see is a message somewhere that says something like + +> A new version of the repository has been published in the `dev` repository - +> Changelog: "New application xyz added after successful build, requested by so-and-so" + +## Real-world testing + +Now, the application is out there "in the wild" - albeit in a testing repository. Certain sites, and the user themself can test the application in a wider sense than the narrow infrastructure-focussed tests that Jenkins runs. After a brief period of testing, and consensus from the production sites, we can move the application into the production repository. + +This intermediate step can of course be considered optional, and skipping it could speed up deployment in most cases, but it is useful to have it in the workflow, to ensure that sites have informed consensus on what they are executing. Since the repo is mounted permanently, no action is taken on the site operator's behalf in order to deliver the application - **this is a feature**. + +# Go wild ! :tada: + +So, at this point, the application is _executable_ out there in the world. All we need to do is keep track of who is mounting the repo - which is usually published in the site-BDII. If updates to the application are made, they are user-triggered, and the operations team is consistently kept in the loop thanks to the continuous integration system. New versions of the application can be developed, and continuously tested, until arriving again at that most beautiful of all sights : ![all green]({{site_url}}/images/passing.svg) + +Continuous delivery - that's where we want to be. + +# Bonus points + +Bonus points to anyone who can mention the songs referred to in this post in the comments below. + +# References and Footnotes + +[^HiMars]: If you really have been living on Mars, well done, you are what humanity has been searching for, for millenia. Please make yourself known to one of our friendly visiting robots ! +[^UserResearcher]: I'm using "user" and "researcher" interchangeably throughout this article - what I mean here is "the entity who knows and uses the application". These may be different people, but the system is set up to handle this - the important point is that they are *different* from the operators. +[^BasicallyWN]: What we mean here by "remote side of the infrastructure" is basically "a worker node". This is being simulated as a specific execution environment (shell) on the build slaves, which is very similar to a worker-node, having all of the middleware and dependencies that a real worker node would have (and no more), but the "remote side of the infrastructure" can also be considered something that is outside of the authentication realm - a user interface or personal laptop for example. Since we have the possibility to simluate many different environments with Jenkins, simultaneously, we can acount for almost any site configuration. Currently, there are only SL6 and Ubuntu 1404 build slaves. +[^NotJustGit]: We really like Github because of the nice API it provides developers with, but in principle this could be any svn or git repo. Basically, we just need to know when changes are pushed to the repo, so that Jenkins can trigger the job. diff --git a/_posts/2015-08-05-DevOps-Manual.md b/_posts/2015-08-05-DevOps-Manual.md new file mode 100644 index 0000000..45b61b3 --- /dev/null +++ b/_posts/2015-08-05-DevOps-Manual.md @@ -0,0 +1,52 @@ +--- +layout: post +title: '"Manual" vs "DevOps" - which is better ?' +description: 'How should we teach the deployment, operation and maintenance of e-Infrastructure services ?' +headline: "Of course, both." +category: blog +tags: [blog, DevOps] +image: + feature: sciencepattern.png + attribution: http://thepatternlibrary.com/#science +comments: true +mathjax: +discourse: true +--- + + +This question arose during an email exchange with colleagues from [CESNET](http://www.cesnet.cz/?lang=en) recently, in the context of the upcoming [workshop on identity federations](http://osscom2015.osscom.org/?q=content/workshop-joining-eduroam-and-identity-federation) at the [OSSCOM](http://osscom2015.osscom.org/) conference. There will be an _install fest_ :tada: + +# How should we teach and collaborate ? + +This is great, but there are different philosophies about going about this. Essentially, everyone can agree that we don't want to have "black box" solutions for eduroam and other federated identity services - this may solve an immediate need, but can create a clientele system where remote experts are needed to operate local services. Also, everyone can agree that _learning_ how services work is a good idea, and that _knowledge transfer_ is part of the desired process. + +The question then becomes - **How do we teach the installation, operation and maintenance of these services in a sustainable way** ? + +While a student is in the classroom, during the event, it's arguable - but by no means guaranteed - that they will have a clear understanding of the technology thanks to their contact with the demonstrator/lecturer ; but what about those who are not able to attend ? What happens _after_ the event ? + +The approach we've taken in the [Africa-Arabia Regional Operations Centre](http://www.africa-grid.org) is to develop functional descriptions of services using [Ansible](http://www.ansible.com) and [Puppet](http://www.puppetlabs.com) which not only _document_ the procedure, but also _implement_ it. + +# Procedures versus states. + +So, while a manual, step-by-step approach can highlight and explain aspects in a procedural way, a DevOps approach can do the same, but in an _idempotent_ way. The difference is that if you go through the manual and follow all the steps to a tee, you should end up with a working system. Ok great ! Now, peturb that system a little - change a variable, update a package, etc - the manual is out of date and needs to be followed again from the starting point. Also, configuration drift can easily occur and usually can't be remotely verified without some form of intrusion (either authorised or not...) + +On the other hand, an Ansible playbook makes statements about the desired _state_ that aspects of a service should be in - + + * `a certain file should exist and have certain contents` + * `connectivity to this host should happen on such-and-such a port` + * `a certain process should be started and should belong to a certain user` + +It lets the developer focus on the _what_ and leave the _how_ to the orchestration engine. + +> This is code. + +And as code, it can be version controlled, tested, forked. + + +This is why we are pushing the DevOps model, and encourage anyone in the region to collaborate with us by using and contributing to the [DevOps](https://github.com/AAROC/DevOps) repository. We hope to do the same for radius server installation and are planning to do this for the Shibboleth-3 deployments soon after August. + +# Reproducible deployments + +By abstracting and co-ordinating _roles_ (ie, services configured in a certain way) we can allow sites to easily whip up complex configurations of services quite easily. But best of all, it's reproducible. We can and do test roles while developing them, and this provides us with good reference examples (this is done in the `dev` branch, if anyone is listening). Once these are known to give the desired end states, they can be forked and used to instantiate specific states, using different variables site by site. This makes it easier to identify and resolve problems - as well as make the return on investment in time spent during a workshop far greater. + +So - will you teach the "DevOps" way in your next eduroam, identity federation, `gh-pages
branch. Definitely still work in progress, but we can work on this. The current pages at [Applications]({{site_url}}/applications)and [CVMFS]({{ site_url }}/cvmfs) will stay, and will be useful to end-users but [CODE-RADE]({{site_url}}/CODE-RADE) will contain the documentation, links to publications etc.
+
+## Project issues and planning
+
+The scripts which build and check the applications are kept each in a separate repository - this means there are several repositories and if builds fail, issues need to be opened, tracked and eventually fixed. Since these issues are tied to a repo, it's easy to track which commit fixed them, but since there are many repos, it's hard to keep track of the overall status of the CODE-RADE project. We need a way to collect issues and present them in a holistic way in order to track the overall progress of the project.
+
+There are also cross-cutting issues which may arise, which are only fixable by working on the Jenkins server, or some other central node of the platform.
+
+In order to keep track of the issues, we can used things like [ontrack](http://nemerosa.github.io/ontrack/) or [Waffle.io](http://waffle.io). I particularly like Waffle.
+
+## (Scholarly) Publishing the project
+
+The time has come to work on scholarly output of the project - we need to submit articles to journals and conferences to get the narrative in the public domain, in a peer-reviewed way. We also need to think about keeping the slide decks and articles in a findable place.
+
+### Conferences
+
+We have a couple of upcoming opportunities to do this :
+
+ 1. OSSCOM in Amman, organised by ASREN - 10-13/09/2015
+ 1. [pyConZA](https://za.pycon.org/) in Johannesburg, with a Software Carpentry Bootcamp - 2-4/10/2015
+ 1. [The e-Research Africa conference](http://www.eresearch.ac.za) in Cape Town - 9-13/11/2015
+ 1. The Ubuntunet Connect Conference in Maputo - 17-20/11/2015
+ 1. The CHPC Conference in Pretoria 30/11/2015-04/12/2015
+
+ We probably can't make OSSCOM, but we should submit presentations to E-Research Africa and the CHPC conference. @smasoka should be presenting at CHPC, whilst both I and @smasoka will present at e-Research Africa. I will present at Ubuntunet.
+
+
+### Where to put our contributions
+
+We should submit works to preprint servers which issue persistent identifiers and create a table on the project website with these links (could also be an iframe from Zenodo e.g.). We could also think about having an Africa-Grid Open Access Document and Data repository as part of DIRISA. This needs the Ansible playbook for Invenio to be finished. See [this topic on the forum](http://discourse.sci-gaia.eu/t/pre-beta-version-of-the-open-access-repository)
+
+## This week's topics
+
+### Update to end-user modulefiles
+
+Modulefiles will be used to allow users submitting jobs or running applications locally on their laptops to easily set up shell environments. Modules should be configured according to the *site* in question - by *site*, we mean a particular configuration or state, *e.g.*
+
+ * a generic laptop with no cluster, with a Debian OS (generic, gcc4)
+ * a generic CEntOS site with standard middleware (gcc4-torque-openmpi)
+ * a CEntOS site optimised for high performance (gcc5-slurm-openmpi)
+
+These modules differ from those which we create during integration and then use to build applications against each other - they need to take the absolute minimum of parameters and need to be automatically set up by the end user. No variables to set, no special commands etc. A user or a script should simply be able to do something like
+
+
+ #!/bin/bash
+ source grid.sh # this is somewhere predefined on the site
+ module add Sci-GaIA is working on an integrated Open Science platform which delivers these services to research communities.
+ +------ + +# Comment, discuss, extend + +If you'd like to give some feedback or extend the discussion, please head over to the original [topic](http://discourse.sci-gaia.eu/t/publishing-vs-creating-in-the-open/) on the discussion forum. + + + + diff --git a/_posts/2015-09-14-CODE-RADE-burn-down.md b/_posts/2015-09-14-CODE-RADE-burn-down.md new file mode 100644 index 0000000..864d8bb --- /dev/null +++ b/_posts/2015-09-14-CODE-RADE-burn-down.md @@ -0,0 +1,167 @@ +--- +layout: post +title: 'CODE-RADE build burn down 36' +description: 'Summary of the build burn down of the CODE-RADE project, week 36' +headline: "CODE-RADE: burn baby burn" +category: blog +tags: [blog, CODE-RADE, sitrep] +image: + feature: burn.jpg + attribution: +comments: false +mathjax: false +discourse: true +--- + +# Burn down + +> TL;DR: The CODE-RADE platform is now mostly configured, and minor problems overcome. Continuous integration is being tested with weekly burn downs, to see whether the full chain is working. **Spoiler alert: it's not**. Also, you can help ! + +Here's the thing : + +---- + + + +---- + + +Stuff breaks. The whole point of this project is to develop a system which will _reliably, reproducibly, rapidly_ rebuild the repository of applications used at various sites. We therefore conduct these burn downs to see if this is actually the case (spoiler: it's not yet), and highlight the issues which remain in the ashes. + +The CODE-RADE platform is how we think we can reliably deliver applications to both sites and individual users and _do it right_. Right means : + + * **Continuous** - New requests are automatically integrated using standard build and integration procedures. Most tasks are automated and little intervention is needed from site administrators. + * **User-driven** - Want an app that's not in our repository ? Just send us a pull request. + * **Site-Independent** - We build the apps for execution + * **Reproducible** - When we integrate something, we want it to _stay_ integrated. The last budgie standing after the nuclear holocaust should be able to rebuild _everything_ just by gently nudging their cute little beak against the still-radioactive screen showing the CI build server web interface. + + +# Integration flow + + + +Integration is not a linear path. Of course, it can't be _cyclical_, but to satisfy various end-user and site configuration desires, there has to be a level of paralellism involved. We do this with the Jenkins [MatrixJob Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Matrix+Project+Plugin). This allows us to define _axes_ for our job configurations, for example the target operating system or application version number. + +There are also various _phases_ to the integration flow, from initial request to final delivered product. It would be really nice to have a visual representation of the state of your application - to be able to answer, _e.g._ the question : + +> "Where is my application in the delivery chain ?" + + Another issue which we'd like to address how to raise, escalate and resolve issues that may arise during the integration workflow. Now, we've taken the route that each application which we want built and integrated should have its own repository - we've now got around 30 repos in [South Africa Digital Science](https://github.com/SouthAfricaDigitalScience). How do we keep track of what state the various applications are, cross-reference them with their build results and understand where the bottlenecks are ? + +----- + + +It just so turns out that this problem is not a new one, basically, we need a "scrum" or "kanban" board[^ScrumBoard]. +To this end, we've created a [board](https://waffle.io/AAROC/CODE-RADE) to contain all of the tickets opened in the various repos against the specific applications. The single board allows us to place to see the overall status of the CODE-RADE project. Unfortunately, ticket dependencies are managed "by hand" - there's no way (yet) to specify which cards are blocked by which other ones, but we can take care of that just by manually ordering the cards on the board. Anyone who owns the repos (ie, in the right team of the owner organisations on Github) can interact with the board. Updating tickets information just involves a few clicks, and shifting issues along the pipeline is a drag-and-drop procedure. + + + + + + +## Dependency Graph + +One of the greatest (and thus hardest) things about CODE-RADE is the expression of dependencies between applications. Most open source software is not a monolithic structure, but rather delicate - some might say graceful - assembly of various independent components. These components may be in turn variously configured to produce different functional states, each of which can be considered nodes in a DAG[^DAG]. In fact, one of the main corrolaries of CODE-RADE, if we do things right, is to express a more-or-less fully-populated graph of the dependencies of _all_ applications used in scientific research[^notpossible] (or at least the most popular ones). + + + +This is for what we're calling ***"Foundation Release 1"*** - _IE_, "*stuff you can use to build other stuff*". + +# Build Failure Analysis + +We're using the [Jenknis Build Failure Analysis plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build+Failure+Analyzer) to identify various build failures. This is a fantastic plugin which scans the build logs and tries to figure out (via regexp) what went wrong. The build failure analysis helps us to estimate how much time fixing a build failure would take and spotting error patterns that are affecting more than one job. + +Of course, failure types have to be spotted and identified by actual humans - so, if you've got some time on your hands and feel like reading build logs, why not help us isolate these common errors and implement fixes ? + +# Bottlenecks + +So, with the dependency graph expressing the route from one component to the next, and the waffle board detailing where the actual issues are, we can plan work to address this and ensure that the pipeline burns right down. Here's a summary of the current state of affairs: + + * Total jobs in Foundation Release: 20 + * Failing jobs: 5 + +So, we're roughly 75 % of the way there (at least, using one definitely inappropriate metric ![^BetterMetric]). + +## Disk space - workaround + +One problem was the issue of disk space. The jobs were being built entirely on the slaves - which meant that the build artifacts including the intermediate ones were all kept on thes fairly small machines (~ 100 GB). The CI server however has a nice big (~1TB) disk which we are now exporting portions of over NFS to the build slaves. Thus, the jobs are all reading from and writing to a single disk. + +While this solves the size available problem, it does bring up some severe performance issues, especially in the case of wide matrix jobs such as `gcc`, which has 6 concurrent builds for the different axes. This can probably be alleviated by ensuring that the matrix builds are sequential instead of parallel as they are at the moment. + +## Numpy errors + +The [NumPy](http://www.numpy.org/) build scripts in their own [repo ](https://github.com/SouthAfricaDigitalScience/numpy-deploy) - currently, we're getting the following error when building NumPy + +{% highlight python %} + 'import site' failed; use -v for traceback + Traceback (most recent call last): + File "setup.py", line 16, inIf anyone is out there reading this and can spot the error, please help us out !
+ +# We goofed - might as well publish a relase... + +So - we goofed ! CODE-RADE won't be building anything for a few days, while we get this sorted out. The important thing is to learn some lessons : + + 1. First publish a release, then upgrade your build server + 1. Upgrade jenkins and the plugins separately + 1. Upgrade plugins one by one + 1. Maintain a roll-back strategy in case of Bad Things like this. + + + +So, we'll be publishing [Foundation Release 1](https://github.com/AAROC/CODE-RADE/milestones/Infrastructure%20foundation%20release%201) _as is_. Warts and all. What's in there will be in there, what's missing will come in [Foundation Release 2](https://github.com/AAROC/CODE-RADE/milestones/Infrastructure%20foundation%20release%202), scheduled for ***November 13 2015***. There should also be a first [Public Release](https://github.com/AAROC/CODE-RADE/milestones/CODE-RADE%20Public%20Release%201) on ***October 31 2015***. + + +# Then, Github died + +Ok, so builds weren't triggered... we needed to fix this and fast ! But this morning, we got another surprise : + + + + + +We're experiencing issues delivering webhooks to a small number of hosts as we mitigate a DDoS attack.
— GitHub Status (@githubstatus) October 23, 2015
+
+
+Sigh. Your pain is our pain @github
+
+hang in there @github - don't know what we'd do without you ! https://t.co/zWrPquMWUl
— SAGrid (@TheSAGrid) October 23, 2015
+
+
+
+# Footnotes and References
+
+[^Configs]: The job configurations are kept in xml format in `$JENKINSHOME/jobs`. These are kept in source control (actually a private Github Repository) - so it could not really have been such a huge disaster.
+[^HumanIntervention]: Ok, sometimes we humans intervene and trigger jobs, but ***only if they've been very naughty !***
diff --git a/_posts/2015-11-01-AnsibleBootCamp.md b/_posts/2015-11-01-AnsibleBootCamp.md
new file mode 100644
index 0000000..b61ea14
--- /dev/null
+++ b/_posts/2015-11-01-AnsibleBootCamp.md
@@ -0,0 +1,90 @@
+---
+layout: post
+title: 'An Ansible Boot camp'
+description: 'Time to get your training on'
+headline: 'Time to get your training on'
+category: blog
+tags: [blog, training, sci-gaia, ansible]
+image:
+ feature: '220110409213151001_4957481_ver1.0_640_480.JPG'
+ attribution: ""
+comments: false
+mathjax: false
+discourse: true
+---
+
+# TL;DR
+
+We teamed up with GARR to develop an intensive 5-day course for infrastructure operators, focussing on service federation and the DevOps movement. Using [Ansible](http://www.ansible.com), we went over the theory and practice of "Infrastructure as Code" with practical examples and lots of hands-on. This is still a work in progress, but will soon be published to [the Sci-GaIA e-Learning platform](http://courses.sci-gaia.eu). Watch [the repo](http://github.com/AAROC/AnsibleBootCamp) for more.
+
+# Ansible Boot camp
+
+
+Last week, we ran the first [Sci-GaIA](http://www.sci-gaia.eu) training course. The course was titled "[DevOps for Federation](http://agenda.ct.infn.it/event/1180/)" and was conducted at the INFN (Catania), by the Meraka Institute's [Bruce Becker](http://brucellino.github.io) and [Andrea Biancini](http://www.unimib.it/go/9216095476319321399/Home/Italiano/Elenco-Docenti/BIANCINI-ANDREA-dipartimento-di-fisica-giuseppe-occhialini) from [GARR](http://www.garr.it) (the Italian NREN) and the Bicocca University in Milan. The core technologies taught in this course were Ansible and Shibboleth
+
+
+
+## Off to a coding start
+
+As its name suggests, the course is intendend for those with almost zero prior knowledge. There are indeed certain prerequisites which are not covered in the course, such as knowledge of Linux shells. An understanding of `git`, `python` and `YAML` for the first part, as well as a basic understanding of the Apache web server configuration for the second part are suggested - and these can be accomplished by well-known online code schools
+The course is designed to be run stand-alone, with students taking it self-paced online. However, the material is modular and Open-Source, so it can be re-worked into university coursework or other technical training of a more formal nature. Much inspiration for the methodology was taken from the [Software Carpentry](https://software-carpentry.org/).
+
+## Two timely topics
+
+
+The course was separated into two sections -
+
+ 1. Theory and practice of DevOps with Ansible
+ 1. Turn your web service into a federated web service
+
+These addresses two of the aims of the Sci-GaIA project : ***development of African Identity Federations, and the support of e-Infrastructures in the region***.
+
+Taking identity federations as an example, as these are developed, the need for both identity providers as well as new services are going to be needed in the region. Since many countries are starting from scratch in their development of these federations, the administrators of new services are both learning how to develop them *and* operating them at the same time. There is therefore a great need for collaboration, knowledge dissemination and sharing, all of which are aspects of the DevOps movement. The tools of the trade may change from time to time, but the need to share best practice widely in a federation is a fundamental one.
+
+An identity federation is only as useful as the services it offers to users, and often integrating existing services into a new federation takes very long and can be tricky. This course therefore also targets those administrators or service developers who indeed want to open up access to their web applications to a wider community without the overhead of user management. During the course, we discussed not only the technical aspects of how to do this, but also the human and policy aspects of developing services.
+
+# Open, Reproducible, Community
+
+There are several online learning materials (and of course, TFM[^TFM] !) which address these issues of technology - so why make yet another online course ? The issue comes down to the development of community. While online code schools target mostly individuals, we wanted to target *communities* - in particular the NREN and e-Infrastructures communities. Particular emphasis is placed on making code open, maintainable, in adopting testing and verification strategies, and other good open source development practice. If, as the saying goes, *"everything is code"*[^EverythingIsCode], we wanted that code to be written well.
+
+# Everything is code
+
+We wanted the course to be *executable* in a sense. The sessions were taped on video, and will be available via the [Sci-GaIA Open EdX instance](http://courses.sci-gaia.eu), but that only addresses the student learning aspect. We also wanted it to be possible to give the course independently at a different institute, by different instructors. To this end, we have started working on the actual *course playbooks*[^playbooks]. The goal is that everything goes into [the repo](https://github.com/AAROC/AnsibleBootCamp); when someone wants to offer the course, everything that they will need will be available in the repository, except of course the online learning material such as videos and quizzes.
+
+Included in the repository will be both instructor material,
+
+ * **[Dockerfiles](https://docs.docker.com/reference/builder/)** necessary to build the training environment. Docker images will also be maintained on [Docker hub](http://hub.docker.com) for the instructor
+ * **Lesson guides** - text files describing what to cover, with notes on what to focus on and inputs to the lesson plan.
+ * **Evaluation playbooks** - playbooks which run against the student's work in order to check whether the lessons have been correctly done.
+
+as well as the student material:
+
+ * **Getting started guides** - summaries of the slides and common commands
+ * **Tutorial playbooks** - initial playbooks which teach the students aspects of the DevOps approach and which demonstrate the functionality[^againstImages]
+ * **Exercises** - both manual and coding exercises are foreseen. Most of them will be evaluated by playbook, so that they can be checked automatically.
+
+By putting in extra effort initially, we hope to make the course independently *executable* - meaning that a student can in principle use everything in the repo to both create the course and take it. The hope is that both individuals as well as small, new groups could use this as a learning and teaching resources, using it and contributing back to the course as time goes by, thereby helping to build a stronger community of technical expertise in our region.
+
+# Powered by you
+
+NREN's, grid and cloud services and data infrastructures are all powered by people at the end of the day. The Sci-GaIA project, through its member institutes, wants to leave a lasting impact on these _people_.
+
+**It will be of no use to anyone to build a fine infrastructure if it's not built to last.**
+
+# Coming soon
+
+So, watch this space and hopefully we'll be able to announce the full course at the [UbuntuNet Connect Conference](http://www.ubuntunet.net/uc2015) in Maputo later this month. In the meantime, watch the [repo](https://github/AAROC/AnsibleBootCamp) - or if you're really keen fork the repo and send us a pull request ! You'll be helping to build a better infrastructure in Africa.
+
+-----
+
+
+# Footnotes and References
+
+[^TFM]: The Fine Manual is always the best reference !
+[^EverythingIsCode]: "Everything is code" is an operations philosophy wherein configuration management, testing and continuous integration tools are heavily adopted in order to represent all services in an infrastructure in some form of programming language. This makes the wall between service developers and service operators far less opaque.
+[^playbooks]: ["Playbooks"](http://docs.ansible.com/ansible/playbooks.html) a concept in Ansible whereby it performs service orchestration. The concept is widely adopted as a strategy or tactics description in various sporting codes. (haha, get it - codes.)
+[^againstImages]: These are to be run against Docker images, or similarly prepared virtual machines, depending on the classroom environment, to demonstrate how the system works.
diff --git a/_posts/2015-11-06-SVG-2015-CVE-2015-7835.md b/_posts/2015-11-06-SVG-2015-CVE-2015-7835.md
new file mode 100644
index 0000000..8f6ae04
--- /dev/null
+++ b/_posts/2015-11-06-SVG-2015-CVE-2015-7835.md
@@ -0,0 +1,24 @@
+---
+layout: post
+type: status
+title: "A EGI SVG Advisory 'Critical' Risk 'Breakout' vulnerability for sites running Xen"
+description: 'EGI SVG 2015-7835 - Breakout risk where users have root on Xen VMs'
+headline: 'Tighten your Xen'
+category: security
+tags: [AAROC, CSIRT, operations, security, updates, CVE-2015-7835 ]
+image:
+ feature: 'atari_breakout_free_play.jpg'
+ attribution: "Courtesy, The Register - http://www.theregister.co.uk/2015/11/04/mozilla_patches_up_firefox_flaws/"
+comments: false
+---
+
+A critical vulnerability has been discovered in the [Xen hypervisor](http://xenbits.xen.org/xsa/advisory-148.html), allowing users **having root** access on the guest VM to "break out" of the context and attac the `dom0`. Xen is widely used in the [EGI FedCloud](https://www.egi.eu/infrastructure/cloud/), and is likely also used on various sites in the ROC.
+
+
+
+Recommendations
+===============
+
+All running resources deploying Xen MUST be either patched or have mitigation in place by **2015-11-10 T21:00+01:00.**
+
+Site administrators using Xen are requested to check the security advisory and take action if necessary, or risk suspension.
diff --git a/_posts/2015-11-09-CVE-2015-7183.md b/_posts/2015-11-09-CVE-2015-7183.md
new file mode 100644
index 0000000..270a3ec
--- /dev/null
+++ b/_posts/2015-11-09-CVE-2015-7183.md
@@ -0,0 +1,23 @@
+---
+layout: post
+type: status
+title: 'A CRITICAL-severity Remote arbitrary code execution vulnerability has been announced.'
+description: 'EGI SVG Advisory : Remote arbitrary code execution vulnerabilities in the core crypto library used by RedHat.'
+headline: 'Time to update or disable libnss'
+category: security
+tags: [AAROC, CSIRT, operations, security, updates, CVE-2015-7183 ]
+image:
+ feature: 'firefox.jpg'
+ attribution: "Courtesy, The Register - http://www.theregister.co.uk/2015/11/04/mozilla_patches_up_firefox_flaws/"
+comments: false
+---
+
+CSIRT has announced a [new vulnerability](https://wiki.egi.eu/wiki/SVG:Advisory-SVG-2015-CVE-2015-7183) Mozilla's `libnss`. This has been characterised as a **CRITICAL-severity** vulnerability, since it allows arbitrary remote code execution.
+
+The fix is particularly easy. See the instructions on the [EGI SVG wiki](https://wiki.egi.eu/wiki/SVG:Advisory-SVG-2015-CVE-2015-718).
+
+-------
+
+For any support or questions, contact the [SANREN CSIRT](mailto:csirt@sanren.ac.za), or hook us up on Slack
+
+-----
diff --git a/_posts/2015-11-19-UC2015.md b/_posts/2015-11-19-UC2015.md
new file mode 100644
index 0000000..5735d60
--- /dev/null
+++ b/_posts/2015-11-19-UC2015.md
@@ -0,0 +1,133 @@
+---
+layout: post
+title: 'Back home someplace new'
+description: 'Thoughts and observations from UC2015'
+headline: Ubuntunet Connect 2015 - 19-20 November 2015
+#modified: '2015-11-18'
+category: blog
+tags: [Ubuntunet Connect, conference, commentary, community]
+image:
+ feature: CUSOq4xUwAAZCJn.jpg
+ attribution: 'Image courtesy of Katrin Stover - https://twitter.com/Cat_Stover/status/668408267098443777'
+comments: false
+discourse: true
+---
+
+# Back home
+
+Everybody has a place that they like to call home. It may be a place, or it may be a group of people - and coming back to an Ubuntunet Connect meeting felt a bit like this for me - coming home. It's a community meeting of people who are sincerely engaged with their constituents and are committed to making a difference to research communities in the long run. Most of us there know how little positive feedback there is in developing an NREN - when the bandwidth is slow and the services don't work, we hear complaints and murmurings of discontent, but when everything _works_, we hardly ever get a pat on the back for a job well done. When the network works, it disappears (as most well-functioning techonlogy). Yet, despite the often lacking feeling appreciation from user communities, the NREN community is really close and there's plenty of support from within.
+
+So, this was the first time in Mozambique for me, and the *n-th* time "back home" in Ubuntunet's annual meeting. The conference was held over 19 - 20 November in Maputo.
+
+# Looking back...
+
+This event was an especially important one for two reasons : for one thing, it's Ubuntunet's 10-year birthday :tada:. Now, you can write your own "where was I ..." anecdote in the comments; in my case, ten years ago, I was in the thick of my Ph.D. at the University of Cape Town, working on the [ALICE](http://alice-collaboration.web.cern.ch/) experiment at [CERN](http://cern.ch). Part of my job was developing software for the alignment of the Dimuon spectrometer of the ALICE experiment, but we were also tasked with building part of the [Worldwide LHC computing Grid](http://wlcg.web.cern.ch/). Turns out it's quite hard to do that without a network...
+
+Skip ahead 10 years and in South Africa we're running jobs like a boss at several sites in the WLCG, including ALICE jobs at the [Centre for High-Performance Computing](http://www.chpc.ac.za)
+
+Bruce Becker
+ +---- + +Back home (sweet home) from the exciting UbuntunetConnect conference in Maputo! @UbuntuNet @AfricaConnect2 pic.twitter.com/hkfv7cNsGb
— Cathrin Stöver (@Cat_Stover) November 22, 2015
+
+
+-----
+
+# Footnotes and References
+
+[^NotSimple]: It should be pointed out that if one were to try and figure out who could take credit for this work, we'd be here until :santa: :christmas_tree: ... let's all just be happy that it works :smile:
+[^cas4nren]: Thanks to Katrin Stover for reminding me of this great website.
+[^VidyoMconf]: See [Kasandra's talk](http://www.ubuntunet.net/sites/default/files/23.%20Isaac%20-%20UbuntuNet%20presentation_KIsaac.pdf) on Mconf and [Rob's talk](http://www.ubuntunet.net/sites/default/files/27.%20Bristow%20-%20Rob%20Bristow%20for%20UConnect15.pdf) on Vidyo.
+[^somethinglikethat]: Or something like that - it sounded right at the time.
+[^Durban]: The next Ubuntunet Connect will be held in Durban, which is _very_ warm :smile:
diff --git a/_posts/2015-12-07-CODE-RADE-Foundation-Release-1.md b/_posts/2015-12-07-CODE-RADE-Foundation-Release-1.md
new file mode 100644
index 0000000..e24ab0a
--- /dev/null
+++ b/_posts/2015-12-07-CODE-RADE-Foundation-Release-1.md
@@ -0,0 +1,166 @@
+---
+layout: post
+title: 'CODE-RADE Foundation Release 1'
+description: 'Stuff you can use to build other stuff and a few demo applications'
+headline: "It's finally public"
+category: blog
+tags: [blog, CODE-RADE, Release]
+image:
+ feature: tumblr_mw87ofGfHW1sfie3io1_1280.jpg
+ attribution: "Image courtesy of New Old Stock - http://nos.twnsnd.co/image/69699793933"
+comments: false
+mathjax: false
+discourse: true
+---
+
+
+- [Announcing CODE-RADE Foundation Release 1](#announcing-code-rade-foundation-release-1)
+- [Goal and Design](#goal-and-design)
+ - [CODE-RADE is Open Source](#code-rade-is-open-source)
+ - [Targets](#targets)
+ - [Artifacts](#artifacts)
+ - [Dependencies](#dependencies)
+ - [Build Configurations](#build-configurations)
+- [Repositories](#repositories)
+- [Using CODE-RADE](#using-code-rade)
+- [Roadmap and planning](#roadmap-and-planning)
+
+
+# Announcing CODE-RADE Foundation Release 1
+
+We are pleased to announce the first **Foundation Release** of the CODE-RADE project :
+
+Continuous Delivery of Research Applciations in a Distributed Environment.
+ +Build Test Execute Everywhere
+SITE | A code used to describe the particular nature of the site. Currently only generic is used for all sites. |
ARCH | The CPU architecture used at the site. Currently only x86_64 is used for all sites. |
OS | The operating system used at the sites. Currently only sl6 and u1404 are used for RedHat6 and derivatives and Ubuntu 14.04 LTS are used respectively |
fastrepo: | +Repository containing all successful builds | +
devrepo: | +Repository containing successful builds which have been tested by humans | +
apprepo: | +Repository containing all production software used at all sites. | +
fastrepo
. Fastrepo is configured to contain every application which passes automated tests. While we _do_ insist that users who propose applications include these tests in their build scripts, there is currently no actual independent check on the build artifacts to see whether they are beningn and actually executable from the repository. There are _impicit_ checks in the sense that if the application needs components which are not in the repository and not available in the execution environment, then builds will fail, but the main point is that we don't actually check that the scripts provided by the user are actually building anything. There is also the technical aspect of the CVMFS repository, since repositories need to be declared "volatile" if they are expected to be changing rapidly.
+
+
+## Human checks
+
+So, we have a tradeoff between automation and certification, by separating the build artifacts into separate CVMFS repositories. Everything that passes goes into fastrepo
, and things that are checked by humans go into the next repo - devrepo
. This process requires a recompilation to point the code to the new filesystem root, and we haven't implemented that yet.
+
+The current repository fastrepo
is currently the only one with the full set of applications, and is continuously integrated and delivered. We will be implementing staged delivery from Foundation Release 3.
+
+# Foundation Release 2
+
+We have released only one Foundation ([Foundation Release 1]), which contained a basic set of tools necessary to build other tools. Foundation Release 2 will include :
+
+ * further base libraries which are not guaranteed to be available on the execution nodes[^SameVersion]
+ * More versions of math libraries such as various versions of, BOOST, LAPACK and BLAS, as well as sparse matrix libraries in SuiteSparse
+ * More versions of the GCC compiler and MPI libraries, including MPICH[^OpenMPI].
+ * I/O libraries such as HDF5
+ * common tools such as gnuplot, octave
+ * Python and associated libaries and such as the SciPy suite.
+
+This Foundation Release will allow users to build a wider set of useful applications, thanks to the wider set of libraries which can be used. These applications will be included in the Public Releases.
+
+**Foundation Release 2 is scheduled for 1 March 2016.**
+
+# Public Release 1
+
+Public Releases include the _end-user_ applications. For Public Release 1, these include :
+
+ * [AbInit](http://www.abinit.org)
+ * [GAMESS](http://www.msg.ameslab.gov/gamess/)
+ * [Repast Symphony](http://repast.sourceforge.net/)
+ * [ABySS](http://www.bcgsc.ca/platform/bioinfo/software/abyss)
+ * [OpenFOAM](http://www.openfoam.org/)
+ * [AutoDock](http://www.openfoam.org/)
+ * [Velvet](https://www.ebi.ac.uk/~zerbino/velvet/)
+ * [OASES](https://www.ebi.ac.uk/~zerbino/oases/)
+ * [GROMACS](http://www.gromacs.org)
+ * [WEKA](http://www.cs.waikato.ac.nz/ml/weka/)
+ * [WRF](http://www.wrf-model.org)
+ * [PLink](http://pngu.mgh.harvard.edu/~purcell/plink/)
+ * [HEASoft](http://heasarc.nasa.gov/lheasoft/)
+ * [Pythia8](http://home.thep.lu.se/~torbjorn/Pythia.html)
+ * [freefem++](http://www.freefem.org/ff++/)
+ * [CosmoMC](http://cosmologist.info/cosmomc/)
+ * [Gadget-2](http://wwwmpa.mpa-garching.mpg.de/gadget/)
+ * [HTK](http://htk.eng.cam.ac.uk/)
+ * [MITLM](https://github.com/mit-nlp/mitlm)
+ * [quantum-espresso](http://www.quantum-espresso.org/)
+ * [GAMA-platform](https://github.com/gama-platform/gama/wiki)
+ * [IMA2-deploy](https://bio.cst.temple.edu/~hey/software/software.htm)
+
+The full list of applications and their state can be seen at [africa-grid.org/applications](http://www.africa-grid.org/applications)
+
+**Public Release 1 is expected on 30 April 2015**.
+
+# Collaborating.
+
+The CODE-RADE project has been designed with the lowest possible barrier to entry and contrbutions and collaborators are very welcome. There are several ways in which you could contribute or collaborate :
+
+## Requesting new applications
+
+If you would like to have an application included in CODE-RADE, simply [make a request](https://github.com/AAROC/CODE-RADE/issues/new?title=%22Application%20Request%22&labels=request). The collaborators will evaluate the request and decide on which release (and thus priority) it should be assigned to, based on the dependencies and complexity of the application.
+
+## Bring your own application
+
+If you are entirely responsible for your application, we can create the job in Jenkins and allow you to independently develop the scripts which build and deploy it. Self-service !
+
+
+## Improve and learn
+
+If you would like to help us improve the system, or individual sub-projects in CODE-RADE, there are many ways to do this. You can adopt an application which is currently failing and help us diagnose build failures. Code review is also a helpful way of improving the quality of the project.
+
+
+## Request CODE-RADE at your university or lab
+
+If you're interested in using CODE-RADE, why not ask the administrator of your local computing facility to enable it. Adding CODE-RADE to a site is a once-off procedure, since the project is designed to reduce overhead for system administrators. See the [Africa-Grid website](http://www.africa-grid.org/cvmfs/) for instructions.
+
+
+
+
+# CODE-RADE works Open
+
+Everything in CODE-RADE is Open with a capital O. From the design to the process to the validation, we welcome input and contrbutions from any researcher with an interest in delivering and using high-quality, easy-to-use research applications. Here are some contact points :
+
++ +# Footnotes and References + +[^OpenMPI]: We initially only served OpenMPI, however some applications such as WRF require MPICH explicitly. +[^SameVersion]: These include widely-used, but sometimes absent libraries, such as bzlib, curl, freetype, libpng, sqlite, tcltk, _etc_. In most cases, we build the same version as is by default found in the OS repositories is built, along with the most recent version. diff --git a/_posts/2016-01-12-CODE-RADE-modules.md b/_posts/2016-01-12-CODE-RADE-modules.md new file mode 100644 index 0000000..ad7be6e --- /dev/null +++ b/_posts/2016-01-12-CODE-RADE-modules.md @@ -0,0 +1,72 @@ +--- +layout: post +title: 'CODE-RADE submodules' +description: 'Consolidating work' +category: blog +tags: [blog, CODE-RADE, Release] +image: + feature: tumblr_mxah7dcExT1sfie3io1_1280.jpg + attribution: "" +comments: false +mathjax: false +discourse: true +--- + +# TL;DR - All the apps we build and test are linked from a single repo. + +This is just a short update on progress with the CODE-RADE project with a description of where to find the code and how to contribute. + +# How testing works. + +A huge aspect of CODE-RADE is modularity - we build and test nodes in a dependency tree, from base dependencies all the way up. Instead of providing a single binary result (yes, the repo is working, no there are problems), we provide a result for each node in the tree. Specifically, that means that every application is compiled against its dependencies and tested before the next node in the tree is done. + +A second aspect of CODE-RADE is continuous integration - tests would run at _every commit_ of code to a repository. Modularity implied that only the node that has changed should be tested, and that this test should trigger all of the upstream tests in order to see if there were regression problems. The alternative would be to have monolithic testing where the full tree was traversed on a predetermined schedule, taking into account any changes that had been made. + +While these two approaches are not necessarily contradictory, the first had the agility which we felt was one of the strong points of CODE-RADE for community adoption, and the benefit of giving fairly fast responses[^fast] to any changes made by a contributor. + +Originally, we had the idea that everything would go into a [single repository](https://github.com/SAGridOps/SoftwareInstallation), making it easy to publish and collaborate. However, when it came to configuring the triggers of the Jenkins, it was easiest to have a single repository to listen to: + + + + + +This meant that we made the choice to separate each node in the dependency tree into its own git repository - most of them under the [SouthAfricaDigitalScience Github organisation](https://github.com/SouthAfricaDigitalScience/). This made testing the components easier, as well as the creation of the dependency tree - and while all of the repos were in one organisation, it may even be manageable - but as soon as we start including different repos, the complexity may become an inhibiting factor. + + + +So we have a dilemma : In order to keep testing atomic, we need to have individual repositories for nodes in the dependency graph, but in order to present a coherent code base to promote collaboratation, we need a single repository ? + +# Git submodules to the rescue. + +Fortunately, this is an issue often encountered by software built on dependencies, with external plugins or similar. One of the most common solutions to the problem is to add the external bits as [git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules). Indeed from the git submodules documentation[^submodules] : + +> It often happens that while working on one project, you need to use another project from within it. Perhaps it’s a library that a third party developed or that you’re developing separately and using in multiple parent projects. A common issue arises in these scenarios: you want to be able to treat the two projects as separate yet still be able to use one from within the other. + + +This indeed seems like our case. We want to have a single point of entry for collaborators and applications - [the CODE-RADE main repository](https://github.com/AAROC/CODE-RADE), while still keeping the modularity which allows atomic testing and integration. + +# Onward, then ! + +So, I've started adding submodules to a [subdirectory](https://github.com/AAROC/CODE-RADE/tree/master/applications) of the CODE-RADE repo, and will soon have all of them included. The CODE-RADE repo itself will not get tested, but it will be possible to fork it including the submodules and send pull requests. These will get tested only by the specific job which is configured to listen to changes in the submodule repository, _i.e._ if changes are made in the `gcc-deploy` submodule, and this pull request is sent to the CODE-RADE repo, only the [gcc-deploy](http://ci.sagrid.ac.za/job/gcc-deploy/) job will get triggered. + +Modules, yo. + +For more information, see the [build server](http://ci.sagrid.ac.za) +
Name | +Dependencies | +Comment | +
GAMESS | +HDF5 | +Dependencies all fulfilled, but not tested locally | +
Repast Symphony | +Java | +Dependencies all fulfilled, but not tested locally | +
ABySS | +BOOST, Sqlite, SparseHash | +SparseHash is not yet in Foundation Release, but is WIP. | +
OpenFOAM | +BOOST, OpenMPI, gnuplot, readline, ncurses | +gnuplot is not yet in Foundation Release.. The OpenFOAM job and repo are present, but only the build script is prepared. | +
AutoDock | +None, apparently | +Low hanging fruit ? Need to add the scripts to the repo and create the Jenkins job. | +
Velvet | +OpenMP | +Low hanging fruit ? Need to add the scripts to the repo and create the Jenkins job. | +
OASES | +OpenMP, zlib, Velvet | +Low hanging fruit ? Need to add the scripts to the repo and create the Jenkins job. | +
WEKA | +Java JDK | +JDK has been added with build 113 of fastrepo and WEKA has been tested manually. Compilation is not clear yet. | +
PLink | +zlib (uses it's own compiled version), LAPACK | +Manual tests have passed. | +
Pythia8 | +Several CLHEP and CERN libraries necessary | +This one will take a while still. | +
FreeFem++ | +GSL, OpenMPI/MPICH, PETSc, LAPACK, BLAS, SuiteSparse, FFTW3, HDF5. | +Most of these can be downloaded by the compilation scripts proivded by the package, but that would be a bit couter to the CODE-RADE philosophy. | +
CosmoMC | +pmclib, CAMB, GSL, FFTW3, LAPACK, WMAP, fitsio | +WMAP, pmclib, CAMB and WMAP are missing. The rest have been integrated. CAMB needs HealPix and Fisher. Work has started on Healpix | +
Gadget 2 | +FFTW2, GSL, HDF5 | +Work has started, the repo has been created as well as the job. Check and deploy scripts are still to be committed. FFWT2 needs to be compiled with MPICH, it is currently only compiled with OpenMPI | +
HTK | +none | +Low hanging fruit ? Need to add the scripts to the repo and create the Jenkins job. | +
MITML | +none | +Low hanging fruit ? Need to add the scripts to the repo and create the Jenkins job. | +
GAMA-Platform | +Java JDK | +JDK has been added with build 113 of fastrepo and Gama has been tested manually. Compilation is not clear yet. | +
IMA-2 | +none | +Low hanging fruit ? Need to add the scripts to the repo and create the Jenkins job. | +
Site | Logical CPUs | CPU Vendor | Clock Speed | SMP Size | +
---|---|---|---|---|
ZA-WITS-CORE | 280 | Intel | 1900 | 13 | +
ZA-UJ | 2018 | AMD | 2600 | 8 |
ZA-CHPC | 4032 | Intel | 2800 | 48 |
Site | Total Online Storage (GB) | Available Online Storage (GB) |
---|---|---|
ZA-UJ | 2931 | 1962 |
ZA-WITS-CORE | 10491 | 524 |
make
. Speeding up a build usig make is often possible, depending on the resources available, by passing the -j <integer>
flag where integer
specifies the level of parallelism requested. See [GNU Make documentation on parallel builds ](https://www.gnu.org/software/make/manual/make.html#Parallel).
+
+[^ParAnt]: See [Ant documentation](http://ant.apache.org/manual/Tasks/parallel.html)
+[^ParNinja]: See [Ninja's comparison to make](https://ninja-build.org/manual.html#_comparison_to_make)
+[^DockerSingleProcess]: See [the Docker best-practices guide](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/run-only-one-process-per-container)
+[^DockerEphemeral]: See the [Docker best-practices guide](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#containers-should-be-ephemeral)
diff --git a/_posts/2017-01-11-How-To-ROD.md b/_posts/2017-01-11-How-To-ROD.md
new file mode 100644
index 0000000..666cb22
--- /dev/null
+++ b/_posts/2017-01-11-How-To-ROD.md
@@ -0,0 +1,121 @@
+---
+layout: post
+title: 'How to ROD'
+description: "Taking the bull by the nose ring"
+headline: ' '
+category: blog
+tags: [AAROC, EGI, ROD, procedures, blog]
+image:
+ feature: tumblr_oihkemAUKP1sfie3io1_1280.jpg
+ attribution: "Image courtesy New Old Stock"
+comments: false
+mathjax: false
+discourse: true
+---
+
+# 2017 : Off to a ... start.
+
+Once more round the sun we go. Oh yay. Whatever, the holidays are over, we'd best just get used to the idea.
+
+ All the same, it's time to get the year off to a solid start in the Africa-Arabia Regional Operations Centre. The main activity that we undertake here is to ensure operations coordination, which is the responsibility of the so-called **Regional Operator on Duty**, or ROD. The term was coined long ago during the EGEE projects, and survived into the current EGI world of federated infrastructure.
+
+> ROD (Regional Operator on Duty) is a role which oversees the smooth operation of EGI infrastructure in the respective NGI. ROD team is responsible for solving problems on the infrastructure within own Operations Centre according to agreed procedures. They ensure that problems are properly recorded and progress according to specified time lines. They ensure that necessary information is available to all parties. The team is provided by each Operations Centre and requires procedural knowledge on the process. The role is usually covered by a team or people and is provided by each NGI. Depending on how an NGI is organised there might be a number of members inthe ROD team who work on duty roster (shifts on a daily or weekly basis), or there may be one person working as ROD on a daily basis and a few deputies who take over the responsibilities when necessary. This latter model is generally more suitable for small NGIs.
+>
+> the [EGI description of Regional Operator On Duty](https://wiki.egi.eu/wiki/Regional_Operator_on_Duty)
+
+## Operations == Stability
+
+Operations is a plce where you typically want as little as possible to change. The art of ROD is making sure that there is as little disruption as possible to the services in the federation. Of course, things _do_ happen from time to time (and yes, bad things also happen). Avoiding these disruptions is in practice impossible, so the responsibility of ROD is to ensure that the relevant actors are informed and that any mitigating actions necessary are taken.
+
+This typically means checking the [ROD dashboard](https://operations-portal.egi.eu/rodDashboard/ngi/AfricaArabia/) on the [Operations Portal](https://operations-portal.egi.eu/) for new alarms from the [ARGO](http://argo.egi.eu/) monitoring service. When there's a new alarm generated by ARGO due to a service failure or problem, a [GGUS ticket](http://ggus.eu/) is opened by ROD and assigned to the site. Already open tickets are checked on, to see whether the probe that generated them has changed state (we always hope for the beloved green probe, meaning that the issue has been fixed); if not, an update is requested from the responsible site.
+
+The [Site Operating Level Agreement](https://documents.egi.eu/document/31) describes the acceptable levels of availability and reliability of services (A/R), and the expected timeframes within which issues should be addressed. If issues are not fixed or acknowledged by the site administrator within the timeframe specified in the OLA (typically 5 working days), the ticket starts to **expire** and should be **escalated** by ROD, to a relevant support unit perhaps in the case that expert advice is needed. The goal is to always achieve maximium **reliability** even when services aren't 100 % **available**.
+
+## Stability == Good communications
+
+This emphasis on reliability even in imperfect operating conditions translates to humans taking appropriate actions. They may require just a short amount of time, and minimal effort but help to keep user communities and peer infrastructures alike informed of the state of our services. Most importantly, however, ROD has to ensure that where support is required at site-level, that the experts who can provide that support are informed and are able to help. The worst-case scenario is where a site administrator is told that they have problems at their site, but have not idea how to fix it, and feel that they have been abandoned to their fate by a team that instead was supposed to support them.
+
+The relationship beteween the sites (and of course the people who staff them) and the Regional Operations Centre is a deicate one, based on compromise and mutual support, for the greater benefit of infrastructure over the limited benefit of isolated control. Often the need to respond to operations issues, make changes to serivces, or indeed maintai services necessary for interoperation can seem like unnecessary overhead to a site administrator which has to deal with the incessant demands of an active local user group. It's ROD's job therefore to ensure that the federation's need for a transparent and reliable infrastructure are met, as well as the site's need to satisfy their users' demands, local policies and the demands that the rest of their job makes on their time.
+
+# How we roll.
+
+The ROD duty is in principle shared amongst two institutes in the region - CSIR Meraka and CNRST. Since the activity is not very demanding for experienced operators, it is usually done by CSIR Meraka. A few minutes each day (typically 2 [pomodoros](https://en.wikipedia.org/wiki/Pomodoro_Technique) :tomato: ) is sufficient to go through the alarms, tickets and issues, reminding the people that they've been assigned to that action is needed, and closing them where possible.
+
+## Duties and procedures
+
+The ROD Duties are well-described on the [EGI Wiki](https://wiki.egi.eu/wiki/ROD_Duties). Quoted from their wiki page :
+
+> The ROD on duty is required to:
+>
+> - check alarm notifications in the Dashboard at least twice a day;
+> - close alarms which are in the OK state;
+> - handle non-OK alarms less than 24 hours old (notify the site administrators according to your NGI's procedures);
+> - create tickets for alarms older then 24 hours that are not in an OK state;
+> - escalate tickets to NGI Management/EGI Operations if necessary (in the Dashboard);
+> - monitor and update any GGUS tickets up to the solved status (preferably via the Dashboard);
+> - handle the final state of GGUS tickets not opened from the Dashboard by changing their status to verified.
+
+Complementing this list of duties is an outline procedure to be followed. Following common procedures is an important part of ensuring interoperability between AAROC and other infrastructures. For this reason, we try to follow the [standard operation procedures](https://wiki.egi.eu/wiki/PROC01_EGI_Infrastructure_Oversight_escalation) when addressing issues.
+
+
+
+While the operations portal really helps in ensuring that raised alarms are indeed associated with a ticket, the last item in the list of the ROD's duties - _"handle the final state of tickets not opened from the Dashboard"_ - is not the easiest thing in the world to keep track of. Especially since a few times issues are not specifically related to the _operations_, but rather various _campaigns_ which are undertaken either at the ROC or EGI level. Keeping track of these - specifically their deadlines and followups - is a black art.
+
+# Things we do in Africa-Arabia
+
+Every region or NGI organises things their own way. Some have weekly meetings face-to-face, some rely on common task trackers, email lists, whiteboards, etc. We have the privelige of living in the largest region (bar, perhaps, Russia) that EGI interoperates with, and have sites which are vastly different between them, both in the nature of the hardware and services, as well as the actual people who staff them. In the early days of SAGrid, we had the luxury of at least inhabiting the same country, speaking the same language, being more or less on the same technical level. With the fusion of ex-SAGrid sites with the ex-EUMedGrid sites during [CHAIN](http://www.chain-project.eu), we were able to operate at a large scale, thereby making interoperation with peer infrastructures feasible, but we also introduced some new complexity.
+
+Too much complexity can cause chaos, and inhibit the capacity of a system to do work (in a thermodynamic sense, you understand), but just the right amount can be a good thing. In order to organise the work that's requested of the sites, we need tasks to be properly assigned, with clear responsibilities, deadlines and checking. Often this is done with a periodic teleconference where a task list is taken item by item to get feedback and see what still needs to be done. In my opinion however, this is more of a time-eater in an environment which is already tight on that precious commodity, so we turned to the web to make things better.
+
+## Slack
+
+We use Slack a lot at the [Africa-Arabia Regional Operations Centre Slack](https://africa-arabia-roc.slack.com), for all kinds of situational awareness and collaboration. We have an operations channel for each site, which typically only has the site admin for that site in it, as well as anyone who is working on technical issues related to the site. The idea here is to keep things focussed. ROD also creates a new channel each month to give the the operators a place to discuss quickly whatever issues are faced by the region as a whole. Some pertinent aspects of this channel :
+
+ * **Operators Only**: Only site operators and bots which help operations issues are in the chanel.
+ * **Issues at scale**: The channel is for dealing with collective issues, not site-specific issues. There are dedicated channels for that.
+ * **Get Stuff Done ™**: Or in other words : "A little less talk, a little more action please". This is not a place for discussion, but for ensuring that people are informed of relvant issues timeously.
+ * **Best Before**: The channel lasts a month. This makes it easy to summarise the events of the month into a handover message.
+ * **Bots, bots bots**: We use several bots and integrations to help us keep track of who needsd to do what.
+
+The builtin `/remind` command in slack helps ROD and operators to gently remind each other of things that need to be looked at by a particular time. The Trello integration is also very useful in organising work.
+
+## Trello Board
+
+The Africa-Arabia Regional Operations Centre [Trello Board](https://trello.com/b/WmqbaO8t/operations) is organised into columns per-site, as well as an incoming "triage" column, and a ROD column. The site columns are integrated into the site-specific ops channel in slack, so that changes to cards in those columns are propagated specifically to the people in the channel responsible for the site.
+
+Site operators can also create cards for ROD, triage etc on Trello directly from Slack using the `/trello` integration. This makes it much easier to stay in Slack and update ROD and other teammates on progress or new issues, as well as file tasks away as "done". Another great thing about Trello is the ability to update cards via email.
+
+One of the things we've got in "triage" is the full list of GGUS tickets :
+
+This allows ROD to keep a more comprehensive list of GGUS tickets than are present on the ROD dashboard, as well as add other issues or tasks that need to stay in context.
+
+
+## Discussion Forum
+
+Finally the ability to generate and retain knowledge about technical issues was for a long time relegated to the capability of individuals to trawl their email to find that one mail that contained the magic fix for the thing that keeps breaking. Well, clearly there are better ways of communicating and remembering things than using email. Slack isn't great for this either since it's a more private, real-time place to chat, so we've turned to [Discourse](http://discourse.org) to build a discussion forum where longer-form discussions can be started - and most importantly _ended_ - by marking them as "solved".
+
+The [African e-Infrastructures Discussion Forum](http://discourse.sci-gaia.eu) has a category related to [GridOps](http://discourse.sci-gaia.eu/c/devops/gridops) category which is starting to gain traction.
+
+# Let's get it together in '17
+
+So, the tools are pretty much in place to make sure that we can sustain stable operations in 2017. Whether or not we actually do, as a ROC or as individual sites, really depends on our commitment to respecting the procedures we've set out - discussing them and updating them where necesary, but most importantly sticking to them for the most part. Let's get the year off with the traditional "New Year's resolution". Although 2017 promises to be a year of tremendous activity and very demanding, let's set a few goals for ROD this year :
+
+ 1. **Honour the Deal**: We will try to stick to the deadlines specified in the [ROD procedure](https://wiki.egi.eu/wiki/PROC01_Grid_Oversight_escalation)
+ 1. **Use Downtimes better**: We will put sites into downtime rather than allow tickets to expire
+ 1. **Improve Core Services**: Site A/R has often suffered from problems in core services. We need to improve the performance of these, and be more proactive on dealing with issues which impact them.
+ 1. **Tell the story**: We undertake to write a monthly summary of the region's infrastructure status and issues, by summarising the ops channel for that month, and writing a handover blog post.
+
+
+-----
+
+Ok, 2017. Time to take you on.
+
+
diff --git a/_posts/2017-01-13-New-DevOps-Start.md b/_posts/2017-01-13-New-DevOps-Start.md
new file mode 100644
index 0000000..e12f172
--- /dev/null
+++ b/_posts/2017-01-13-New-DevOps-Start.md
@@ -0,0 +1,64 @@
+---
+layout: post
+title: 'A new start for AAROC/DevOps'
+description: "Detaching AAROC/DevOps from it's past"
+headline: "Detaching AAROC/DevOps from it's past"
+category: blog
+tags: [AAROC, code, DevOps, Github]
+image:
+ feature: separate.jpg
+ attribution: "cc-by Mandy Goldberg on Flikr"
+comments: false
+mathjax: false
+discourse: true
+---
+
+A few years back, we came to the conclusion that operating services manually was a pretty bad idea. The feeling that the proper configuration of grid middleware[^gLite32] was a dark art was pervasive - so many configuration files, so many separate services, so many configuration options ! Impossible to do _right_, impossible to _test_ and most of all, no way to keep knowledge about _what_ was supposed to be done, let alone _how_ it was supposed to be done. Deploying new sites or even individual services had to be done with the physical presence of an experienced operator, and rarely was there enough time to transfer whatever knowledge that person had to the staff at the new site.
+
+# Genesis of DevOps in AAROC
+
+During the [All-Hands meeting](http://agenda.ct.infn.it/event/895/)[^AllHands] in Pretoria, we had a few good presentations[^HazelhurstPuppet] [^KannelopoulosAnsible] on tools which we used by site administrators. The term "DevOps" was new back then and just gaining traction as a practice, but this meeting was the genesis of what would be come a rich and widely-used repository of code for the services in the Regional Operations Centre. Originally only [Puppet](https://puppet.com/), and then [Ansible](http://www.ansible.com) were used - a precursor to the many, many tools which would come in the future, particularly to manage cloud and container platforms. However, we have never argued about which tool is the right one, or tried to standardise on _one_, because the important thing is that whatever service is being offered to the community, that it is reliabily and reproducible deployable. The concept of "executable infrastructure" has been put forward several times[^ExeInfraUC2015] [^ExeInfraDI4R] as encapsulating this idea.
+
+# Much more than Operations
+
+We've worked hard to promote the DevOps culture in the region, because we're a distributed, multi-cultural group of people with widely varying skill sets. This diversity is a great asset if it can be properly harnessed, and if the right level of adherence to common practice and empathy with those who may do things differently from you can be achieved. The repository of code has really helped us deploy services in new places, better debug issues, manage upgrade cycles, middleware releases, etc. However, the importance of this repository extends far beyond the important, but somewhat staid world of infrastructure operations. We use it to generate documentation, research output and even run training and teaching events.
+
+## Documentation
+
+Much of the need for a DevOps culture is for increased transparency in the _procedures_ - the need for them to be reproducibly executed by even new members of the collaboration. The tools which are used to _implement_ this culture go a long way to reducing the need for "manuals" and other forms of documentation. In the case of Ansible playbooks, the code itself is as easy to read as it is to write, which is to say that it is written in "plain English." This is all well and good as far as it goes, but what about our colleagues whose first language is _not English_, but French, Arabic, Aramaic, Yoruba, _etc_ ? No matter the level of intent to keep code expressive and clear, there is always some level of connotation or opacity in the way things are implemented, if you're new to the project, so some form of "getting started" manual for service deployment is necessary. There are some steps, for example, which are not automatable (such as site-specific variables or passwords), and thus need to be described specifically for human consumption.
+
+The typical procedure for writing this information is to maintain it in the "README" file of the module, role _etc_ which is being used. We have been using [`mkdocs`](http://www.mkdocs.org/) to generate html documentation from these README files, which are typically written in Markdown or RST. This documentation is currently hosted at [afica.grid.org/DevOps](http://www.africa-grid.org/DevOps)[^WIPYO].
+
+## Review and Publication
+
+[AAROC/DevOps](https://github.com/AAROC/DevOps) aims to be an executable expression of our _actual infrastructure_. It is both a software package as well as a dataset, and as such needs to respect a few quality criteria - it should for example be tested at some level, and the contents should have undergone some level of peer review and discussion where appropriate. [Recent additions]() to the Github API[^GithubAPI] allow [protected branches](https://help.github.com/articles/about-protected-branches/), which repo maintainers can enforce code review on, such as automated testing and [review by actual humans](https://help.github.com/articles/approving-a-pull-request-with-required-reviews/). While we still have a long way to go to improve the quality of these outputs, we have started to publish the repository release via [Zenodo](https://zenodo.org). Assigning DOIs to code which represents the specific state of infrastructure is a good way to get credit for work done.
+
+## Teaching
+
+At the end of the day, code has to be written by _people_ - developers. Sure, the AI revolution may be right around the corner, but until we get there, our best bet for taking the collaboration forward sustainably, is to have as many people as possible capable of reading and writing the code for services. More eyes can also translate into better reviews, and therefore better tested and more widely-used code. To this end, we've been working on a companion repository to DevOps, specifically to improve the capability of people we potentially may be working with in the region to use Ansible[^WhyAnsible]. This repository can be used to deliver a short, self-contained course[^BootCamp]. The general idea is to fork the ["Software Carpentry"](http://www.software-carpentry.org) idea into an "Infrastructure Carpentry" concept... Something to blog about another time though.
+
+# Time to stand on our own feet.
+
+We originally forked an existing repository to get started, and eventually stabilised on [DevOps repo for the region](https://github.com/AAROC/DevOps). Since the fork of the [GRNET Ansible code for grid services](https://github.com/auth-scc/grid-services-deployment) way back in 2013, there have been some major changes.
+
+Several releases of Ansible have come out, some of them major, with backward-incompatible code; a full refactor of the code was done[^DevOps2015]. We have also added several services in the identity-management, application delivery and cloud service deployment areas which are not specifically for grid infrastructures. There was also a large re-organisation of the repository to accommodate site-specific code, from whatever tool they are using.
+
+The repository has taken on a life of it's own. With [8 releases](https://github.com/AAROC/DevOps/releases), [12 contributors](https://github.com/AAROC/DevOps/graphs/contributors), [24 forks](https://github.com/AAROC/DevOps/network) and just over [1700 commits](https://github.com/AAROC/DevOps/commits/master) to the master branch, it has totally diverged from the original repository from which it was forked. This has started to create some issues - [particularly in the way contributions are counted](https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile/#commit-was-made-in-a-fork), and [the way in which GitHub indexes forks](http://stackoverflow.com/questions/33626326/how-to-search-a-github-fork-for-code-using-the-github-search-api) for searching. The time has come to detach the repository from the network it was forked from, and live it's own life.
+
+Apparently, though, [this is not trivial](https://www.quora.com/Git-revision-control-How-can-one-detach-a-forked-project-in-GitHub) - although it's certainly possible. Simply creating a new repository and populating it with the content of the fork, to force a "fresh start", will cause you to lose all of the important metadata related to the repo - forks, stargazers, issues, wiki, etc. However, a brief exchange with - it must be said, a very helpful - GitHub helpdesk ensured that the relevant information was backed up before the detach took place.
+
+We now have a stand-alone repository which far better reflects the work done by the community, and puts it on a better footing for the future.
+
+# References and Footnotes
+
+[^gLite32]: We're talking [gLite 3.2]() here kids... that was a LONG time ago !
+[^AllHands]: This was one of the last technical training sessions we had ever run, in conjunction with GRNET, one of the partners of the very successful [CHAIN-REDS project](https://www.chain-project.eu) which we participated in.
+[^HazelhurstPuppet]: [Site Administration Tools : Puppet](http://agenda.ct.infn.it/event/895/contribution/22/material/slides/0.pdf) - Scott Hazelhurst, AAROC / CHAIN-REDS All Hands meeting, Pretoria, 2013.
+[^KannelopoulosAnsible]: [Site Administration Tools : Ansible](http://agenda.ct.infn.it/event/895/contribution/23/material/slides/0.pptx) - Christos Kanellopoulos, AAROC / CHAIN-REDS All Hands meeting, Pretoria, 2013.
+[^ExeInfraUC2015]: [Executable Infrastructure for Collaboration at Regional Level](http://www.ubuntunet.net/sites/default/files/19.%20Becker%20-%20Executable%20Infrastructure.pdf) - Bruce Becker, Ubuntunet Connect Conference 2015, Maputo, 2015.
+[^ExeInfraDI4R]: [Executable Infrastructure for Africa and Arabia](https://www.digitalinfrastructures.eu/content/executable-infrastructure-africa-and-arabia) - Bruce Becker, Digital Infrastructures for Research Conference, Krakow, Poland, 2016.
+[^DevOps2015]: Bruce Becker, Marco Fargetta, Chris Lee, Paschalis Korosoglou, Pavlos Daoglou, Bouchra Rahim, Gerrit Botha, (2015). AAROC DevOps pre-release [Data set]. Zenodo. http://doi.org/10.5281/zenodo.19100 [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19100.svg)](https://doi.org/10.5281/zenodo.19100)
+[^WIPYO]: It's definitely a work in progress still, but hey - better than nothing, right ?
+[^GithubAPI]: We are referncing [GitHub API V3](https://developer.github.com/v3/) here, specifically the part which controls how [branches are managed](https://developer.github.com/v3/repos/branches/)
+[^WhyAnsible]: We have chosen Ansible as the tool for the bootcamp, because in our opinion it has the lower barrier to entry compared to Puppet or other tools, and it's simple serverless architeture makes it easy to demonstrate and teach.
+[^BootCamp]: Bruce Becker, Chris Rohrer, & Marco Fargetta. (2017, January). AAROC/AnsibleBootCamp: Ansible BootCamp - Entebbe. Zenodo. http://doi.org/10.5281/zenodo.242394 [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.242394.svg)](https://doi.org/10.5281/zenodo.242394)
diff --git a/_posts/2017-03-18-CSIR-BootCamp.md b/_posts/2017-03-18-CSIR-BootCamp.md
new file mode 100644
index 0000000..9e1ddfe
--- /dev/null
+++ b/_posts/2017-03-18-CSIR-BootCamp.md
@@ -0,0 +1,99 @@
+---
+layout: post
+title: 'DevOps Bootcamp : CSIR '
+description: ' '
+headline: ' '
+category: blog
+tags: [DevOps, Ansible, Automation, CI, CD]
+image:
+ feature: "AnsibleBootCampCSIR.jpg"
+ attribution: "[James Pond](https://stocksnap.io/author/41685)"
+comments: false
+mathjax: false
+discourse: true
+---
+
+# Time to build some more awesome
+
+At the Cyberinfrastructure Unit of the CSIR, we're in the _infrastructure_ game. We build high-performance networking, compute and data infrastructure for research communities. However, that infrastructure is quite meaningless unless it is efficiently used, and this is done by exploiting the infrastructure through the services that it offers. Some of these services are built directly by our engineers, whilst others are built "out there" in the wild scientific world. But services should be easy to reproduce, scale, debug, share.
+
+The Africa-Arabia Regional Operations Centre (AAROC) operates a complex set of such services which run on infrastructure provided by several providers from across the continent. Orchestrating and maintaining a series of middleware stacks at several sites, which as a whole need to inter-operate with peer infrastructure abroad, is clearly a complex task. Ensuring that there is continuity in user experience (and indeed in some cases to user applications) is essential, as is reacting to changing environments, security threats and usage patterns. AAROC has adopted an "Executable Infrastructure" approach, focussing on the ability to express services and states _as code_, in order to better test, integrate and deliver them to sites.
+
+## Basic skills for infrastructure competency
+
+This philosophy emphasises agility, empathy, transparency, reproducibility and communication, and is part of the "DevOps" culture. During the course of the years, we have developed a format which aims to deliver _basic skills_ to infrastructure engineers, operations teams, and research software engineers - the _"bootcamp"_. This concept has been perfected by the [Software Carpentry](http://www.software-carpentry.org) movement, which aims similarly provide basic lab skills to modern scientists. In the case of Software Carpentry, the focus is on core tools for day-to-day research, such as using change control, or data analysis with Python or R. In the case of the DevOps bootcamp, we aim to do the same for e-Infrastructure. The goal is to build a common vocabulary, and wider understanding of how to best develop, deliver and deploy research platforms, and a better means for collaboration in doing so.
+
+## Recent bootcamps
+
+This will be the 4th DevOps Bootcamp, and the last one supported by the [Sci-GaIA project](http://www.sci-gaia.eu). During the course of the project - which will hold it's final conference in Pretoria[^FinalConf] to showcase the work done - we have held three bootcamps so far, in collaboration with :
+
+ - [GARR](http://www.garr.it)[^GARR] - The [first bootcamp in Catania ](http://agenda.ct.infn.it/event/1180/other-view?view=indico_infn_meeting) aimed at delivering federated identity providers and services in a federation.
+ - [eko-Konnect](http://www.eko-konnect.org)[^eko] - The [Lagos bootcamp](http://indico.wacren.net/event/25/) also focussed on orchestration of federated identity
+ - [UbuntuNet](http://www.ubuntnet.net)[^UbuntuNet] - The [Entebbe bootcamp](https://events.ubuntunet.net/indico/event/5/) focussed more on core skills such as working with code, and then hacked participant projects related to eduroam deployment in the Great Lakes region.
+
+Each bootcamp is a bit different, and participants get out of it what they put in. There is a short feedback period _before_ the event, where skill levels are assessed and interested parties are probed on what kind of projects they'll be bringing to the event. Over the course of two days, the basics are laid down and participants come away with a new set of skills and confidence in serving their scientific communities.
+
+# What we'll cover
+
+The scope of DevOps can be all-encompassing; just covering the toolsets exhaustively could take days. Instead of focussing on _all the tools_, we pick a few and then use it to demonstrate methodology. A short introduction, aimed at giving some context and peripheral vision to what we are doing is covered in the first session. We cover the practices of
+
+ * Service modelling
+ * Testing
+ * Continuous Integration and Delivery
+ * Code review
+ * [Working Open](https://mozillascience.github.io/WOW-2017/) and aspects of [Community Health]()
+
+and put them into action. The bootcamp alternates between short presentations and implementation sessions, where participants code[^OrIndividuals].
+
+## Tools
+
+> This is my rifle. +> There are many like it, but this one is mine + (From [The Rifleman's Creed](https://en.wikipedia.org/wiki/Rifleman's_Creed)) + +It is impossible to give a comprehensive insight to tools. There are several, each purporting to solve various problems faced in a DevOps environment. But DevOps is not a tool, it is a culture. We use [Ansible](http://www.ansible.com) as the basic tool for the bootcamp because of it's simplicity, human-readable nature, agentless architecture and vast set of built-in modules. However, we will also need others for testing[^Testing], communication, automation, _etc_. + +The course also relies on [GitHub](https://github.com/) and assumes that participants have accounts on GitHub[^NoGithub]. The GitHub API will be used to manage repositories and access tokens, amongst other things, and the web interface is suggested for code reviews. + +We will also be relying on [Linux Containers](https://en.wikipedia.org/wiki/LXC), and in particular [Docker](http://docker.com/) for a development environment and some testing. [Ansible Container](https://docs.ansible.com/ansible-container) will be used as part of the toolkit. + +# Interested in attending ? + +If all this sounds like fun, then come to the DevOps Bootcamp at the CSIR Meraka Institute **30 - 31 March 2017**. The sessions are open to all, space-permitting. Further details (venue, registration, etc) will be posted soon. In the meantime, why not take a quick look at what you can do to get yourself ready. + +## Preparation + +> "Be prepared" + ([Scouts Motto](https://en.wikipedia.org/wiki/Scout_Motto)) + +The bootcamp makes no assumptions about the skill of the participants, so there are zero formal requirements for attending the course. Participants should however have a need to fulfill - a pet project, a service they are responsible for. + +Familiarity with certain basic tools and skills will certainly be a bonus. The best place to work is on your own personal computer, so you should have : + + * Linux[^Duh] + * bash or other shell + * git client (and optional IDE) + * a good editor + * [Docker Engine](https://store.docker.com/search?type=edition&offering=community) + +... and a whole lot of grit. + +
+
See you all at the bootcamp !
++ +---- + +# References and Footnotes + +[^FinalConf]: The Sci-GaIA User Forum and Final Conference - 23 and 24 March 2016. See [www.sci-gaia.eu/final-event](http://www.sci-gaia.eu/final-event). All welcome ! +[^GARR]: GARR is the Italian NREN +[^eko]: eko-Konnect is the Lagos cluster of the Nigerian NREN (ngREN) +[^UbuntuNet]: The UbuntuNet Alliance is a regional REN for East and Southern Africa. +[^OrIndividuals]: This is usually done in pairs, but depends on the number of participants and projects. +[^Testing]: Tests can be written with [ServerSpec](http://serverspec.org/) or [Test Kitchen](http://kitchen.ci). For continuous integration, we will use mainly [Travis](https://travis-ci.org) +[^NoGithub]: If you have some kind of religious intolerance of GitHub, I guess we can find a way to accommodate that
¯\_(ツ)_/¯
+[^Duh]: Duh. I haven't checked this bootcamp with the Windows Subsystem for Linux yet - any takers ?
diff --git a/applications.md b/applications.md
index e8770c9..5742df1 100644
--- a/applications.md
+++ b/applications.md
@@ -5,7 +5,7 @@ title: Supported Applications
headline: What you can run on the grid
tags: [glite, tutorial, basic, job submission, information system, authorisation, data management]
image:
- feature:
+ feature: burn.jpg
---
# What can I run ?
@@ -14,7 +14,14 @@ In order to execute applications, they need to be on the remote execution enviro
## Straight from our Jenkins to you
-Our build system performs continuous integration on applications which are supported by the infrastructure, as well as user-proposed applications. Below you can find the overview of the status of these. These are executable in local-only or under the [sagrid.ac.za](https://voms.sagrid.ac.za/voms/sagrid.ac.za).
+Our build system performs continuous integration on applications which are supported by the infrastructure, as well as user-proposed applications. Below you can find the overview of the status of these. These are executable in local-only or under the [sagrid.ac.za](https://voms.sagrid.ac.za/voms/sagrid.ac.za) VO.
+
+
+----
+
+You can access these applications directly from your laptop, or cluster Find out how
+ +----+ | Published in CVMFS `apprepo` and modulefile available. Used at production sites and your milage wil be good :smile: | +
+ | Published in CVMFS `devrepo` - modulefile not guaranteed to be available, used for integration testing and early adopters. YMMV :smirk: | +
+ | Not published anywhere yet. | +
Want to help or follow the development ? Check out our waffle ironing board
+Don't see what you want ? - Propose a new application
+ ## How about something Continental ? Want something from another VO ? Our sites support several [EGI](https://wiki.egi.eu/wiki/CVMFS_Task_Force#Configurations) and [WLCG](https://wiki.egi.eu/wiki/CVMFS_Task_Force#Configurations) VOs (ATLAS and ALICE primarily.) diff --git a/assets/css/bootstrap.css b/assets/css/bootstrap.css index d5ae699..605e677 100644 --- a/assets/css/bootstrap.css +++ b/assets/css/bootstrap.css @@ -270,10 +270,11 @@ th { font-family: 'Glyphicons Halfling'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); - */ + font-family: 'FontAwesome'; src: url('../font/fontawesome-webfontf77b.eot'); - src: url('../font/fontawesome-webfontf77b.woff') format('woff'), url('../font/fontawesome-webfontf77b.ttf') format('truetype'), url('../fontawesome-webfont.svg') format('svg'); + src: url('../font/fontawesome-webfontf77b.woff') format('woff'), url('../font/fontawesome-webfontf77b.ttf') format('truetype'), url('../fontawesome-webfont.svg') format('svg'); */ + font-family: inherit; } .glyphicon { position: relative; @@ -3241,7 +3242,7 @@ tbody.collapse.in { .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #7DB900; - text-decoration: bold ; +/* text-decoration: bold ; */ /* background-color: #7DB900; */ visibility: visible; } @@ -5603,7 +5604,7 @@ button.close { position: absolute; z-index: 1070; display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Lato", Lato, Arial, sans-serif; font-size: 12px; font-weight: normal; line-height: 1.4; @@ -5711,7 +5712,7 @@ button.close { display: none; max-width: 276px; padding: 1px; - font-family: "Lato Thin"; + font-family: "Lato"; font-size: 14px; font-weight: normal; line-height: 1.42857143; diff --git a/assets/css/font-awesome.css b/assets/css/font-awesome.css index 4040b3c..846191b 100644 --- a/assets/css/font-awesome.css +++ b/assets/css/font-awesome.css @@ -1,13 +1,15 @@ /*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ +@fa-font-path: "../font"; + @font-face { font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); + src: url('../fonts/fontawesome-webfont.eot?v=4.3.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } @@ -18,6 +20,7 @@ text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0); } /* makes the font 33% larger relative to the icon container */ .fa-lg { @@ -80,6 +83,10 @@ -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); @@ -610,6 +617,7 @@ .fa-twitter:before { content: "\f099"; } +.fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } @@ -1259,7 +1267,8 @@ .fa-male:before { content: "\f183"; } -.fa-gittip:before { +.fa-gittip:before, +.fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { @@ -1526,6 +1535,7 @@ .fa-history:before { content: "\f1da"; } +.fa-genderless:before, .fa-circle-thin:before { content: "\f1db"; } @@ -1670,3 +1680,124 @@ .fa-meanpath:before { content: "\f20c"; } +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} diff --git a/assets/css/font-awesome.min.css b/assets/css/font-awesome.min.css index ec53d4d..24fcc04 100644 --- a/assets/css/font-awesome.min.css +++ b/assets/css/font-awesome.min.css @@ -1,4 +1,4 @@ /*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file diff --git a/assets/css/style.css b/assets/css/style.css index e94844a..c3c62fd 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -7,6 +7,7 @@ * * Designed and built with all the love in the world by @hmfaysal */ + @import url(http://weloveiconfonts.com/api/?family=brandico|entypo); /* ------------------------ */ /* GENERAL TYPOGRAPHY RULES */ /* ------------------------ */ @@ -531,7 +532,7 @@ html { padding-top: 12px; margin-top: 12px; font-size: 18px; - font-family: 'Roboto' sans-serif; + font-family: 'Inconsolata' sans-serif; } #main { position: relative; @@ -548,7 +549,7 @@ html { .blog-description { display: none; } - .home-template .row {margin: 0 -5px; z-index: 1} /* fixes overflow on homepage on small screens (caused by stacked -15px from bootstrap) */ + .home-template .row {margin: 0 -5px;} /* fixes overflow on homepage on small screens (caused by stacked -15px from bootstrap) */ } /* ----------- */ /* POST STYLES */ @@ -1844,7 +1845,7 @@ img.mfp-img { } tt,code,kbd,samp,pre { - font-family: 'source-code-pro',monospace; + font-family: 'Inconsolata',monospace; } p code,li code { diff --git a/assets/font/fontawesome-webfont.svg b/assets/font/fontawesome-webfont.svg deleted file mode 100644 index 2edb4ec..0000000 --- a/assets/font/fontawesome-webfont.svg +++ /dev/null @@ -1,399 +0,0 @@ - - - \ No newline at end of file diff --git a/assets/font/fontawesome-webfontd41d.eot b/assets/font/fontawesome-webfontd41d.eot deleted file mode 100644 index 0662cb9..0000000 Binary files a/assets/font/fontawesome-webfontd41d.eot and /dev/null differ diff --git a/assets/font/fontawesome-webfontf77b.eot b/assets/font/fontawesome-webfontf77b.eot deleted file mode 100644 index 0662cb9..0000000 Binary files a/assets/font/fontawesome-webfontf77b.eot and /dev/null differ diff --git a/assets/font/fontawesome-webfontf77b.ttf b/assets/font/fontawesome-webfontf77b.ttf deleted file mode 100644 index d365924..0000000 Binary files a/assets/font/fontawesome-webfontf77b.ttf and /dev/null differ diff --git a/assets/font/fontawesome-webfontf77b.woff b/assets/font/fontawesome-webfontf77b.woff deleted file mode 100644 index b9bd17e..0000000 Binary files a/assets/font/fontawesome-webfontf77b.woff and /dev/null differ diff --git a/assets/fonts/FontAwesome.otf b/assets/fonts/FontAwesome.otf index 81c9ad9..f7936cc 100644 Binary files a/assets/fonts/FontAwesome.otf and b/assets/fonts/FontAwesome.otf differ diff --git a/assets/fonts/fontawesome-webfont.eot b/assets/fonts/fontawesome-webfont.eot index 84677bc..33b2bb8 100644 Binary files a/assets/fonts/fontawesome-webfont.eot and b/assets/fonts/fontawesome-webfont.eot differ diff --git a/assets/fonts/fontawesome-webfont.svg b/assets/fonts/fontawesome-webfont.svg index d907b25..1ee89d4 100644 --- a/assets/fonts/fontawesome-webfont.svg +++ b/assets/fonts/fontawesome-webfont.svg @@ -1,6 +1,6 @@ -It's dangerous out there
++InfoSec : Everyone's business
++We work in a distributed environment that is highly interconnected and largely automted. Maintining information security across the services is the responsibility of not just the core system administrators, but all the communities which use the infrastructure. While we rely on the EGI CSIRT to provide analysis and alerts of security threats, as well as a level of security monitoring, prevention is better than cure. +
++Operational Security Services
+Some links may require a personal certificate in your browser and priveliged roles
+-
+
- Security Disssmination and Training +
- Security Drills Group +
- Security Monitoring Group +
- Incident Response Task Force +
Suspect shenanigans ? Don't be hasty Report an Incident and follow procedure. +
+Recent security-related announcements and posts
+{% for post in site.categories.security limit: 3 %} +{{ post.title }}
+Written on {{ post.date | date_to_string }}, tagged with +{% for tag in post.tags %} {{ tag }} +{% endfor %} +{% endfor %} ++ More + +
$HOME/.globus/user[cert,key].pem
+ - [x] Create a proxy : voms-proxy-init --voms (e.g. sagrid)
+{% highlight bash %}
+voms-proxy-init --voms sagrid
+Your identity: /C=IT/O=INFN/OU=Personal Certificate/L=ZA-MERAKA/CN=Bruce Becker
+Creating temporary proxy ................................................... Done
+Contacting voms.sagrid.ac.za:15001 [/C=IT/O=INFN/OU=Host/L=ZA-UFS/CN=voms.sagrid.ac.za] "sagrid" Done
+Creating proxy .................................. Done
+Your proxy is valid until Tue Dec 15 05:46:27 2015
+{% endhighlight %}
+ - [x] Check that the proxy is still valid : voms-proxy-info --all
+{% highlight bash %}
+subject : /C=IT/O=INFN/OU=Personal Certificate/L=ZA-MERAKA/CN=Bruce Becker/CN=proxy
+issuer : /C=IT/O=INFN/OU=Personal Certificate/L=ZA-MERAKA/CN=Bruce Becker
+identity : /C=IT/O=INFN/OU=Personal Certificate/L=ZA-MERAKA/CN=Bruce Becker
+type : proxy
+strength : 1024 bits
+path : /tmp/x509up_u500
+timeleft : 11:56:53
+key usage : Digital Signature, Key Encipherment, Data Encipherment
+=== VO sagrid extension information ===
+VO : sagrid
+subject : /C=IT/O=INFN/OU=Personal Certificate/L=ZA-MERAKA/CN=Bruce Becker
+issuer : /C=IT/O=INFN/OU=Host/L=ZA-UFS/CN=voms.sagrid.ac.za
+attribute : /sagrid/Role=NULL/Capability=NULL
+timeleft : 11:56:53
+uri : voms.sagrid.ac.za:15001
+{% endhighlight %}
+
+
+# Virtual Organisations
+
+In order to register to a Virtual Organisation, you need a personal certificate from a [trusted Certificate Authority]( {{ site_url }}/CertificateAuthorities ). There are several VO's supported - see a full list at the EGI Operations Portal
+
+# Attributes
+
+Attributes define what permissions you have. These are added to a proxy of your personal certificate by the VOMS.
+
+# Proxies
diff --git a/za-meraka.md b/za-meraka.md
new file mode 100644
index 0000000..e2bc066
--- /dev/null
+++ b/za-meraka.md
@@ -0,0 +1,10 @@
+---
+layout: page
+url: za-meraka
+title: The CSIR Meraka site
+---
+
+# ZA-MERAKA
+
+Core operations and stuff.
+it's rad