Skip to content

Instantly share code, notes, and snippets.

@dchabot
Created November 15, 2016 20:31
Show Gist options
  • Save dchabot/8648fbc7e923ec1aefe5a1066259986b to your computer and use it in GitHub Desktop.
Save dchabot/8648fbc7e923ec1aefe5a1066259986b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# The Big Picture\n",
"\n",
"- develop ioc\n",
"- test ioc (with hardware!!!!) on CTS network\n",
"- deploy ioc to FTC network\n",
"- simple...\n",
"\n",
"_Caveat_: some tools and techniques that may be unfamiliar..."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Local Environment\n",
"\n",
"- two FRIB-centric networks:\n",
" 1. CTS - the __test__ network. Has remote (ssh) access.\n",
" 2. FTC - the __production__ network. No remote access. Yet?\n",
"\n",
"\n",
"- many iocs are _virtual_: request IT configure and deploy these for you\n",
" \n",
"- __Recommendations__: \n",
" 1. do _everything_ developmentally possible on _CTS_, prior to deployment to FTC\n",
" 2. have IT deploy a VM on CTS to serve as your development machine\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## The Tools\n",
"\n",
"- git\n",
" - [Stash (Bitbucket)](https://stash.frib.msu.edu) for iocs, opi panels, Debian packages\n",
" - [Gitlab](https://git.nscl.msu.edu/groups/Controls) for Puppet infrastructure\n",
"- Jenkins\n",
" - Debian package build server\n",
"- Puppet\n",
" - _state_ of system as code...\n",
"- debian packages for EPICS infrastructure and OS integration"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## The Process\n",
"\n",
"- create softioc\n",
"- create opi panel(s) for same\n",
"- create puppet manifest\n",
"- deploy master branch to CTS\n",
"- test, debug, edit, repeat\n",
"- merge master branch onto release/fcx (x==1 atm)\n",
"- deploy shiny code to FTC\n",
"\n",
"_Don't forget to liberally sprinkle git commits throughout this process!_"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Softioc\n",
"\n",
"- Debian package available to help if creating IOC \"from scratch\"\n",
"\n",
"\n",
"```shell\n",
"> sudo apt-get install epics-ioctemplate-frib-dev\n",
"```\n",
"\n",
"- adds 'frib' ioc and iocBoot options to EPICS `makeBaseApp`:\n",
"\n",
"\n",
"```shell\n",
"> makeBaseApp -l\n",
"Valid application types are:\n",
" ioc\n",
" caClient\n",
" example\n",
" support\n",
" caServer\n",
" frib\n",
"Valid iocBoot types are:\n",
" frib\n",
" example\n",
" ioc\n",
" \n",
"> makeBaseApp -t frib <iocname>\n",
"> makeBaseApp -i -t frib -a linux-x86_64 \n",
"\n",
"```\n",
"\n",
"- key feature is integration with:\n",
"\n",
" 1. autosave\n",
" 2. caputlog\n",
" 3. iocstats\n",
" 4. recsync (reccaster)\n",
" 5. CA security\n",
"\n",
"\n",
"- startup script looks like [this](https://stash.frib.msu.edu/projects/FEIOC/repos/isrc1-ps/browse/iocBoot/isrc1-ps/st.cmd)\n",
"\n",
"- if starting from an existing ioc, make sure to include [module dependencies in build](https://stash.frib.msu.edu/projects/FEIOC/repos/ioc_template/browse/stdiocApp/src/Makefile#16), and [appropriate instantiation in startup script](https://stash.frib.msu.edu/projects/FEIOC/repos/ioc_template/browse/iocBoot/ioc/st.cmd)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Puppet as a Deployment Tool\n",
"\n",
"Puppet manifest skeleton (pseudo code):\n",
"\n",
"```shell\n",
"node myioc {\n",
" include OS integration profile\n",
"\n",
" declare dependencies (deb pkgs, files, etc)\n",
"\n",
" declare ioc git repo and branch info\n",
"\n",
" inject config common to all iocs\n",
"\n",
" declare instantiation of ioc\n",
"}\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Puppet manifest example #1\n",
"\n",
"This example describes a softioc to control the Frontend SCS1 power supplies\n",
"\n",
"```puppet\n",
"node fe-scs1 {\n",
" include ::profile::base::debian\n",
" include ::profile::gitdeploy\n",
" include ::profile::frib_softioc\n",
"\n",
" # epics-recsync-dev, epics-autosave-dev, epics-iocstats-dev, epics-caputlog-dev\n",
" # are all installed via profile::frib_softioc\n",
" package { 'epics-fribps-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-snmp-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'libsnmp-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'snmp-mibs-downloader':\n",
" ensure => latest,\n",
" }\n",
"\n",
" $iocbase = '/usr/local/lib/iocapps'\n",
"\n",
" vcsrepo { \"${iocbase}/scs1-ps\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/scs1-ps.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
"\n",
" # config environment vars for all iocs on this node\n",
" Epics_softioc::Ioc {\n",
" log_port => 7004,\n",
" log_server => 'facility-syslog',\n",
" }\n",
"\n",
" epics_softioc::ioc { 'scs1-ps':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/scs1-ps',\n",
" consolePort => '4051',\n",
" uid => '906',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/scs1-ps\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-fribps-dev'],\n",
" Package['epics-snmp-dev'],\n",
" Package['libsnmp-dev'],\n",
" Package['snmp-mibs-downloader'],\n",
" ],\n",
" }\n",
"\n",
"}\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Puppet manifest example #2\n",
"\n",
"This illustrates _six_ softiocs that control ISRC1:\n",
"\n",
"\n",
"```puppet\n",
"node fe-isrc1-ioc {\n",
" include ::profile::base::debian\n",
" include ::profile::frib_softioc\n",
"\n",
"\n",
" package { 'epics-ether-ip-frib-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-gemt6k-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-calc-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-busy-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-zmod-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-nsclfrib-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-asyn-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-stream-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-infoserv-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-fribps-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-fribstream-dev':\n",
" ensure => latest,\n",
" }\n",
" \n",
" package { 'libctlrtools1.0.0-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-zworldtools-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" package { 'epics-radnet-dev':\n",
" ensure => latest,\n",
" }\n",
"\n",
" $iocbase = '/usr/local/lib/iocapps'\n",
"\n",
" vcsrepo { \"${iocbase}/isrc1-plc\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/isrc1-plc.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
"\n",
" vcsrepo { \"${iocbase}/isrc1-mc\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/isrc1-mc.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
"\n",
" vcsrepo { \"${iocbase}/isrc1-rf\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/isrc1-rf.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
"\n",
" vcsrepo { \"${iocbase}/isrc1-ps\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/isrc1-ps.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
"\n",
" vcsrepo { \"${iocbase}/isrc1-xmon\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/isrc1-xmon.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
" \n",
" vcsrepo { \"${iocbase}/isrc1-bcm\":\n",
" ensure => latest,\n",
" provider => git,\n",
" source => 'git@git.cts:deploy/isrc1-bcm.git',\n",
" revision => 'master',\n",
" identity => '/root/.gitdeploy/id_rsa',\n",
" owner => 'softioc',\n",
" group => 'softioc',\n",
" }\n",
" \n",
" # config environment vars for all iocs on this node\n",
" Epics_softioc::Ioc {\n",
" log_port => 7004,\n",
" log_server => 'facility-syslog',\n",
" }\n",
"\n",
" epics_softioc::ioc { 'isrc1-mc':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/isrc1-mc',\n",
" consolePort => '4051',\n",
" uid => '900',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/isrc1-mc\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-gemt6k-dev'],\n",
" Package['epics-calc-dev'],\n",
" Package['epics-busy-dev'],\n",
" ],\n",
" }\n",
"\n",
" epics_softioc::ioc { 'isrc1-plc':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/isrc1-plc',\n",
" consolePort => '4052',\n",
" uid => '901',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/isrc1-plc\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-ether-ip-frib-dev'],\n",
" ],\n",
" }\n",
"\n",
" epics_softioc::ioc { 'isrc1-rf':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/isrc1-rf',\n",
" consolePort => '4053',\n",
" uid => '902',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/isrc1-rf\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-calc-dev'],\n",
" Package['epics-zmod-dev'],\n",
" Package['libctlrtools1.0.0-dev'],\n",
" Package['epics-zworldtools-dev'],\n",
" ],\n",
" }\n",
"\n",
" epics_softioc::ioc { 'isrc1-ps':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/isrc1-ps',\n",
" consolePort => '4054',\n",
" uid => '903',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/isrc1-ps\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-calc-dev'],\n",
" Package['epics-asyn-dev'],\n",
" Package['epics-stream-dev'],\n",
" Package['epics-nsclfrib-dev'],\n",
" Package['epics-infoserv-dev'],\n",
" Package['epics-fribps-dev'],\n",
" Package['epics-fribstream-dev'],\n",
" ],\n",
" }\n",
" \n",
" epics_softioc::ioc { 'isrc1-xmon':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/isrc1-xmon',\n",
" consolePort => '4055',\n",
" uid => '904',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/isrc1-xmon\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-calc-dev'],\n",
" Package['epics-radnet-dev'],\n",
" ],\n",
" }\n",
" \n",
" epics_softioc::ioc { 'isrc1-bcm':\n",
" ensure => running,\n",
" enable => true,\n",
" bootdir => 'iocBoot/isrc1-bcm',\n",
" consolePort => '4056',\n",
" uid => '905',\n",
" require => [\n",
" Vcsrepo[\"${iocbase}/isrc1-bcm\"],\n",
" ],\n",
" subscribe => [\n",
" Package['epics-calc-dev'],\n",
" Package['epics-zmod-dev'],\n",
" Package['epics-zworldtools-dev'],\n",
" ],\n",
" }\n",
"}\n",
"```"
]
}
],
"metadata": {
"anaconda-cloud": {},
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python [py3]",
"language": "python",
"name": "Python [py3]"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment