Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
wattsworth
/
puppet
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
60eca0f4
authored
May 29, 2020
by
source_reader
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
migrate to ubuntu 20.04
parent
62cea37b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
394 additions
and
6 deletions
bootstrap.sh
modules/docs/files/API_Demo.ipynb
modules/timescaledb/manifests/init.pp
bootstrap.sh
View file @
60eca0f4
...
...
@@ -11,13 +11,11 @@ cat > /etc/hosts <<EOF
EOF
#fi
#echo "nameserver 172.31.33.1" > /etc/resolv.conf
sudo
add-apt-repository ppa:wireguard/wireguard
-y
apt-get update
apt remove
--purge
libreoffice-
*
-y
>
/dev/null
apt-get upgrade
-y
wget https://apt.puppetlabs.com/puppet-release-
bionic
.deb
dpkg
-i
puppet-release-
bionic
.deb
wget https://apt.puppetlabs.com/puppet-release-
focal
.deb
dpkg
-i
puppet-release-
focal
.deb
add-apt-repository universe
apt-get update
apt install puppet-agent git r10k python3-pip build-essential
-y
...
...
modules/docs/files/API_Demo.ipynb
0 → 100644
View file @
60eca0f4
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Joule API Demonstration Notebook\n",
"\n",
"This notebook shows how to use the Joule Application Programming Interface (API)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# run this cell first to import the packages\n",
"import joule\n",
"# convenience imports to make code more compact\n",
"from joule.api import Stream, Element, Annotation\n",
"from joule.errors import EmptyPipeError\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To use the API you must have access to the Joule node. To view accessible nodes run the following command:\n",
" \n",
" $> joule node list\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Node [bucket] running joule 0.9.14+1.g963480a\n",
"613 GiB used\n",
"15533 GiB available\n"
]
}
],
"source": [
"# get_node() returns the default node, add a name parameter to request a specific one\n",
"node = joule.api.get_node()\n",
"\n",
"# all node methods are async so you must use the await keyword\n",
"info = await node.info()\n",
"\n",
"print(\"Node [%s] running joule %s\" % (info.name, info.version))\n",
"print(\"%d GiB used\" % (info.size_db / 2**30))\n",
"print(\"%d GiB available\" % (info.size_free / (2**30)))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create streams and write data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# create a two element stream of 5Hz sine, cosine waveforms\n",
"freq = 5.0\n",
"t = np.arange(0,1,0.001) # 1ms sample rate\n",
"sine = np.sin(freq*2*np.pi*t)\n",
"cosine = np.cos(freq*2*np.pi*t)\n",
"tangent = np.tan(freq*2*np.pi*t)\n",
"plt.plot(t, sine, 'r', t, cosine, 'g')\n",
"plt.xlabel('Time (sec)')\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# create a stream on the Joule Node that can store this data\n",
"stream = Stream(name=\"waves\", elements=[Element(name=\"sine\"), Element(name=\"cosine\")])\n",
"stream = await node.stream_create(stream,\"/Demos\") # now stream is a registered model and can be used with API calls\n",
"\n",
"# refresh the node in the Data Explorer and you should see the new stream\n",
"# *NOTE* if you run this code more than once you will receive an error that the stream already exists"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# we need to put the data in an M,3 numpy array:\n",
"# [ ts sine cosine\n",
"# ts sine cosine\n",
"# ... ]\n",
"#\n",
"# There are many ways to do this, the following is rather concise\n",
"# *NOTE* make sure the timestamps are in units of microseconds\n",
"#\n",
"data = np.vstack((t*1e6, sine, cosine)).T\n",
"\n",
"#\n",
"# add data to the stream by using an input pipe\n",
"#\n",
"pipe = await node.data_write(stream)\n",
"await pipe.write(data) # timestamps should be in us\n",
"await pipe.close() # make sure to close the pipe after writing\n",
"\n",
"# refresh the node in the Data Explorer and you should see the new stream\n",
"# *NOTE* if you run this code more than once you will receive an error that the data already exists"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Manipulate streams and data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Stream Info:\t <joule.api.StreamInfo start=0 end=999001 rows=1000, total_time=999001>\n",
"Intervals:\t [[0, 999001]]\n",
"--removed data--\n",
"Intervals:\t [[0, 200000], [400000, 999001]]\n"
]
}
],
"source": [
"# get information about a stream\n",
"print(\"Stream Info:\\t\", await node.stream_info(stream))\n",
"\n",
"# get the data intervals (regions of the stream with data)\n",
"print(\"Intervals:\\t\", await node.data_intervals(stream))\n",
"\n",
"# change the display type of an element to discrete\n",
"stream.elements[1].display_type=\"discrete\"\n",
"await node.stream_update(stream) # refresh the node to see this change\n",
"\n",
"# remove data from a stream \n",
"# ***DANGEROUS: OMITTING START and END will remove ALL DATA***\n",
"await node.data_delete(stream,start=0.2*1e6, end=0.4*1e6)\n",
"print(\"--removed data--\")\n",
"print(\"Intervals:\\t\", await node.data_intervals(stream))\n",
"\n",
"# ...many more methods are available, see API docs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Data Annotations"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Annotate a range of data in Lumen then run this cell\n",
"#\n",
"\n",
"# retrieve a list of annotations (include start,end parameters to limit query to a time range)\n",
"annotations = await node.annotation_get(stream)\n",
"\n",
"if len(annotations) == 0:\n",
" print(\"ERROR: Create an annotation in Lumen then run this cell\")\n",
"elif annotations[0].end is None:\n",
" print(\"ERROR: Annotate a range in Lumen, not an event\")\n",
"else:\n",
" annotation = annotations[0]\n",
" \n",
" # read the data associated with the annotation\n",
" pipe = await node.data_read(stream,start=annotation.start, end=annotation.end)\n",
" data = await pipe.read_all() # this automatically closes the pipe\n",
" \n",
" # plot the data\n",
" plt.plot(data['timestamp']/1e6, data['data'])\n",
" plt.title(annotation.title)\n",
" plt.xlabel('Time (sec)')\n",
" plt.show()\n",
"\n",
"# Annotations can also be created with the API\n",
"#\n",
"\n",
" annotation = Annotation(title='API Annotation', start=0.8*1e6)\n",
" await node.annotation_create(annotation, stream)\n",
"\n",
"# refresh the annotations in the Plot Tab of Lumen to see this new annotation\n",
"# *NOTE* If you run this cell multiple times it will create multiple annotations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Explore Streams and Read Data"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Spencer\n",
" Port\n",
" Events\n",
" [DOP: float32_3]\n",
" [DOP_2: float32_3]\n",
" [MPDE: float32_3]\n",
" [SSDG: float32_3]\n",
" [CPP: float32_3]\n",
" [prep: float32_24]\n",
" Aux\n",
" [prep: float32_24]\n",
"LCS 17\n",
" 2-5-2\n",
" [prep: float32_24]\n",
" 4-45-2\n",
" [prep: float32_24]\n",
" 4-65-2\n",
" [prep: float32_24]\n",
" [IV: float32_6]\n",
"Escanaba\n",
" Gen 1\n",
" [prep: float32_24]\n",
" Shore Aft\n",
" [prep: float32_24]\n",
" Gen 2\n",
" [prep: float32_24]\n",
"Demos\n",
" [waves: float32_2]\n"
]
}
],
"source": [
"# Nodes can be explored through the API\n",
"#\n",
"root = await node.folder_root()\n",
"\n",
"def print_folder(folder, indent=0):\n",
" for child in folder.children:\n",
" print(\" \"*indent + child.name)\n",
" print_folder(child, indent+1)\n",
" for stream in folder.streams:\n",
" print(\" \"*indent + \"[%s: %s]\" % (stream.name, stream.layout))\n",
" \n",
"# print the folder directory structure\n",
"print_folder(root)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# streams can be accessed by API object (as shown in previous cells) or by path\n",
"info = await node.stream_info(\"/Demos/waves\")\n",
"print(\"The demo stream has %d rows of data\" % info.rows)\n",
"\n",
"# To read data, first create a pipe to the stream\n",
"# If you want to treat the data like a simple array you can use the read_all method, but if\n",
"# there is too much data this may fail. In general you should treat a pipe as an infinite\n",
"# data source and read it by chunk. This requires more code, but it scales to very large \n",
"# datasets and is the only way to work with realtime data sources\n",
"#\n",
"print(\"-- reading data --\")\n",
"pipe = await node.data_read(\"/Demos/waves\")\n",
"try:\n",
" while True:\n",
" data = await pipe.read()\n",
" plt.plot(data['timestamp']/1e6,data['data'])\n",
" pipe.consume(len(data))\n",
" print(\"%d rows of data\" % len(data))\n",
" # for large data sources the chunk may or may not be an interval boundary\n",
" # you can explicitly check whether this is the end of an interval:\n",
" if pipe.end_of_interval:\n",
" print(\" data boundary\")\n",
"except EmptyPipeError:\n",
" pass\n",
"finally:\n",
" await pipe.close()\n",
"\n",
"plt.xlabel('Time (sec)')\n",
"plt.title('Data showing interval break')\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Reset the Node to original state\n",
"**Run this cell to undo all changes created by this notebook**"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"await node.folder_delete(\"/Demos\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.8.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
modules/timescaledb/manifests/init.pp
View file @
60eca0f4
...
...
@@ -20,14 +20,14 @@ class timescaledb {
}
apt::ppa
{
'ppa:timescale/timescaledb-ppa'
:
}
package
{
'timescaledb-postgresql-1
1
'
:
package
{
'timescaledb-postgresql-1
2
'
:
ensure
=>
'present'
,
require
=>
[
Apt
::
Source
[
'postgresql'
],
Apt
::
Ppa
[
'ppa:timescale/timescaledb-ppa'
]]
}
}
# timescaledb is compiled manually on the pi
class
{
'postgresql::globals'
:
version
=>
'1
1
'
,
version
=>
'1
2
'
,
}
class
{
'postgresql::server'
:
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment