Created
November 15, 2016 20:31
-
-
Save dchabot/8648fbc7e923ec1aefe5a1066259986b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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