summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Morris <nat@netflix.com>2016-12-04 17:06:07 +0000
committerNat Morris <nat@netflix.com>2016-12-04 17:06:07 +0000
commit0e26ca4e877570b5ba02370768fcd758c4b03cc8 (patch)
treef9aa3515d2d7bef8ca6e120b51d3f830c67cbdf0
parente0da3feeb2fc506af31df0b41e14a3f9c588ef82 (diff)
New hook: awssns - Publish messages to AWS SNS topics
-rw-r--r--README.md35
-rw-r--r--lib/oxidized/hook/awssns.rb27
2 files changed, 59 insertions, 3 deletions
diff --git a/README.md b/README.md
index ea70c47..82c33a5 100644
--- a/README.md
+++ b/README.md
@@ -307,17 +307,17 @@ this will bind port 8888 to all interfaces then expose port out. (Issue #445)
You can also use docker-compose to launch oxidized container:
```
-# docker-compose.yml
+# docker-compose.yml
# docker-compose file example for oxidized that will start along with docker daemon
oxidized:
restart: always
- image: oxidized/oxidized:latest
+ image: oxidized/oxidized:latest
ports:
- 8888:8888/tcp
environment:
CONFIG_RELOAD_INTERVAL: 600
volumes:
- - /etc/oxidized:/root/.config/oxidized
+ - /etc/oxidized:/root/.config/oxidized
```
create the `/etc/oxidized/router.db`
@@ -815,6 +815,35 @@ hooks:
password: pass
```
+## Hook type: awssns
+
+The `awssns` hook publishes messages to AWS SNS topics. This allows you to notify other systems of device configuration changes, for example a config orchestration pipeline. Multiple services can subscribe to the same AWS topic.
+
+Fields sent in the message:
+
+ * `event`: Event type (e.g. `node_success`)
+ * `group`: Group name
+ * `model`: Model name (e.g. `eos`)
+ * `node`: Device hostname
+
+Configuration example:
+
+``` yaml
+hooks:
+ hook_script:
+ type: awssns
+ events: [node_fail,node_success,post_store]
+ region: us-east-1
+ topic_arn: arn:aws:sns:us-east-1:1234567:oxidized-test-backup_events
+```
+
+AWS SNS hook requires the following configuration keys:
+
+ * `region`: AWS Region name
+ * `topic_arn`: ASN Topic reference
+
+Your AWS credentials should be stored in `~/.aws/credentials`.
+
# Ruby API
The following objects exist in Oxidized.
diff --git a/lib/oxidized/hook/awssns.rb b/lib/oxidized/hook/awssns.rb
new file mode 100644
index 0000000..dbc2d47
--- /dev/null
+++ b/lib/oxidized/hook/awssns.rb
@@ -0,0 +1,27 @@
+require 'aws-sdk'
+
+class AwsSns < Oxidized::Hook
+ def validate_cfg!
+ raise KeyError, 'hook.region is required' unless cfg.has_key?('region')
+ raise KeyError, 'hook.topic_arn is required' unless cfg.has_key?('topic_arn')
+ end
+
+ def run_hook(ctx)
+ sns = Aws::SNS::Resource.new(region: cfg.region)
+ topic = sns.topic(cfg.topic_arn)
+ message = {
+ :event => ctx.event.to_s
+ }
+ if ctx.node
+ message.merge!(
+ :group => ctx.node.group.to_s,
+ :model => ctx.node.model.class.name.to_s.downcase,
+ :node => ctx.node.name.to_s
+ )
+ end
+ topic.publish({
+ message: message.to_json
+ })
+ end
+
+end