Merge lp:~thomnico/orange-box-examples/telco into lp:orange-box-examples

Proposed by Nicolas Thomas
Status: Rejected
Rejected by: Darryl Weaver
Proposed branch: lp:~thomnico/orange-box-examples/telco
Merge into: lp:orange-box-examples
Diff against target: 12255 lines
To merge this branch: bzr merge lp:~thomnico/orange-box-examples/telco
Reviewer Review Type Date Requested Status
Darryl Weaver (community) Disapprove
Review via email: mp+241281@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Darryl Weaver (dweaver) wrote :

Already merged

review: Disapprove
71. By Nicolas Thomas

modified:
  bin/orange-box-launch-openstack-juju
pending merges:
  Darryl Weaver 2014-11-12 Modified orange-box-launch-openstack-juju to correct errors.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2014-10-28 18:40:11 +0000
3+++ .bzrignore 2014-11-10 14:55:38 +0000
4@@ -1,4 +1,2 @@
5 precise
6-telco/precise
7-telco/trusty
8 cloudfoundry/trusty
9
10=== modified file 'telco/01-deploy.sh'
11--- telco/01-deploy.sh 2014-10-27 15:23:26 +0000
12+++ telco/01-deploy.sh 2014-11-10 14:55:38 +0000
13@@ -13,5 +13,5 @@
14 export JUJU_REPOSITORY=$PWD
15 juju-deployer -c bundle-telco.yaml
16 else
17- echo "Run ./bzr-sync-local-charms before running this script"
18+ echo "Run ./sync-local-charms before running this script"
19 fi
20
21=== modified file 'telco/bundle-telco-store.yaml'
22--- telco/bundle-telco-store.yaml 2014-11-10 00:33:48 +0000
23+++ telco/bundle-telco-store.yaml 2014-11-10 14:55:38 +0000
24@@ -78,7 +78,7 @@
25 "gui-x": "-857.8215242215981"
26 "gui-y": "698.5485784445332"
27 sipml5:
28- charm: "local:trusty/sipml5"
29+ charm: "cs:~thomnico/trusty/sipml5"
30 num_units: 1
31 expose: true
32 annotations:
33
34=== modified file 'telco/bundle-telco.yaml'
35--- telco/bundle-telco.yaml 2014-11-10 00:33:48 +0000
36+++ telco/bundle-telco.yaml 2014-11-10 14:55:38 +0000
37@@ -78,6 +78,7 @@
38 "gui-x": "-857.8215242215981"
39 "gui-y": "698.5485784445332"
40 sipml5:
41+# charm: "cs:~thomnico/trusty/sipml5"
42 charm: "local:trusty/sipml5"
43 num_units: 1
44 expose: true
45
46=== added directory 'telco/precise'
47=== added directory 'telco/precise/clearwater-bono'
48=== added file 'telco/precise/clearwater-bono/README.md'
49--- telco/precise/clearwater-bono/README.md 1970-01-01 00:00:00 +0000
50+++ telco/precise/clearwater-bono/README.md 2014-11-10 14:55:38 +0000
51@@ -0,0 +1,90 @@
52+# Overview
53+
54+This charm supports deployment and scaling of the Bono component of a Project Clearwater system. See http://www.projectclearwater.org for more information on Project Clearwater.
55+
56+# Usage
57+
58+The Bono service should be deployed as part of a Clearwater system. A Clearwater system can be deployed in a Juju environment by creating a config.yaml file then running the following commands.
59+
60+ juju deploy --config config.yaml clearwater-route53
61+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
62+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
63+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
64+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
65+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
66+ juju add-relation clearwater-ellis clearwater-route53:register-ellis
67+ juju add-relation clearwater-bono clearwater-route53:register-bono
68+ juju add-relation clearwater-sprout clearwater-route53:register-sprout
69+ juju add-relation clearwater-homestead clearwater-route53:register-homestead
70+ juju add-relation clearwater-homer clearwater-route53:register-homer
71+ juju expose clearwater-bono
72+ juju expose clearwater-ellis
73+
74+The config.yaml configuration file takes the following format.
75+
76+ clearwater-route53:
77+ zone: <domain>
78+ access_key: <ec2 access key>
79+ secret_key: <ec2 secret access key>
80+ sas: "0.0.0.0"
81+
82+ clearwater-ellis:
83+ smtp_server: smtp.cw-ngv.com
84+ smtp_username: username
85+ smtp_password: password
86+ email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
87+ signup_key: secret
88+ base_number: "6505550000"
89+ number_count: 1000
90+ repo: http://repo.cw-ngv.com/stable
91+
92+ clearwater-bono:
93+ turn_workaround: password
94+ repo: http://repo.cw-ngv.com/stable
95+
96+ clearwater-sprout:
97+ reg_min_expires: 400
98+ session_max_expires: 900
99+ repo: http://repo.cw-ngv.com/stable
100+
101+ clearwater-homestead:
102+ repo: http://repo.cw-ngv.com/stable
103+
104+ clearwater-homer:
105+ repo: http://repo.cw-ngv.com/stable
106+
107+Note that the clearwater-bono charm can only be deployed on the `amd64` architecture.
108+
109+## Scale out Usage
110+
111+## Known Limitations and Issues
112+
113+The only currently supported DNS service for Clearwater is clearwater-route53 (when deploying in Amazon EC2), so will currently only work on EC2. Additional DNS services will be added for other environments in future.
114+
115+clearwater-bono currently only supports running as a single unit. Clustering support will be released shortly, which will allow units to be added to and removed from a clearwater-bono deployment using juju add-unit and juju remove-unit commands.
116+
117+Note that this charm does not current pass charm proof because its hooks use EC2 APIs directly to obtain the public IP address rather than unit-get public-address. This is to work around what looks like a Juju bug - unit-get public-address on EC2 returns the public hostname of the unit rather than the public IP address. Unfortunately EC2 public hostname are actually split horizon hostnames, so if you attempt to resolve the hostname from within EC2 it actually resolved to a private IP address - it will only resolve to a public address if resolved from outside EC2.
118+
119+# Configuration
120+
121+Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
122+
123+clearwater-route53
124+
125+- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
126+- `access_key:` and `secret_key:` These must be set to the AWS access key and secret key of the AWS account which owns the DNS zone name.
127+
128+clearwater-ellis
129+
130+- `signup_key:` This is used as a signup key on the Ellis self-provisioning portal, so should be set to a unique string for each installation.
131+- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
132+
133+# Contact Information
134+
135+## Upstream Project Name
136+
137+See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
138+
139+Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
140+
141+The Clearwater mailing list is at lists.projectclearwater.org.
142
143=== added file 'telco/precise/clearwater-bono/config.yaml'
144--- telco/precise/clearwater-bono/config.yaml 1970-01-01 00:00:00 +0000
145+++ telco/precise/clearwater-bono/config.yaml 2014-11-10 14:55:38 +0000
146@@ -0,0 +1,20 @@
147+options:
148+ zone:
149+ description: The DNS root zone for this service
150+ type: string
151+ sas:
152+ default: ""
153+ description: The location of the SAS server
154+ type: string
155+ turn_workaround:
156+ default: ""
157+ description: TURN workaround password, used by faulty WebRTC clients
158+ type: string
159+ trusted_peers:
160+ default: ""
161+ description: Comma-separated list of IP addresses of trusted peers
162+ type: string
163+ repo:
164+ default: http://repo.cw-ngv.com/stable
165+ description: The location of the repo server
166+ type: string
167
168=== added file 'telco/precise/clearwater-bono/copyright'
169--- telco/precise/clearwater-bono/copyright 1970-01-01 00:00:00 +0000
170+++ telco/precise/clearwater-bono/copyright 2014-11-10 14:55:38 +0000
171@@ -0,0 +1,31 @@
172+Project Clearwater - IMS in the Cloud
173+Copyright (C) 2013 Metaswitch Networks Ltd
174+
175+This program is free software: you can redistribute it and/or modify it
176+under the terms of the GNU General Public License as published by the
177+Free Software Foundation, either version 3 of the License, or (at your
178+option) any later version, along with the "Special Exception" for use of
179+the program along with SSL, set forth below. This program is distributed
180+in the hope that it will be useful, but WITHOUT ANY WARRANTY;
181+without even the implied warranty of MERCHANTABILITY or FITNESS FOR
182+A PARTICULAR PURPOSE. See the GNU General Public License for more
183+details. You should have received a copy of the GNU General Public
184+License along with this program. If not, see
185+<http://www.gnu.org/licenses/>.
186+
187+The author can be reached by email at clearwater@metaswitch.com or by
188+post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
189+
190+Special Exception
191+Metaswitch Networks Ltd grants you permission to copy, modify,
192+propagate, and distribute a work formed by combining OpenSSL with The
193+Software, or a work derivative of such a combination, even if such
194+copying, modification, propagation, or distribution would otherwise
195+violate the terms of the GPL. You must comply with the GPL in all
196+respects for all of the code used other than OpenSSL.
197+"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
198+Project and licensed under the OpenSSL Licenses, or a work based on such
199+software and licensed under the OpenSSL Licenses.
200+"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
201+under which the OpenSSL Project distributes the OpenSSL toolkit software,
202+as those licenses appear in the file LICENSE-OPENSSL.
203
204=== added directory 'telco/precise/clearwater-bono/hooks'
205=== added file 'telco/precise/clearwater-bono/hooks/config-changed'
206--- telco/precise/clearwater-bono/hooks/config-changed 1970-01-01 00:00:00 +0000
207+++ telco/precise/clearwater-bono/hooks/config-changed 2014-11-10 14:55:38 +0000
208@@ -0,0 +1,9 @@
209+#!/bin/bash
210+set -e
211+
212+# Update the /etc/clearwater/config file, the node.json, and re-run
213+# chef-solo
214+$CHARM_DIR/lib/config_script
215+$CHARM_DIR/lib/node_json_script
216+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
217+$CHARM_DIR/lib/restart
218
219=== added file 'telco/precise/clearwater-bono/hooks/install'
220--- telco/precise/clearwater-bono/hooks/install 1970-01-01 00:00:00 +0000
221+++ telco/precise/clearwater-bono/hooks/install 2014-11-10 14:55:38 +0000
222@@ -0,0 +1,37 @@
223+#!/bin/bash
224+set -e
225+
226+# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
227+# for public-address and private-address. To work-around this, we resolve the
228+# host names. However, after we've joined to the DNSaaS charm, we can no longer
229+# resolve these, so add them to /etc/hosts.
230+if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
231+ private_address=$(unit-get private-address)
232+ public_address=$(unit-get public-address)
233+ private_ip=$($CHARM_DIR/lib/unit-get private-address)
234+ public_ip=$($CHARM_DIR/lib/unit-get public-address)
235+ [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
236+ [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
237+ echo "$public_ip bono-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
238+fi
239+
240+# Install chef solo, and create the node.json and config file
241+$CHARM_DIR/lib/chef_solo_install
242+$CHARM_DIR/lib/node_json_script
243+$CHARM_DIR/lib/config_script
244+
245+apt-get update
246+
247+# Install the node
248+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
249+
250+# Expose the correct ports
251+open-port 22/tcp
252+open-port 123/udp
253+open-port 161/udp
254+open-port 3478/tcp
255+open-port 3478/udp
256+open-port 5060/tcp
257+open-port 5060/udp
258+open-port 5062/tcp
259+open-port 6666/tcp
260
261=== added file 'telco/precise/clearwater-bono/hooks/programmable-multiple-relation-changed'
262--- telco/precise/clearwater-bono/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
263+++ telco/precise/clearwater-bono/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
264@@ -0,0 +1,28 @@
265+#!/bin/bash
266+set -e
267+
268+# Set our DNS requirements
269+TTL=300
270+id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
271+ip=$($CHARM_DIR/lib/unit-get public-address)
272+relation-set domain=$(config-get zone)
273+relation-set resources='@ '$TTL' IN A '$ip'
274+@ '$TTL' IN NAPTR 1 1 "S" "SIP+D2T" "" _sip._tcp
275+@ '$TTL' IN NAPTR 2 1 "S" "SIP+D2U" "" _sip._udp
276+_sip._tcp '$TTL' IN SRV 0 0 5060 bono-'$id'
277+_sip._udp '$TTL' IN SRV 0 0 5060 bono-'$id'
278+bono-'$id' '$TTL' IN A '$ip
279+
280+# Update our DNS server
281+if [ "$(relation-get public-address)" != "" ]
282+then
283+ echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
284+ grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
285+ mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
286+ echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
287+ service dnsmasq restart
288+fi
289+
290+# Update Clearwater configuration and restart
291+$CHARM_DIR/lib/config_script programmable-multiple
292+$CHARM_DIR/lib/restart
293
294=== added file 'telco/precise/clearwater-bono/hooks/ralf-ctf-relation-changed'
295--- telco/precise/clearwater-bono/hooks/ralf-ctf-relation-changed 1970-01-01 00:00:00 +0000
296+++ telco/precise/clearwater-bono/hooks/ralf-ctf-relation-changed 2014-11-10 14:55:38 +0000
297@@ -0,0 +1,6 @@
298+#!/bin/bash
299+set -e
300+
301+# Update Clearwater configuration and restart
302+$CHARM_DIR/lib/config_script ralf-ctf
303+$CHARM_DIR/lib/restart
304
305=== added file 'telco/precise/clearwater-bono/hooks/scscf-relation-changed'
306--- telco/precise/clearwater-bono/hooks/scscf-relation-changed 1970-01-01 00:00:00 +0000
307+++ telco/precise/clearwater-bono/hooks/scscf-relation-changed 2014-11-10 14:55:38 +0000
308@@ -0,0 +1,6 @@
309+#!/bin/bash
310+set -e
311+
312+# Update Clearwater configuration and restart
313+$CHARM_DIR/lib/config_script scscf
314+$CHARM_DIR/lib/restart
315
316=== added file 'telco/precise/clearwater-bono/hooks/start'
317--- telco/precise/clearwater-bono/hooks/start 1970-01-01 00:00:00 +0000
318+++ telco/precise/clearwater-bono/hooks/start 2014-11-10 14:55:38 +0000
319@@ -0,0 +1,16 @@
320+#!/bin/bash
321+# Here put anything that is needed to start the service.
322+# Note that currently this is run directly after install
323+# i.e. 'service apache2 start'
324+set -e
325+
326+# This hook needs to be idempotent, so this could be run when bono is
327+# already running, when it's running but not monitored by monit, when
328+# it's stopped but being monitored (so it's about to start), or stopped
329+# and unmonitored. To cover all these cases, stop monit, start bono, start
330+# monit, then finally have monit monitor bono
331+service monit stop
332+service bono start
333+service monit start
334+sleep 1
335+monit monitor bono
336
337=== added file 'telco/precise/clearwater-bono/hooks/stop'
338--- telco/precise/clearwater-bono/hooks/stop 1970-01-01 00:00:00 +0000
339+++ telco/precise/clearwater-bono/hooks/stop 2014-11-10 14:55:38 +0000
340@@ -0,0 +1,12 @@
341+#!/bin/bash
342+# This will be run when the service is being torn down, allowing you to disable
343+# it in various ways..
344+# For example, if your web app uses a text file to signal to the load balancer
345+# that it is live... you could remove it and sleep for a bit to allow the load
346+# balancer to stop sending traffic.
347+# rm /srv/webroot/server-live.txt && sleep 30
348+set -e
349+
350+# Stop bono via monit
351+sudo service monit start
352+sudo monit stop bono
353
354=== added file 'telco/precise/clearwater-bono/hooks/upgrade-charm'
355--- telco/precise/clearwater-bono/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
356+++ telco/precise/clearwater-bono/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
357@@ -0,0 +1,9 @@
358+#!/bin/bash
359+# This hook is executed each time a charm is upgraded after the new charm
360+# contents have been unpacked
361+# Best practice suggests you execute the hooks/install and
362+# hooks/config-changed to ensure all updates are processed
363+set -e
364+
365+$CHARM_DIR/hooks/install
366+$CHARM_DIR/hooks/config-changed
367
368=== added file 'telco/precise/clearwater-bono/icon.svg'
369--- telco/precise/clearwater-bono/icon.svg 1970-01-01 00:00:00 +0000
370+++ telco/precise/clearwater-bono/icon.svg 2014-11-10 14:55:38 +0000
371@@ -0,0 +1,407 @@
372+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
373+<!-- Created with Inkscape (http://www.inkscape.org/) -->
374+
375+<svg
376+ xmlns:dc="http://purl.org/dc/elements/1.1/"
377+ xmlns:cc="http://creativecommons.org/ns#"
378+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
379+ xmlns:svg="http://www.w3.org/2000/svg"
380+ xmlns="http://www.w3.org/2000/svg"
381+ xmlns:xlink="http://www.w3.org/1999/xlink"
382+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
383+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
384+ width="96"
385+ height="96"
386+ id="svg6517"
387+ version="1.1"
388+ inkscape:version="0.48.2 r9819"
389+ sodipodi:docname="icon.svg">
390+ <defs
391+ id="defs6519">
392+ <linearGradient
393+ id="Background">
394+ <stop
395+ id="stop4178"
396+ offset="0"
397+ style="stop-color:#b8b8b8;stop-opacity:1" />
398+ <stop
399+ id="stop4180"
400+ offset="1"
401+ style="stop-color:#c9c9c9;stop-opacity:1" />
402+ </linearGradient>
403+ <filter
404+ style="color-interpolation-filters:sRGB;"
405+ inkscape:label="Inner Shadow"
406+ id="filter1121">
407+ <feFlood
408+ flood-opacity="0.59999999999999998"
409+ flood-color="rgb(0,0,0)"
410+ result="flood"
411+ id="feFlood1123" />
412+ <feComposite
413+ in="flood"
414+ in2="SourceGraphic"
415+ operator="out"
416+ result="composite1"
417+ id="feComposite1125" />
418+ <feGaussianBlur
419+ in="composite1"
420+ stdDeviation="1"
421+ result="blur"
422+ id="feGaussianBlur1127" />
423+ <feOffset
424+ dx="0"
425+ dy="2"
426+ result="offset"
427+ id="feOffset1129" />
428+ <feComposite
429+ in="offset"
430+ in2="SourceGraphic"
431+ operator="atop"
432+ result="composite2"
433+ id="feComposite1131" />
434+ </filter>
435+ <filter
436+ style="color-interpolation-filters:sRGB;"
437+ inkscape:label="Drop Shadow"
438+ id="filter950">
439+ <feFlood
440+ flood-opacity="0.25"
441+ flood-color="rgb(0,0,0)"
442+ result="flood"
443+ id="feFlood952" />
444+ <feComposite
445+ in="flood"
446+ in2="SourceGraphic"
447+ operator="in"
448+ result="composite1"
449+ id="feComposite954" />
450+ <feGaussianBlur
451+ in="composite1"
452+ stdDeviation="1"
453+ result="blur"
454+ id="feGaussianBlur956" />
455+ <feOffset
456+ dx="0"
457+ dy="1"
458+ result="offset"
459+ id="feOffset958" />
460+ <feComposite
461+ in="SourceGraphic"
462+ in2="offset"
463+ operator="over"
464+ result="composite2"
465+ id="feComposite960" />
466+ </filter>
467+ <clipPath
468+ clipPathUnits="userSpaceOnUse"
469+ id="clipPath873">
470+ <g
471+ transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
472+ id="g875"
473+ inkscape:label="Layer 1"
474+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
475+ <path
476+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
477+ d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
478+ id="path877"
479+ inkscape:connector-curvature="0"
480+ sodipodi:nodetypes="sssssssss" />
481+ </g>
482+ </clipPath>
483+ <filter
484+ inkscape:collect="always"
485+ id="filter891"
486+ inkscape:label="Badge Shadow">
487+ <feGaussianBlur
488+ inkscape:collect="always"
489+ stdDeviation="0.71999962"
490+ id="feGaussianBlur893" />
491+ </filter>
492+ </defs>
493+ <sodipodi:namedview
494+ id="base"
495+ pagecolor="#ffffff"
496+ bordercolor="#666666"
497+ borderopacity="1.0"
498+ inkscape:pageopacity="0.0"
499+ inkscape:pageshadow="2"
500+ inkscape:zoom="1.3995495"
501+ inkscape:cx="18.514671"
502+ inkscape:cy="49.018169"
503+ inkscape:document-units="px"
504+ inkscape:current-layer="layer1"
505+ showgrid="true"
506+ fit-margin-top="0"
507+ fit-margin-left="0"
508+ fit-margin-right="0"
509+ fit-margin-bottom="0"
510+ inkscape:window-width="1331"
511+ inkscape:window-height="674"
512+ inkscape:window-x="19"
513+ inkscape:window-y="1"
514+ inkscape:window-maximized="0"
515+ showborder="true"
516+ showguides="true"
517+ inkscape:guide-bbox="true"
518+ inkscape:showpageshadow="false">
519+ <inkscape:grid
520+ type="xygrid"
521+ id="grid821" />
522+ <sodipodi:guide
523+ orientation="1,0"
524+ position="16,48"
525+ id="guide823" />
526+ <sodipodi:guide
527+ orientation="0,1"
528+ position="64,80"
529+ id="guide825" />
530+ <sodipodi:guide
531+ orientation="1,0"
532+ position="80,40"
533+ id="guide827" />
534+ <sodipodi:guide
535+ orientation="0,1"
536+ position="64,16"
537+ id="guide829" />
538+ </sodipodi:namedview>
539+ <metadata
540+ id="metadata6522">
541+ <rdf:RDF>
542+ <cc:Work
543+ rdf:about="">
544+ <dc:format>image/svg+xml</dc:format>
545+ <dc:type
546+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
547+ <dc:title></dc:title>
548+ </cc:Work>
549+ </rdf:RDF>
550+ </metadata>
551+ <g
552+ inkscape:label="BACKGROUND"
553+ inkscape:groupmode="layer"
554+ id="layer1"
555+ transform="translate(268,-635.29076)"
556+ style="display:inline">
557+ <path
558+ style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
559+ d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
560+ id="path6455"
561+ inkscape:connector-curvature="0"
562+ sodipodi:nodetypes="sssssssss" />
563+ <image
564+ y="633.29077"
565+ x="-270"
566+ id="image3169"
567+ xlink:href="data:image/png;base64,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
696+AABJRU5ErkJggg==
697+"
698+ height="96"
699+ width="96"
700+ style="stroke:#000000;stroke-opacity:0.18666669" />
701+ </g>
702+ <g
703+ inkscape:groupmode="layer"
704+ id="layer3"
705+ inkscape:label="PLACE YOUR PICTOGRAM HERE"
706+ style="display:inline" />
707+ <g
708+ inkscape:groupmode="layer"
709+ id="layer2"
710+ inkscape:label="BADGE"
711+ style="display:none"
712+ sodipodi:insensitive="true">
713+ <g
714+ style="display:inline"
715+ transform="translate(-340.00001,-581)"
716+ id="g4394"
717+ clip-path="none">
718+ <g
719+ id="g855">
720+ <g
721+ inkscape:groupmode="maskhelper"
722+ id="g870"
723+ clip-path="url(#clipPath873)"
724+ style="opacity:0.6;filter:url(#filter891)">
725+ <path
726+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
727+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
728+ sodipodi:ry="12"
729+ sodipodi:rx="12"
730+ sodipodi:cy="552.36218"
731+ sodipodi:cx="252"
732+ id="path844"
733+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
734+ sodipodi:type="arc" />
735+ </g>
736+ <g
737+ id="g862">
738+ <path
739+ sodipodi:type="arc"
740+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
741+ id="path4398"
742+ sodipodi:cx="252"
743+ sodipodi:cy="552.36218"
744+ sodipodi:rx="12"
745+ sodipodi:ry="12"
746+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
747+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
748+ <path
749+ transform="matrix(1.25,0,0,1.25,33,-100.45273)"
750+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
751+ sodipodi:ry="12"
752+ sodipodi:rx="12"
753+ sodipodi:cy="552.36218"
754+ sodipodi:cx="252"
755+ id="path4400"
756+ style="color:#000000;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
757+ sodipodi:type="arc" />
758+ <path
759+ sodipodi:type="star"
760+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
761+ id="path4459"
762+ sodipodi:sides="5"
763+ sodipodi:cx="666.19574"
764+ sodipodi:cy="589.50385"
765+ sodipodi:r1="7.2431178"
766+ sodipodi:r2="4.3458705"
767+ sodipodi:arg1="1.0471976"
768+ sodipodi:arg2="1.6755161"
769+ inkscape:flatsided="false"
770+ inkscape:rounded="0.1"
771+ inkscape:randomized="0"
772+ d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
773+ transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
774+ </g>
775+ </g>
776+ </g>
777+ </g>
778+</svg>
779
780=== added directory 'telco/precise/clearwater-bono/lib'
781=== added file 'telco/precise/clearwater-bono/lib/chef_solo_install'
782--- telco/precise/clearwater-bono/lib/chef_solo_install 1970-01-01 00:00:00 +0000
783+++ telco/precise/clearwater-bono/lib/chef_solo_install 2014-11-10 14:55:38 +0000
784@@ -0,0 +1,34 @@
785+#!/bin/bash
786+
787+# This covers installing chef-solo and the Clearwater chef recipes
788+# Install needed libraries
789+apt-get -y install git libxml2-dev libxslt1-dev wget curl
790+
791+# Install chef
792+install_sh="http://opscode.com/chef/install.sh"
793+version_string="-v 11.6.0"
794+bash <(wget ${install_sh} -O -) ${version_string}
795+
796+# Pull down the Clearwater chef recipes
797+if [ ! -d /home/ubuntu/chef-solo ]
798+then
799+ mkdir /home/ubuntu/chef-solo
800+ git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
801+fi
802+
803+# Update the chef recipes
804+cd /home/ubuntu/chef-solo
805+git pull origin --recurse-submodules master
806+
807+# Create the solo.rb file
808+cat > /home/ubuntu/chef-solo/solo.rb <<EOP
809+file_cache_path "/var/chef-solo"
810+cookbook_path [
811+ "/home/ubuntu/chef-solo/cookbooks"
812+]
813+data_bag_path "/home/ubuntu/chef-solo/data_bags"
814+environment_path "/home/ubuntu/chef-solo/environments"
815+role_path "/home/ubuntu/chef-solo/roles"
816+verbose_logging true
817+log_level :debug
818+EOP
819
820=== added file 'telco/precise/clearwater-bono/lib/config_script'
821--- telco/precise/clearwater-bono/lib/config_script 1970-01-01 00:00:00 +0000
822+++ telco/precise/clearwater-bono/lib/config_script 2014-11-10 14:55:38 +0000
823@@ -0,0 +1,48 @@
824+#!/bin/bash
825+
826+relation_name=$1
827+
828+set -e
829+
830+# Defaults
831+sprout_hostname=sprout.$(config-get zone)
832+hs_hostname=homestead.$(config-get zone):8888
833+hs_provisioning_hostname=homestead.$(config-get zone):8889
834+xdms_hostname=
835+ralf_hostname=
836+enum_server=
837+
838+# Import existing configuration
839+[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
840+
841+# Apply new configuration
842+home_domain=$(config-get zone)
843+[ "$relation-name" != "scscf" ] || [ "$(relation-get public-address)" = "" ] || sprout_hostname=$(relation-get public-address)
844+[ "$relation-name" != "ralf-ctf" ] || [ "$(relation-get public-address)" = "" ] || ralf_hostname=$(relation-get public-address):9888
845+sas_server=$(config-get sas)
846+local_ip=$($CHARM_DIR/lib/unit-get private-address)
847+public_ip=$($CHARM_DIR/lib/unit-get public-address)
848+public_hostname=bono-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
849+turn_workaround=$(config-get turn_workaround)
850+
851+# Write configuration back
852+mkdir -p /etc/clearwater
853+cat >/etc/clearwater/config <<EOF
854+# Deployment definitions
855+home_domain=$home_domain
856+sprout_hostname=$sprout_hostname
857+hs_hostname=$hs_hostname
858+hs_provisioning_hostname=$hs_provisioning_hostname
859+xdms_hostname=$xdms_hostname
860+ralf_hostname=$ralf_hostname
861+sas_server=$sas_server
862+enum_server=$enum_server
863+
864+# Local IP configuration
865+local_ip=$local_ip
866+public_ip=$public_ip
867+public_hostname=$public_hostname
868+
869+# Keys
870+turn_workaround=$turn_workaround
871+EOF
872
873=== added file 'telco/precise/clearwater-bono/lib/node_json_script'
874--- telco/precise/clearwater-bono/lib/node_json_script 1970-01-01 00:00:00 +0000
875+++ telco/precise/clearwater-bono/lib/node_json_script 2014-11-10 14:55:38 +0000
876@@ -0,0 +1,58 @@
877+#!/usr/bin/python
878+
879+import subprocess
880+import string
881+import socket
882+import os
883+import argparse
884+
885+# Create the ~/chef-solo/node.json file.
886+#
887+# The node.json file contains the machines IP address, the machine ID (a number)
888+# and the repo server.
889+#
890+# If the node is being clustered, the role 'clustered' is added, and after
891+# clustering the tag 'clustered' is added (for homer/homestead)
892+#
893+# The node.json file is templated in lib/node_json_template.
894+
895+parser = argparse.ArgumentParser()
896+
897+parser.add_argument('--cluster', action='store_true')
898+parser.add_argument('--tag', action='store_true')
899+
900+args = parser.parse_args()
901+
902+# Populate the dictionary
903+d = {}
904+
905+d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
906+d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
907+d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
908+d['TRUSTED_PEERS'] = ','.join(['"' + ip + '"' for ip in subprocess.check_output(["config-get", "trusted_peers"]).rstrip().split(',')])
909+
910+node_file = "/home/ubuntu/chef-solo/node.json"
911+if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
912+ d['CLUSTER'] = ",\n \"role[clustered]\""
913+ d['CLUSTERED'] = ", \"clustered\""
914+ d['TAG'] = ""
915+
916+ if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
917+ d['TAG'] = ",\n \"tags\": [\"clustered\"]"
918+
919+else:
920+ d['CLUSTER'] = ""
921+ d['CLUSTERED'] = ""
922+ d['TAG'] = ""
923+
924+# Open template file
925+charm_dir = os.environ['CHARM_DIR']
926+with open( '%s/lib/node_json_template' % charm_dir ) as f:
927+ src = string.Template( f.read() )
928+
929+# Make the substitutions
930+result = src.substitute(d)
931+
932+# Write to ~/chef-solo/node.json
933+with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
934+ f.write(result)
935
936=== added file 'telco/precise/clearwater-bono/lib/node_json_template'
937--- telco/precise/clearwater-bono/lib/node_json_template 1970-01-01 00:00:00 +0000
938+++ telco/precise/clearwater-bono/lib/node_json_template 2014-11-10 14:55:38 +0000
939@@ -0,0 +1,18 @@
940+{
941+ "id": "$LOCAL_IP",
942+ "name": "$LOCAL_IP",
943+ "chef_environment": "_default",
944+ "role": "bono",
945+ "roles": ["clearwater-infrastructure", "bono"$CLUSTERED],
946+ "cloud": {
947+ "local_ipv4": "$LOCAL_IP"
948+ },
949+ "clearwater": {
950+ "index": $MACHINE_ID,
951+ "repo_server": "$REPO",
952+ "trusted_peers": [$TRUSTED_PEERS]
953+ },
954+ "run_list": [
955+ "role[bono]"$CLUSTER
956+ ]$TAG
957+}
958
959=== added file 'telco/precise/clearwater-bono/lib/restart'
960--- telco/precise/clearwater-bono/lib/restart 1970-01-01 00:00:00 +0000
961+++ telco/precise/clearwater-bono/lib/restart 2014-11-10 14:55:38 +0000
962@@ -0,0 +1,6 @@
963+#!/bin/bash
964+set -e
965+
966+# Restart clearwater-infrastructure, and stop bono (to be restarted by monit)
967+service clearwater-infrastructure restart
968+service bono stop
969
970=== added file 'telco/precise/clearwater-bono/lib/unit-get'
971--- telco/precise/clearwater-bono/lib/unit-get 1970-01-01 00:00:00 +0000
972+++ telco/precise/clearwater-bono/lib/unit-get 2014-11-10 14:55:38 +0000
973@@ -0,0 +1,36 @@
974+#!/bin/bash
975+set -ex
976+onEC2=false
977+key=$1
978+val=$(unit-get $1)
979+
980+if [ -f $CHARM_DIR/lib/provider.txt ]
981+then
982+ PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
983+else
984+ #checking dirty ec2 hack will work
985+ wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
986+ if ( "$onEC2" == true )
987+ then
988+ echo "EC2" > $CHARM_DIR/lib/provider.txt
989+ else
990+ echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
991+ fi
992+fi
993+
994+if [ "$PROVIDER" == "EC2" ]
995+then
996+ if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
997+ then
998+ val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
999+ elif [ "$key" = "private-address" ]
1000+ then
1001+ val_ip=$(dig +short $val | head -1)
1002+ [ -z "$val_ip" ] || val=$val_ip
1003+ ##if val_ip is empty getting the system IP
1004+ [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
1005+ fi
1006+fi
1007+
1008+echo $val
1009+
1010
1011=== added file 'telco/precise/clearwater-bono/metadata.yaml'
1012--- telco/precise/clearwater-bono/metadata.yaml 1970-01-01 00:00:00 +0000
1013+++ telco/precise/clearwater-bono/metadata.yaml 2014-11-10 14:55:38 +0000
1014@@ -0,0 +1,15 @@
1015+name: clearwater-bono
1016+summary: Bono charm for Project Clearwater
1017+maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
1018+description: Bono charm for Project Clearwater
1019+categories:
1020+ - misc
1021+subordinate: false
1022+requires:
1023+ programmable-multiple:
1024+ interface: dns-multi
1025+ scscf:
1026+ interface: 3GPP-Mr
1027+ ralf-ctf:
1028+ interface: ralf-ctf-interface
1029+ optional: true
1030
1031=== added file 'telco/precise/clearwater-bono/revision'
1032--- telco/precise/clearwater-bono/revision 1970-01-01 00:00:00 +0000
1033+++ telco/precise/clearwater-bono/revision 2014-11-10 14:55:38 +0000
1034@@ -0,0 +1,1 @@
1035+1
1036
1037=== added directory 'telco/precise/clearwater-ellis'
1038=== added file 'telco/precise/clearwater-ellis/README.md'
1039--- telco/precise/clearwater-ellis/README.md 1970-01-01 00:00:00 +0000
1040+++ telco/precise/clearwater-ellis/README.md 2014-11-10 14:55:38 +0000
1041@@ -0,0 +1,90 @@
1042+# Overview
1043+
1044+This charm supports deployment of the Ellis self-provisioning portal for Project Clearwater system. See http://www.projectclearwater.org for more information on Project Clearwater.
1045+
1046+# Usage
1047+
1048+The Ellis service should be deployed as part of a Clearwater system. A Clearwater system can be deployed in a Juju environment by creating a config.yaml file then running the following commands.
1049+
1050+ juju deploy --config config.yaml clearwater-route53
1051+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
1052+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
1053+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
1054+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
1055+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
1056+ juju add-relation clearwater-ellis clearwater-route53:register-ellis
1057+ juju add-relation clearwater-bono clearwater-route53:register-bono
1058+ juju add-relation clearwater-sprout clearwater-route53:register-sprout
1059+ juju add-relation clearwater-homestead clearwater-route53:register-homestead
1060+ juju add-relation clearwater-homer clearwater-route53:register-homer
1061+ juju expose clearwater-bono
1062+ juju expose clearwater-ellis
1063+
1064+The config.yaml configuration file takes the following format.
1065+
1066+ clearwater-route53:
1067+ zone: <domain>
1068+ access_key: <ec2 access key>
1069+ secret_key: <ec2 secret access key>
1070+ sas: "0.0.0.0"
1071+
1072+ clearwater-ellis:
1073+ smtp_server: smtp.cw-ngv.com
1074+ smtp_username: username
1075+ smtp_password: password
1076+ email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
1077+ signup_key: secret
1078+ base_number: "6505550000"
1079+ number_count: 1000
1080+ repo: http://repo.cw-ngv.com/stable
1081+
1082+ clearwater-bono:
1083+ turn_workaround: password
1084+ repo: http://repo.cw-ngv.com/stable
1085+
1086+ clearwater-sprout:
1087+ reg_min_expires: 400
1088+ session_max_expires: 900
1089+ repo: http://repo.cw-ngv.com/stable
1090+
1091+ clearwater-homestead:
1092+ repo: http://repo.cw-ngv.com/stable
1093+
1094+ clearwater-homer:
1095+ repo: http://repo.cw-ngv.com/stable
1096+
1097+Note that the clearwater-ellis charm can only be deployed on the `amd64` architecture.
1098+
1099+## Scale out Usage
1100+
1101+Ellis does not currently support scaling out.
1102+
1103+## Known Limitations and Issues
1104+
1105+The only currently supported DNS service for Clearwater is clearwater-route53 (when deploying in Amazon EC2), so will currently only work on EC2. Additional DNS services will be added for other environments in future.
1106+
1107+Note that this charm does not current pass charm proof because its hooks use EC2 APIs directly to obtain the public IP address rather than unit-get public-address. This is to work around what looks like a Juju bug - unit-get public-address on EC2 returns the public hostname of the unit rather than the public IP address. Unfortunately EC2 public hostname are actually split horizon hostnames, so if you attempt to resolve the hostname from within EC2 it actually resolved to a private IP address - it will only resolve to a public address if resolved from outside EC2.
1108+
1109+# Configuration
1110+
1111+Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
1112+
1113+clearwater-route53
1114+
1115+- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
1116+- `access_key:` and `secret_key:` These must be set to the AWS access key and secret key of the AWS account which owns the DNS zone name.
1117+
1118+clearwater-ellis
1119+
1120+- `signup_key:` This is used as a signup key on the Ellis self-provisioning portal, so should be set to a unique string for each installation.
1121+- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
1122+
1123+# Contact Information
1124+
1125+## Upstream Project Name
1126+
1127+See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
1128+
1129+Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
1130+
1131+The Clearwater mailing list is at lists.projectclearwater.org.
1132
1133=== added file 'telco/precise/clearwater-ellis/config.yaml'
1134--- telco/precise/clearwater-ellis/config.yaml 1970-01-01 00:00:00 +0000
1135+++ telco/precise/clearwater-ellis/config.yaml 2014-11-10 14:55:38 +0000
1136@@ -0,0 +1,34 @@
1137+options:
1138+ zone:
1139+ description: The DNS root zone for this service
1140+ type: string
1141+ smtp_server:
1142+ default: ""
1143+ description: The SMTP server to send password recovery emails from
1144+ type: string
1145+ smtp_username:
1146+ default: ""
1147+ description: Username to authenticate with the SMTP server
1148+ type: string
1149+ smtp_password:
1150+ default: ""
1151+ description: Password to authenticate with the SMTP server
1152+ type: string
1153+ email_sender:
1154+ default: ""
1155+ description: Email address to send recovery emails from
1156+ type: string
1157+ signup_key:
1158+ description: The secret signup key used to create a new account
1159+ type: string
1160+ base_number:
1161+ description: The first number to be allocated in the number range
1162+ type: string
1163+ number_count:
1164+ default: 1
1165+ description: The count of numbers to allocate
1166+ type: int
1167+ repo:
1168+ default: http://repo.cw-ngv.com/stable
1169+ description: The location of the repo server
1170+ type: string
1171
1172=== added file 'telco/precise/clearwater-ellis/copyright'
1173--- telco/precise/clearwater-ellis/copyright 1970-01-01 00:00:00 +0000
1174+++ telco/precise/clearwater-ellis/copyright 2014-11-10 14:55:38 +0000
1175@@ -0,0 +1,31 @@
1176+Project Clearwater - IMS in the Cloud
1177+Copyright (C) 2013 Metaswitch Networks Ltd
1178+
1179+This program is free software: you can redistribute it and/or modify it
1180+under the terms of the GNU General Public License as published by the
1181+Free Software Foundation, either version 3 of the License, or (at your
1182+option) any later version, along with the "Special Exception" for use of
1183+the program along with SSL, set forth below. This program is distributed
1184+in the hope that it will be useful, but WITHOUT ANY WARRANTY;
1185+without even the implied warranty of MERCHANTABILITY or FITNESS FOR
1186+A PARTICULAR PURPOSE. See the GNU General Public License for more
1187+details. You should have received a copy of the GNU General Public
1188+License along with this program. If not, see
1189+<http://www.gnu.org/licenses/>.
1190+
1191+The author can be reached by email at clearwater@metaswitch.com or by
1192+post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
1193+
1194+Special Exception
1195+Metaswitch Networks Ltd grants you permission to copy, modify,
1196+propagate, and distribute a work formed by combining OpenSSL with The
1197+Software, or a work derivative of such a combination, even if such
1198+copying, modification, propagation, or distribution would otherwise
1199+violate the terms of the GPL. You must comply with the GPL in all
1200+respects for all of the code used other than OpenSSL.
1201+"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
1202+Project and licensed under the OpenSSL Licenses, or a work based on such
1203+software and licensed under the OpenSSL Licenses.
1204+"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
1205+under which the OpenSSL Project distributes the OpenSSL toolkit software,
1206+as those licenses appear in the file LICENSE-OPENSSL.
1207
1208=== added directory 'telco/precise/clearwater-ellis/hooks'
1209=== added file 'telco/precise/clearwater-ellis/hooks/as-catalog-relation-changed'
1210--- telco/precise/clearwater-ellis/hooks/as-catalog-relation-changed 1970-01-01 00:00:00 +0000
1211+++ telco/precise/clearwater-ellis/hooks/as-catalog-relation-changed 2014-11-10 14:55:38 +0000
1212@@ -0,0 +1,32 @@
1213+#!/bin/bash
1214+set -e
1215+
1216+AS_JSON=/usr/share/clearwater/ellis/web-content/js/app-servers.json
1217+TMP_AS_JSON=/tmp/app-servers.json.$$
1218+
1219+id=$(cut -d/ -f2 <<< $JUJU_REMOTE_UNIT)
1220+as_name=$(relation-get as-name)
1221+as_uri=$(relation-get as-uri)
1222+
1223+# If an AS name was specified, create/update a file for the AS. Otherwise delete it.
1224+if [ "$as_name" != "" ] ; then
1225+ cat > $AS_JSON.$id <<EOF
1226+ "$as_name": "<InitialFilterCriteria><Priority>1</Priority><TriggerPoint><ConditionTypeCNF /><SPT><Group>0</Group><Method>REGISTER</Method></SPT><SPT><Group>1</Group><Method>INVITE</Method></SPT><SPT><Group>2</Group><Method>MESSAGE</Method></SPT></TriggerPoint><ApplicationServer><ServerName>$as_uri</ServerName><DefaultHandling>0</DefaultHandling></ApplicationServer></InitialFilterCriteria>",
1227+EOF
1228+else
1229+ rm -f $AS_JSON.$id
1230+fi
1231+
1232+{
1233+ # Open the JSON body
1234+ echo {
1235+ # Concatenate all the AS files,
1236+ # remove any duplicates (on the first field) and then
1237+ # remove a comma from the end of the last line.
1238+ cat $AS_JSON.* 2>/dev/null |
1239+ sort -k 1,1 -u |
1240+ sed -e '$ s/,$//'
1241+ # Close the JSON body
1242+ echo }
1243+} > $TMP_AS_JSON
1244+mv $TMP_AS_JSON $AS_JSON
1245
1246=== added file 'telco/precise/clearwater-ellis/hooks/as-catalog-relation-departed'
1247--- telco/precise/clearwater-ellis/hooks/as-catalog-relation-departed 1970-01-01 00:00:00 +0000
1248+++ telco/precise/clearwater-ellis/hooks/as-catalog-relation-departed 2014-11-10 14:55:38 +0000
1249@@ -0,0 +1,24 @@
1250+#!/bin/bash
1251+set -e
1252+
1253+AS_JSON=/usr/share/clearwater/ellis/web-content/js/app-servers.json
1254+TMP_AS_JSON=/tmp/app-servers.json.$$
1255+
1256+id=$(cut -d/ -f2 <<< $JUJU_REMOTE_UNIT)
1257+
1258+# Delete the entry for this relation peer.
1259+rm -f $AS_JSON.$id
1260+
1261+{
1262+ # Open the JSON body
1263+ echo {
1264+ # Concatenate all the AS files,
1265+ # remove any duplicates (on the first field) and then
1266+ # remove a comma from the end of the last line.
1267+ cat $AS_JSON.* 2>/dev/null |
1268+ sort -k 1,1 -u |
1269+ sed -e '$ s/,$//'
1270+ # Close the JSON body
1271+ echo }
1272+} > $TMP_AS_JSON
1273+mv $TMP_AS_JSON $AS_JSON
1274
1275=== added file 'telco/precise/clearwater-ellis/hooks/config-changed'
1276--- telco/precise/clearwater-ellis/hooks/config-changed 1970-01-01 00:00:00 +0000
1277+++ telco/precise/clearwater-ellis/hooks/config-changed 2014-11-10 14:55:38 +0000
1278@@ -0,0 +1,14 @@
1279+#!/bin/bash
1280+set -e
1281+
1282+# Update the /etc/clearwater/config file, the node.json, and re-run
1283+# chef-solo
1284+$CHARM_DIR/lib/config_script
1285+$CHARM_DIR/lib/node_json_script
1286+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
1287+$CHARM_DIR/lib/restart
1288+
1289+# Create subscribers
1290+if [ "$(config-get base_number)" != "" ] ; then
1291+ /usr/share/clearwater/ellis/env/bin/python /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/create_numbers.py --start "$(config-get base_number)" --count "$(config-get number_count)"
1292+fi
1293
1294=== added file 'telco/precise/clearwater-ellis/hooks/homestead-prov-relation-changed'
1295--- telco/precise/clearwater-ellis/hooks/homestead-prov-relation-changed 1970-01-01 00:00:00 +0000
1296+++ telco/precise/clearwater-ellis/hooks/homestead-prov-relation-changed 2014-11-10 14:55:38 +0000
1297@@ -0,0 +1,6 @@
1298+#!/bin/bash
1299+set -e
1300+
1301+# Update Clearwater configuration and restart
1302+$CHARM_DIR/lib/config_script homestead-hss
1303+$CHARM_DIR/lib/restart
1304
1305=== added file 'telco/precise/clearwater-ellis/hooks/install'
1306--- telco/precise/clearwater-ellis/hooks/install 1970-01-01 00:00:00 +0000
1307+++ telco/precise/clearwater-ellis/hooks/install 2014-11-10 14:55:38 +0000
1308@@ -0,0 +1,37 @@
1309+#!/bin/bash
1310+
1311+# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
1312+# for public-address and private-address. To work-around this, we resolve the
1313+# host names. However, after we've joined to the DNSaaS charm, we can no longer
1314+# resolve these, so add them to /etc/hosts.
1315+if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
1316+ private_address=$(unit-get private-address)
1317+ public_address=$(unit-get public-address)
1318+ private_ip=$($CHARM_DIR/lib/unit-get private-address)
1319+ public_ip=$($CHARM_DIR/lib/unit-get public-address)
1320+ [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
1321+ [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
1322+ echo "$public_ip ellis-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
1323+fi
1324+
1325+# Install chef solo, and create the node.json and config file
1326+$CHARM_DIR/lib/chef_solo_install
1327+$CHARM_DIR/lib/node_json_script
1328+$CHARM_DIR/lib/config_script
1329+
1330+apt-get update
1331+
1332+# Install the node
1333+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
1334+
1335+# Create subscribers
1336+if [ "$(config-get base_number)" != "" ] ; then
1337+ /usr/share/clearwater/ellis/env/bin/python /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/create_numbers.py --start "$(config-get base_number)" --count "$(config-get number_count)"
1338+fi
1339+
1340+# Expose the correct ports
1341+open-port 22/tcp
1342+open-port 80/tcp
1343+open-port 123/udp
1344+open-port 161/udp
1345+open-port 443/tcp
1346
1347=== added file 'telco/precise/clearwater-ellis/hooks/programmable-multiple-relation-changed'
1348--- telco/precise/clearwater-ellis/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
1349+++ telco/precise/clearwater-ellis/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
1350@@ -0,0 +1,24 @@
1351+#!/bin/bash
1352+set -e
1353+
1354+# Set our DNS requirements
1355+TTL=300
1356+id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
1357+ip=$($CHARM_DIR/lib/unit-get public-address)
1358+relation-set domain=$(config-get zone)
1359+relation-set resources='ellis '$TTL' IN A '$ip'
1360+ellis-'$id' '$TTL' IN A '$ip
1361+
1362+# Update our DNS server
1363+if [ "$(relation-get public-address)" != "" ]
1364+then
1365+ echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
1366+ grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
1367+ mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
1368+ echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
1369+ service dnsmasq restart
1370+fi
1371+
1372+# Update Clearwater configuration and restart
1373+$CHARM_DIR/lib/config_script programmable-multiple
1374+$CHARM_DIR/lib/restart
1375
1376=== added file 'telco/precise/clearwater-ellis/hooks/start'
1377--- telco/precise/clearwater-ellis/hooks/start 1970-01-01 00:00:00 +0000
1378+++ telco/precise/clearwater-ellis/hooks/start 2014-11-10 14:55:38 +0000
1379@@ -0,0 +1,16 @@
1380+#!/bin/bash
1381+# Here put anything that is needed to start the service.
1382+# Note that currently this is run directly after install
1383+# i.e. 'service apache2 start'
1384+set -e
1385+
1386+# This hook needs to be idempotent, so this could be run when ellis is
1387+# already running, when it's running but not monitored by monit, when
1388+# it's stopped but being monitored (so it's about to start), or stopped
1389+# and unmonitored. To cover all these cases, stop monit, start ellis, start
1390+# monit, then finally have monit monitor ellis
1391+service monit stop
1392+service ellis start
1393+service monit start
1394+sleep 1
1395+monit monitor ellis
1396
1397=== added file 'telco/precise/clearwater-ellis/hooks/stop'
1398--- telco/precise/clearwater-ellis/hooks/stop 1970-01-01 00:00:00 +0000
1399+++ telco/precise/clearwater-ellis/hooks/stop 2014-11-10 14:55:38 +0000
1400@@ -0,0 +1,12 @@
1401+#!/bin/bash
1402+# This will be run when the service is being torn down, allowing you to disable
1403+# it in various ways..
1404+# For example, if your web app uses a text file to signal to the load balancer
1405+# that it is live... you could remove it and sleep for a bit to allow the load
1406+# balancer to stop sending traffic.
1407+# rm /srv/webroot/server-live.txt && sleep 30
1408+set -e
1409+
1410+# Stop ellis via monit
1411+sudo service monit start
1412+sudo monit stop ellis
1413
1414=== added file 'telco/precise/clearwater-ellis/hooks/upgrade-charm'
1415--- telco/precise/clearwater-ellis/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
1416+++ telco/precise/clearwater-ellis/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
1417@@ -0,0 +1,9 @@
1418+#!/bin/bash
1419+# This hook is executed each time a charm is upgraded after the new charm
1420+# contents have been unpacked
1421+# Best practice suggests you execute the hooks/install and
1422+# hooks/config-changed to ensure all updates are processed
1423+set -e
1424+
1425+$CHARM_DIR/hooks/install
1426+$CHARM_DIR/hooks/config-changed
1427
1428=== added file 'telco/precise/clearwater-ellis/hooks/xdms-relation-changed'
1429--- telco/precise/clearwater-ellis/hooks/xdms-relation-changed 1970-01-01 00:00:00 +0000
1430+++ telco/precise/clearwater-ellis/hooks/xdms-relation-changed 2014-11-10 14:55:38 +0000
1431@@ -0,0 +1,6 @@
1432+#!/bin/bash
1433+set -e
1434+
1435+# Update Clearwater configuration and restart
1436+$CHARM_DIR/lib/config_script xdms
1437+$CHARM_DIR/lib/restart
1438
1439=== added file 'telco/precise/clearwater-ellis/icon.svg'
1440--- telco/precise/clearwater-ellis/icon.svg 1970-01-01 00:00:00 +0000
1441+++ telco/precise/clearwater-ellis/icon.svg 2014-11-10 14:55:38 +0000
1442@@ -0,0 +1,407 @@
1443+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
1444+<!-- Created with Inkscape (http://www.inkscape.org/) -->
1445+
1446+<svg
1447+ xmlns:dc="http://purl.org/dc/elements/1.1/"
1448+ xmlns:cc="http://creativecommons.org/ns#"
1449+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
1450+ xmlns:svg="http://www.w3.org/2000/svg"
1451+ xmlns="http://www.w3.org/2000/svg"
1452+ xmlns:xlink="http://www.w3.org/1999/xlink"
1453+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
1454+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
1455+ width="96"
1456+ height="96"
1457+ id="svg6517"
1458+ version="1.1"
1459+ inkscape:version="0.48.2 r9819"
1460+ sodipodi:docname="icon.svg">
1461+ <defs
1462+ id="defs6519">
1463+ <linearGradient
1464+ id="Background">
1465+ <stop
1466+ id="stop4178"
1467+ offset="0"
1468+ style="stop-color:#b8b8b8;stop-opacity:1" />
1469+ <stop
1470+ id="stop4180"
1471+ offset="1"
1472+ style="stop-color:#c9c9c9;stop-opacity:1" />
1473+ </linearGradient>
1474+ <filter
1475+ style="color-interpolation-filters:sRGB;"
1476+ inkscape:label="Inner Shadow"
1477+ id="filter1121">
1478+ <feFlood
1479+ flood-opacity="0.59999999999999998"
1480+ flood-color="rgb(0,0,0)"
1481+ result="flood"
1482+ id="feFlood1123" />
1483+ <feComposite
1484+ in="flood"
1485+ in2="SourceGraphic"
1486+ operator="out"
1487+ result="composite1"
1488+ id="feComposite1125" />
1489+ <feGaussianBlur
1490+ in="composite1"
1491+ stdDeviation="1"
1492+ result="blur"
1493+ id="feGaussianBlur1127" />
1494+ <feOffset
1495+ dx="0"
1496+ dy="2"
1497+ result="offset"
1498+ id="feOffset1129" />
1499+ <feComposite
1500+ in="offset"
1501+ in2="SourceGraphic"
1502+ operator="atop"
1503+ result="composite2"
1504+ id="feComposite1131" />
1505+ </filter>
1506+ <filter
1507+ style="color-interpolation-filters:sRGB;"
1508+ inkscape:label="Drop Shadow"
1509+ id="filter950">
1510+ <feFlood
1511+ flood-opacity="0.25"
1512+ flood-color="rgb(0,0,0)"
1513+ result="flood"
1514+ id="feFlood952" />
1515+ <feComposite
1516+ in="flood"
1517+ in2="SourceGraphic"
1518+ operator="in"
1519+ result="composite1"
1520+ id="feComposite954" />
1521+ <feGaussianBlur
1522+ in="composite1"
1523+ stdDeviation="1"
1524+ result="blur"
1525+ id="feGaussianBlur956" />
1526+ <feOffset
1527+ dx="0"
1528+ dy="1"
1529+ result="offset"
1530+ id="feOffset958" />
1531+ <feComposite
1532+ in="SourceGraphic"
1533+ in2="offset"
1534+ operator="over"
1535+ result="composite2"
1536+ id="feComposite960" />
1537+ </filter>
1538+ <clipPath
1539+ clipPathUnits="userSpaceOnUse"
1540+ id="clipPath873">
1541+ <g
1542+ transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
1543+ id="g875"
1544+ inkscape:label="Layer 1"
1545+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
1546+ <path
1547+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
1548+ d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
1549+ id="path877"
1550+ inkscape:connector-curvature="0"
1551+ sodipodi:nodetypes="sssssssss" />
1552+ </g>
1553+ </clipPath>
1554+ <filter
1555+ inkscape:collect="always"
1556+ id="filter891"
1557+ inkscape:label="Badge Shadow">
1558+ <feGaussianBlur
1559+ inkscape:collect="always"
1560+ stdDeviation="0.71999962"
1561+ id="feGaussianBlur893" />
1562+ </filter>
1563+ </defs>
1564+ <sodipodi:namedview
1565+ id="base"
1566+ pagecolor="#ffffff"
1567+ bordercolor="#666666"
1568+ borderopacity="1.0"
1569+ inkscape:pageopacity="0.0"
1570+ inkscape:pageshadow="2"
1571+ inkscape:zoom="1.3995495"
1572+ inkscape:cx="18.514671"
1573+ inkscape:cy="49.018169"
1574+ inkscape:document-units="px"
1575+ inkscape:current-layer="layer1"
1576+ showgrid="true"
1577+ fit-margin-top="0"
1578+ fit-margin-left="0"
1579+ fit-margin-right="0"
1580+ fit-margin-bottom="0"
1581+ inkscape:window-width="1331"
1582+ inkscape:window-height="674"
1583+ inkscape:window-x="19"
1584+ inkscape:window-y="1"
1585+ inkscape:window-maximized="0"
1586+ showborder="true"
1587+ showguides="true"
1588+ inkscape:guide-bbox="true"
1589+ inkscape:showpageshadow="false">
1590+ <inkscape:grid
1591+ type="xygrid"
1592+ id="grid821" />
1593+ <sodipodi:guide
1594+ orientation="1,0"
1595+ position="16,48"
1596+ id="guide823" />
1597+ <sodipodi:guide
1598+ orientation="0,1"
1599+ position="64,80"
1600+ id="guide825" />
1601+ <sodipodi:guide
1602+ orientation="1,0"
1603+ position="80,40"
1604+ id="guide827" />
1605+ <sodipodi:guide
1606+ orientation="0,1"
1607+ position="64,16"
1608+ id="guide829" />
1609+ </sodipodi:namedview>
1610+ <metadata
1611+ id="metadata6522">
1612+ <rdf:RDF>
1613+ <cc:Work
1614+ rdf:about="">
1615+ <dc:format>image/svg+xml</dc:format>
1616+ <dc:type
1617+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
1618+ <dc:title></dc:title>
1619+ </cc:Work>
1620+ </rdf:RDF>
1621+ </metadata>
1622+ <g
1623+ inkscape:label="BACKGROUND"
1624+ inkscape:groupmode="layer"
1625+ id="layer1"
1626+ transform="translate(268,-635.29076)"
1627+ style="display:inline">
1628+ <path
1629+ style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
1630+ d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
1631+ id="path6455"
1632+ inkscape:connector-curvature="0"
1633+ sodipodi:nodetypes="sssssssss" />
1634+ <image
1635+ y="633.29077"
1636+ x="-270"
1637+ id="image3169"
1638+ xlink:href="data:image/png;base64,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
1767+AABJRU5ErkJggg==
1768+"
1769+ height="96"
1770+ width="96"
1771+ style="stroke:#000000;stroke-opacity:0.18666669" />
1772+ </g>
1773+ <g
1774+ inkscape:groupmode="layer"
1775+ id="layer3"
1776+ inkscape:label="PLACE YOUR PICTOGRAM HERE"
1777+ style="display:inline" />
1778+ <g
1779+ inkscape:groupmode="layer"
1780+ id="layer2"
1781+ inkscape:label="BADGE"
1782+ style="display:none"
1783+ sodipodi:insensitive="true">
1784+ <g
1785+ style="display:inline"
1786+ transform="translate(-340.00001,-581)"
1787+ id="g4394"
1788+ clip-path="none">
1789+ <g
1790+ id="g855">
1791+ <g
1792+ inkscape:groupmode="maskhelper"
1793+ id="g870"
1794+ clip-path="url(#clipPath873)"
1795+ style="opacity:0.6;filter:url(#filter891)">
1796+ <path
1797+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
1798+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
1799+ sodipodi:ry="12"
1800+ sodipodi:rx="12"
1801+ sodipodi:cy="552.36218"
1802+ sodipodi:cx="252"
1803+ id="path844"
1804+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
1805+ sodipodi:type="arc" />
1806+ </g>
1807+ <g
1808+ id="g862">
1809+ <path
1810+ sodipodi:type="arc"
1811+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
1812+ id="path4398"
1813+ sodipodi:cx="252"
1814+ sodipodi:cy="552.36218"
1815+ sodipodi:rx="12"
1816+ sodipodi:ry="12"
1817+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
1818+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
1819+ <path
1820+ transform="matrix(1.25,0,0,1.25,33,-100.45273)"
1821+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
1822+ sodipodi:ry="12"
1823+ sodipodi:rx="12"
1824+ sodipodi:cy="552.36218"
1825+ sodipodi:cx="252"
1826+ id="path4400"
1827+ style="color:#000000;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
1828+ sodipodi:type="arc" />
1829+ <path
1830+ sodipodi:type="star"
1831+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
1832+ id="path4459"
1833+ sodipodi:sides="5"
1834+ sodipodi:cx="666.19574"
1835+ sodipodi:cy="589.50385"
1836+ sodipodi:r1="7.2431178"
1837+ sodipodi:r2="4.3458705"
1838+ sodipodi:arg1="1.0471976"
1839+ sodipodi:arg2="1.6755161"
1840+ inkscape:flatsided="false"
1841+ inkscape:rounded="0.1"
1842+ inkscape:randomized="0"
1843+ d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
1844+ transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
1845+ </g>
1846+ </g>
1847+ </g>
1848+ </g>
1849+</svg>
1850
1851=== added directory 'telco/precise/clearwater-ellis/lib'
1852=== added file 'telco/precise/clearwater-ellis/lib/chef_solo_install'
1853--- telco/precise/clearwater-ellis/lib/chef_solo_install 1970-01-01 00:00:00 +0000
1854+++ telco/precise/clearwater-ellis/lib/chef_solo_install 2014-11-10 14:55:38 +0000
1855@@ -0,0 +1,34 @@
1856+#!/bin/bash
1857+
1858+# This covers installing chef-solo and the Clearwater chef recipes
1859+# Install needed libraries
1860+apt-get -y install git libxml2-dev libxslt1-dev wget curl
1861+
1862+# Install chef
1863+install_sh="http://opscode.com/chef/install.sh"
1864+version_string="-v 11.6.0"
1865+bash <(wget ${install_sh} -O -) ${version_string}
1866+
1867+# Pull down the Clearwater chef recipes
1868+if [ ! -d /home/ubuntu/chef-solo ]
1869+then
1870+ mkdir /home/ubuntu/chef-solo
1871+ git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
1872+fi
1873+
1874+# Update the chef recipes
1875+cd /home/ubuntu/chef-solo
1876+git pull origin --recurse-submodules master
1877+
1878+# Create the solo.rb file
1879+cat > /home/ubuntu/chef-solo/solo.rb <<EOP
1880+file_cache_path "/var/chef-solo"
1881+cookbook_path [
1882+ "/home/ubuntu/chef-solo/cookbooks"
1883+]
1884+data_bag_path "/home/ubuntu/chef-solo/data_bags"
1885+environment_path "/home/ubuntu/chef-solo/environments"
1886+role_path "/home/ubuntu/chef-solo/roles"
1887+verbose_logging true
1888+log_level :debug
1889+EOP
1890
1891=== added file 'telco/precise/clearwater-ellis/lib/config_script'
1892--- telco/precise/clearwater-ellis/lib/config_script 1970-01-01 00:00:00 +0000
1893+++ telco/precise/clearwater-ellis/lib/config_script 2014-11-10 14:55:38 +0000
1894@@ -0,0 +1,63 @@
1895+#!/bin/bash
1896+
1897+relation_name=$1
1898+
1899+set -e
1900+
1901+# Defaults
1902+sprout_hostname=sprout.$(config-get zone)
1903+hs_hostname=homestead.$(config-get zone):8888
1904+hs_provisioning_hostname=homestead.$(config-get zone):8889
1905+xdms_hostname=homer.$(config-get zone):7888
1906+ralf_hostname=
1907+sas_server=0.0.0.0
1908+enum_server=
1909+ellis_cookie_key=secret
1910+ellis_api_key=$(hexdump -v -n 15 -e '1/1 "%02x"' /dev/random)
1911+
1912+# Import existing configuration
1913+[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
1914+
1915+# Apply new configuration
1916+home_domain=$(config-get zone)
1917+[ "$relation-name" != "homestead-hss" ] || [ "$(relation-get public-address)" = "" ] || sprout_hostname=$(relation-get public-address)
1918+[ "$relation-name" != "xdms" ] || [ "$(relation-get public-address)" = "" ] || xdms_hostname=$(relation-get public-address):9888
1919+sas_server=$(config-get sas)
1920+local_ip=$($CHARM_DIR/lib/unit-get private-address)
1921+public_ip=$($CHARM_DIR/lib/unit-get public-address)
1922+public_hostname=ellis-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
1923+smtp_smarthost=$(config-get smtp_server)
1924+smtp_username=$(config-get smtp_username)
1925+smtp_password=$(config-get smtp_password)
1926+email_recovery_sender=$(config-get email_sender)
1927+signup_key=$(config-get signup_key)
1928+
1929+# Write configuration back
1930+mkdir -p /etc/clearwater
1931+cat >/etc/clearwater/config <<EOF
1932+# Deployment definitions
1933+home_domain=$home_domain
1934+sprout_hostname=$sprout_hostname
1935+hs_hostname=$hs_hostname
1936+hs_provisioning_hostname=$hs_provisioning_hostname
1937+xdms_hostname=$xdms_hostname
1938+ralf_hostname=$ralf_hostname
1939+sas_server=$sas_server
1940+enum_server=$enum_server
1941+
1942+# Local IP configuration
1943+local_ip=$local_ip
1944+public_ip=$public_ip
1945+public_hostname=$public_hostname
1946+
1947+# Email server configuration
1948+smtp_smarthost=$smtp_smarthost
1949+smtp_username=$smtp_username
1950+smtp_password=$smtp_password
1951+email_recovery_sender=$email_recovery_sender
1952+
1953+# Keys
1954+signup_key=$signup_key
1955+ellis_cookie_key=$ellis_cookie_key
1956+ellis_api_key=$ellis_api_key
1957+EOF
1958
1959=== added file 'telco/precise/clearwater-ellis/lib/node_json_script'
1960--- telco/precise/clearwater-ellis/lib/node_json_script 1970-01-01 00:00:00 +0000
1961+++ telco/precise/clearwater-ellis/lib/node_json_script 2014-11-10 14:55:38 +0000
1962@@ -0,0 +1,57 @@
1963+#!/usr/bin/python
1964+
1965+import subprocess
1966+import string
1967+import socket
1968+import os
1969+import argparse
1970+
1971+# Create the ~/chef-solo/node.json file.
1972+#
1973+# The node.json file contains the machines IP address, the machine ID (a number)
1974+# and the repo server.
1975+#
1976+# If the node is being clustered, the role 'clustered' is added, and after
1977+# clustering the tag 'clustered' is added (for homer/homestead)
1978+#
1979+# The node.json file is templated in lib/node_json_template.
1980+
1981+parser = argparse.ArgumentParser()
1982+
1983+parser.add_argument('--cluster', action='store_true')
1984+parser.add_argument('--tag', action='store_true')
1985+
1986+args = parser.parse_args()
1987+
1988+# Populate the dictionary
1989+d = {}
1990+
1991+d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
1992+d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
1993+d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
1994+
1995+node_file = "/home/ubuntu/chef-solo/node.json"
1996+if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
1997+ d['CLUSTER'] = ",\n \"role[clustered]\""
1998+ d['CLUSTERED'] = ", \"clustered\""
1999+ d['TAG'] = ""
2000+
2001+ if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
2002+ d['TAG'] = ",\n \"tags\": [\"clustered\"]"
2003+
2004+else:
2005+ d['CLUSTER'] = ""
2006+ d['CLUSTERED'] = ""
2007+ d['TAG'] = ""
2008+
2009+# Open template file
2010+charm_dir = os.environ['CHARM_DIR']
2011+with open( '%s/lib/node_json_template' % charm_dir ) as f:
2012+ src = string.Template( f.read() )
2013+
2014+# Make the substitutions
2015+result = src.substitute(d)
2016+
2017+# Write to ~/chef-solo/node.json
2018+with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
2019+ f.write(result)
2020
2021=== added file 'telco/precise/clearwater-ellis/lib/node_json_template'
2022--- telco/precise/clearwater-ellis/lib/node_json_template 1970-01-01 00:00:00 +0000
2023+++ telco/precise/clearwater-ellis/lib/node_json_template 2014-11-10 14:55:38 +0000
2024@@ -0,0 +1,22 @@
2025+{
2026+ "id": "$LOCAL_IP",
2027+ "name": "$LOCAL_IP",
2028+ "chef_environment": "_default",
2029+ "role": "ellis",
2030+ "roles": ["clearwater-infrastructure", "ellis"$CLUSTERED],
2031+ "cloud": {
2032+ "local_ipv4": "$LOCAL_IP"
2033+ },
2034+ "clearwater": {
2035+ "index": $MACHINE_ID,
2036+ "repo_server": "$REPO",
2037+ "number_start": 0,
2038+ "number_count": 0,
2039+ "pstn_number_start": 0,
2040+ "pstn_number_count": 0,
2041+ "repo_server": "$REPO"
2042+ },
2043+ "run_list": [
2044+ "role[ellis]"$CLUSTER
2045+ ]$TAG
2046+}
2047
2048=== added file 'telco/precise/clearwater-ellis/lib/restart'
2049--- telco/precise/clearwater-ellis/lib/restart 1970-01-01 00:00:00 +0000
2050+++ telco/precise/clearwater-ellis/lib/restart 2014-11-10 14:55:38 +0000
2051@@ -0,0 +1,6 @@
2052+#!/bin/bash
2053+set -e
2054+
2055+# Restart clearwater-infrastructure, and stop ellis (to be restarted by monit)
2056+service clearwater-infrastructure restart
2057+service ellis stop
2058
2059=== added file 'telco/precise/clearwater-ellis/lib/unit-get'
2060--- telco/precise/clearwater-ellis/lib/unit-get 1970-01-01 00:00:00 +0000
2061+++ telco/precise/clearwater-ellis/lib/unit-get 2014-11-10 14:55:38 +0000
2062@@ -0,0 +1,36 @@
2063+#!/bin/bash
2064+set -ex
2065+onEC2=false
2066+key=$1
2067+val=$(unit-get $1)
2068+
2069+if [ -f $CHARM_DIR/lib/provider.txt ]
2070+then
2071+ PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
2072+else
2073+ #checking dirty ec2 hack will work
2074+ wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
2075+ if ( "$onEC2" == true )
2076+ then
2077+ echo "EC2" > $CHARM_DIR/lib/provider.txt
2078+ else
2079+ echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
2080+ fi
2081+fi
2082+
2083+if [ "$PROVIDER" == "EC2" ]
2084+then
2085+ if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
2086+ then
2087+ val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
2088+ elif [ "$key" = "private-address" ]
2089+ then
2090+ val_ip=$(dig +short $val | head -1)
2091+ [ -z "$val_ip" ] || val=$val_ip
2092+ ##if val_ip is empty getting the system IP
2093+ [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
2094+ fi
2095+fi
2096+
2097+echo $val
2098+
2099
2100=== added file 'telco/precise/clearwater-ellis/metadata.yaml'
2101--- telco/precise/clearwater-ellis/metadata.yaml 1970-01-01 00:00:00 +0000
2102+++ telco/precise/clearwater-ellis/metadata.yaml 2014-11-10 14:55:38 +0000
2103@@ -0,0 +1,17 @@
2104+name: clearwater-ellis
2105+summary: Ellis charm for Project Clearwater
2106+maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
2107+description: Ellis charm for Project Clearwater
2108+categories:
2109+ - misc
2110+subordinate: false
2111+requires:
2112+ programmable-multiple:
2113+ interface: dns-multi
2114+ homestead-prov:
2115+ interface: homestead-prov-interface
2116+ xdms:
2117+ interface: 3GPP-Ut
2118+provides:
2119+ as-catalog:
2120+ interface: as-register
2121
2122=== added file 'telco/precise/clearwater-ellis/revision'
2123--- telco/precise/clearwater-ellis/revision 1970-01-01 00:00:00 +0000
2124+++ telco/precise/clearwater-ellis/revision 2014-11-10 14:55:38 +0000
2125@@ -0,0 +1,1 @@
2126+1
2127
2128=== added directory 'telco/precise/clearwater-homer'
2129=== added file 'telco/precise/clearwater-homer/README.md'
2130--- telco/precise/clearwater-homer/README.md 1970-01-01 00:00:00 +0000
2131+++ telco/precise/clearwater-homer/README.md 2014-11-10 14:55:38 +0000
2132@@ -0,0 +1,90 @@
2133+# Overview
2134+
2135+This charm supports deployment and scaling of the Homer component of a Project Clearwater system. See http://www.projectclearwater.org for more information on Project Clearwater.
2136+
2137+# Usage
2138+
2139+The Homer service should be deployed as part of a Clearwater system. A Clearwater system can be deployed in a Juju environment by creating a config.yaml file then running the following commands.
2140+
2141+ juju deploy --config config.yaml clearwater-route53
2142+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
2143+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
2144+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
2145+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
2146+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
2147+ juju add-relation clearwater-ellis clearwater-route53:register-ellis
2148+ juju add-relation clearwater-bono clearwater-route53:register-bono
2149+ juju add-relation clearwater-sprout clearwater-route53:register-sprout
2150+ juju add-relation clearwater-homestead clearwater-route53:register-homestead
2151+ juju add-relation clearwater-homer clearwater-route53:register-homer
2152+ juju expose clearwater-bono
2153+ juju expose clearwater-ellis
2154+
2155+The config.yaml configuration file takes the following format.
2156+
2157+ clearwater-route53:
2158+ zone: <domain>
2159+ access_key: <ec2 access key>
2160+ secret_key: <ec2 secret access key>
2161+ sas: "0.0.0.0"
2162+
2163+ clearwater-ellis:
2164+ smtp_server: smtp.cw-ngv.com
2165+ smtp_username: username
2166+ smtp_password: password
2167+ email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
2168+ signup_key: secret
2169+ base_number: "6505550000"
2170+ number_count: 1000
2171+ repo: http://repo.cw-ngv.com/stable
2172+
2173+ clearwater-bono:
2174+ turn_workaround: password
2175+ repo: http://repo.cw-ngv.com/stable
2176+
2177+ clearwater-sprout:
2178+ reg_min_expires: 400
2179+ session_max_expires: 900
2180+ repo: http://repo.cw-ngv.com/stable
2181+
2182+ clearwater-homestead:
2183+ repo: http://repo.cw-ngv.com/stable
2184+
2185+ clearwater-homer:
2186+ repo: http://repo.cw-ngv.com/stable
2187+
2188+Note that the clearwater-homer charm can only be deployed on the `amd64` architecture.
2189+
2190+## Scale out Usage
2191+
2192+## Known Limitations and Issues
2193+
2194+The only currently supported DNS service for Clearwater is clearwater-route53 (when deploying in Amazon EC2), so will currently only work on EC2. Additional DNS services will be added for other environments in future.
2195+
2196+clearwater-homer currently only supports running as a single unit. Clustering support will be released shortly, which will allow units to be added to and removed from a clearwater-homer deployment using juju add-unit and juju remove-unit commands.
2197+
2198+Note that this charm does not current pass charm proof because its hooks use EC2 APIs directly to obtain the public IP address rather than unit-get public-address. This is to work around what looks like a Juju bug - unit-get public-address on EC2 returns the public hostname of the unit rather than the public IP address. Unfortunately EC2 public hostname are actually split horizon hostnames, so if you attempt to resolve the hostname from within EC2 it actually resolved to a private IP address - it will only resolve to a public address if resolved from outside EC2.
2199+
2200+# Configuration
2201+
2202+Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
2203+
2204+clearwater-route53
2205+
2206+- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
2207+- `access_key:` and `secret_key:` These must be set to the AWS access key and secret key of the AWS account which owns the DNS zone name.
2208+
2209+clearwater-ellis
2210+
2211+- `signup_key:` This is used as a signup key on the Ellis self-provisioning portal, so should be set to a unique string for each installation.
2212+- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
2213+
2214+# Contact Information
2215+
2216+## Upstream Project Name
2217+
2218+See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
2219+
2220+Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
2221+
2222+The Clearwater mailing list is at lists.projectclearwater.org.
2223
2224=== added file 'telco/precise/clearwater-homer/config.yaml'
2225--- telco/precise/clearwater-homer/config.yaml 1970-01-01 00:00:00 +0000
2226+++ telco/precise/clearwater-homer/config.yaml 2014-11-10 14:55:38 +0000
2227@@ -0,0 +1,8 @@
2228+options:
2229+ zone:
2230+ description: The DNS root zone for this service
2231+ type: string
2232+ repo:
2233+ default: http://repo.cw-ngv.com/stable
2234+ description: The location of the repo server
2235+ type: string
2236
2237=== added file 'telco/precise/clearwater-homer/copyright'
2238--- telco/precise/clearwater-homer/copyright 1970-01-01 00:00:00 +0000
2239+++ telco/precise/clearwater-homer/copyright 2014-11-10 14:55:38 +0000
2240@@ -0,0 +1,31 @@
2241+Project Clearwater - IMS in the Cloud
2242+Copyright (C) 2013 Metaswitch Networks Ltd
2243+
2244+This program is free software: you can redistribute it and/or modify it
2245+under the terms of the GNU General Public License as published by the
2246+Free Software Foundation, either version 3 of the License, or (at your
2247+option) any later version, along with the "Special Exception" for use of
2248+the program along with SSL, set forth below. This program is distributed
2249+in the hope that it will be useful, but WITHOUT ANY WARRANTY;
2250+without even the implied warranty of MERCHANTABILITY or FITNESS FOR
2251+A PARTICULAR PURPOSE. See the GNU General Public License for more
2252+details. You should have received a copy of the GNU General Public
2253+License along with this program. If not, see
2254+<http://www.gnu.org/licenses/>.
2255+
2256+The author can be reached by email at clearwater@metaswitch.com or by
2257+post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
2258+
2259+Special Exception
2260+Metaswitch Networks Ltd grants you permission to copy, modify,
2261+propagate, and distribute a work formed by combining OpenSSL with The
2262+Software, or a work derivative of such a combination, even if such
2263+copying, modification, propagation, or distribution would otherwise
2264+violate the terms of the GPL. You must comply with the GPL in all
2265+respects for all of the code used other than OpenSSL.
2266+"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
2267+Project and licensed under the OpenSSL Licenses, or a work based on such
2268+software and licensed under the OpenSSL Licenses.
2269+"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
2270+under which the OpenSSL Project distributes the OpenSSL toolkit software,
2271+as those licenses appear in the file LICENSE-OPENSSL.
2272
2273=== added directory 'telco/precise/clearwater-homer/hooks'
2274=== added file 'telco/precise/clearwater-homer/hooks/config-changed'
2275--- telco/precise/clearwater-homer/hooks/config-changed 1970-01-01 00:00:00 +0000
2276+++ telco/precise/clearwater-homer/hooks/config-changed 2014-11-10 14:55:38 +0000
2277@@ -0,0 +1,9 @@
2278+#!/bin/bash
2279+set -e
2280+
2281+# Update the /etc/clearwater/config file, the node.json, and re-run
2282+# chef-solo
2283+$CHARM_DIR/lib/config_script
2284+$CHARM_DIR/lib/node_json_script
2285+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
2286+$CHARM_DIR/lib/restart
2287
2288=== added file 'telco/precise/clearwater-homer/hooks/homer-relation-changed'
2289--- telco/precise/clearwater-homer/hooks/homer-relation-changed 1970-01-01 00:00:00 +0000
2290+++ telco/precise/clearwater-homer/hooks/homer-relation-changed 2014-11-10 14:55:38 +0000
2291@@ -0,0 +1,22 @@
2292+#!/bin/bash
2293+set -e
2294+
2295+# Get the IP address of this unit and the remote unit
2296+peer_ip=$(relation-get private-address)
2297+this_ip=$(unit-get private-address)
2298+
2299+# Get the machine number of this unit and the remote unit. This
2300+# takes the form '<charm name>/<index>
2301+peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
2302+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
2303+
2304+# Re-create the node.json files in the data bags
2305+$CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
2306+$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
2307+
2308+# Re-create the node.json file and re-run chef sole
2309+$CHARM_DIR/lib/node_json_script --cluster
2310+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
2311+
2312+# Re-create the node.json with the tag.
2313+$CHARM_DIR/lib/node_json_script --cluster --tag
2314
2315=== added file 'telco/precise/clearwater-homer/hooks/homer-relation-departed'
2316--- telco/precise/clearwater-homer/hooks/homer-relation-departed 1970-01-01 00:00:00 +0000
2317+++ telco/precise/clearwater-homer/hooks/homer-relation-departed 2014-11-10 14:55:38 +0000
2318@@ -0,0 +1,25 @@
2319+#!/bin/bash
2320+set -e
2321+
2322+# Get the machine number of this unit and the remote unit. This
2323+# takes the form '<charm name>/<index>
2324+peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
2325+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
2326+
2327+if [ $this_index -gt $peer_index ]
2328+ then
2329+ # Remove this node. This relation can be called more than once, so check
2330+ # whether the node has already been decommissioned.
2331+ decommissioned=$(nodetool netstats | grep DECOMMISSIONED > /dev/null; echo $?)
2332+ if [[ $decommissioned == 1* ]]
2333+ then
2334+ monit stop homer
2335+ monit unmonitor cassandra
2336+ nodetool decommission
2337+ fi
2338+ else
2339+ # Remove the node.json in databags that corresponds to the node being removed.
2340+ file_name="/home/ubuntu/chef-solo/data_bags/node/"$peer_index".json"
2341+ rm $file_name
2342+ chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
2343+fi
2344
2345=== added file 'telco/precise/clearwater-homer/hooks/homer-relation-joined'
2346--- telco/precise/clearwater-homer/hooks/homer-relation-joined 1970-01-01 00:00:00 +0000
2347+++ telco/precise/clearwater-homer/hooks/homer-relation-joined 2014-11-10 14:55:38 +0000
2348@@ -0,0 +1,33 @@
2349+#!/bin/bash
2350+set -e
2351+
2352+# Get the IP address of this unit and the remote unit
2353+peer_ip=$(relation-get private-address)
2354+this_ip=$(unit-get private-address)
2355+
2356+# Get the machine number of this unit and the remote unit. This
2357+# takes the form '<charm name>/<index>
2358+peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
2359+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
2360+
2361+# Re-create the node.json files in the data bags. Mark the new
2362+# node as joining - the new node is the one with the higher index
2363+if [ $this_index -gt $peer_index ]
2364+ then
2365+ $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
2366+ $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster --joining
2367+ else
2368+ $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster --joining
2369+ $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
2370+fi
2371+
2372+# Re-create the node.json file and re-run chef solo
2373+$CHARM_DIR/lib/node_json_script --cluster
2374+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
2375+
2376+# Re-create the node.json with the tag. Only do this for the existing node, not the
2377+# joining node
2378+if [ $this_index -lt $peer_index ]
2379+ then
2380+ $CHARM_DIR/lib/node_json_script --cluster --tag
2381+fi
2382
2383=== added file 'telco/precise/clearwater-homer/hooks/install'
2384--- telco/precise/clearwater-homer/hooks/install 1970-01-01 00:00:00 +0000
2385+++ telco/precise/clearwater-homer/hooks/install 2014-11-10 14:55:38 +0000
2386@@ -0,0 +1,40 @@
2387+#!/bin/bash
2388+set -e
2389+
2390+# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
2391+# for public-address and private-address. To work-around this, we resolve the
2392+# host names. However, after we've joined to the DNSaaS charm, we can no longer
2393+# resolve these, so add them to /etc/hosts.
2394+if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
2395+ private_address=$(unit-get private-address)
2396+ public_address=$(unit-get public-address)
2397+ private_ip=$($CHARM_DIR/lib/unit-get private-address)
2398+ public_ip=$($CHARM_DIR/lib/unit-get public-address)
2399+ [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
2400+ [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
2401+ echo "$private_ip homer-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
2402+fi
2403+
2404+# Install chef solo
2405+$CHARM_DIR/lib/chef_solo_install
2406+
2407+# Get the ip address and machine number of this unit. The index
2408+# takes the form '<charm name>/<index>
2409+this_ip=$(unit-get private-address)
2410+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
2411+
2412+$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index"
2413+$CHARM_DIR/lib/node_json_script
2414+
2415+# Update the config file
2416+$CHARM_DIR/lib/config_script
2417+
2418+apt-get update
2419+
2420+# Install the node
2421+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
2422+
2423+# Expose the correct ports
2424+open-port 22/tcp
2425+open-port 123/udp
2426+open-port 161/udp
2427
2428=== added file 'telco/precise/clearwater-homer/hooks/programmable-multiple-relation-changed'
2429--- telco/precise/clearwater-homer/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
2430+++ telco/precise/clearwater-homer/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
2431@@ -0,0 +1,24 @@
2432+#!/bin/bash
2433+set -e
2434+
2435+# Set our DNS requirements
2436+TTL=300
2437+id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
2438+ip=$($CHARM_DIR/lib/unit-get private-address)
2439+relation-set domain=$(config-get zone)
2440+relation-set resources='homer '$TTL' IN A '$ip'
2441+homer-'$id' '$TTL' IN A '$ip
2442+
2443+# Update our DNS server
2444+if [ "$(relation-get public-address)" != "" ]
2445+then
2446+ echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
2447+ grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
2448+ mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
2449+ echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
2450+ service dnsmasq restart
2451+fi
2452+
2453+# Update Clearwater configuration and restart
2454+$CHARM_DIR/lib/config_script programmable-multiple
2455+$CHARM_DIR/lib/restart
2456
2457=== added file 'telco/precise/clearwater-homer/hooks/start'
2458--- telco/precise/clearwater-homer/hooks/start 1970-01-01 00:00:00 +0000
2459+++ telco/precise/clearwater-homer/hooks/start 2014-11-10 14:55:38 +0000
2460@@ -0,0 +1,16 @@
2461+#!/bin/bash
2462+# Here put anything that is needed to start the service.
2463+# Note that currently this is run directly after install
2464+# i.e. 'service apache2 start'
2465+set -e
2466+
2467+# This hook needs to be idempotent, so this could be run when homer is
2468+# already running, when it's running but not monitored by monit, when
2469+# it's stopped but being monitored (so it's about to start), or stopped
2470+# and unmonitored. To cover all these cases, stop monit, start homer, start
2471+# monit, then finally have monit monitor homer
2472+service monit stop
2473+service homer start
2474+service monit start
2475+sleep 1
2476+monit monitor homer
2477
2478=== added file 'telco/precise/clearwater-homer/hooks/stop'
2479--- telco/precise/clearwater-homer/hooks/stop 1970-01-01 00:00:00 +0000
2480+++ telco/precise/clearwater-homer/hooks/stop 2014-11-10 14:55:38 +0000
2481@@ -0,0 +1,12 @@
2482+#!/bin/bash
2483+# This will be run when the service is being torn down, allowing you to disable
2484+# it in various ways..
2485+# For example, if your web app uses a text file to signal to the load balancer
2486+# that it is live... you could remove it and sleep for a bit to allow the load
2487+# balancer to stop sending traffic.
2488+# rm /srv/webroot/server-live.txt && sleep 30
2489+set -e
2490+
2491+# Stop homer via monit
2492+sudo service monit start
2493+sudo monit stop homer
2494
2495=== added file 'telco/precise/clearwater-homer/hooks/upgrade-charm'
2496--- telco/precise/clearwater-homer/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
2497+++ telco/precise/clearwater-homer/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
2498@@ -0,0 +1,9 @@
2499+#!/bin/bash
2500+# This hook is executed each time a charm is upgraded after the new charm
2501+# contents have been unpacked
2502+# Best practice suggests you execute the hooks/install and
2503+# hooks/config-changed to ensure all updates are processed
2504+set -e
2505+
2506+$CHARM_DIR/hooks/install
2507+$CHARM_DIR/hooks/config-changed
2508
2509=== added file 'telco/precise/clearwater-homer/hooks/xdms-user-relation-joined'
2510--- telco/precise/clearwater-homer/hooks/xdms-user-relation-joined 1970-01-01 00:00:00 +0000
2511+++ telco/precise/clearwater-homer/hooks/xdms-user-relation-joined 2014-11-10 14:55:38 +0000
2512@@ -0,0 +1,4 @@
2513+#!/bin/bash
2514+set -e
2515+
2516+relation-set public-address=homer.$(config-get zone)
2517
2518=== added file 'telco/precise/clearwater-homer/icon.svg'
2519--- telco/precise/clearwater-homer/icon.svg 1970-01-01 00:00:00 +0000
2520+++ telco/precise/clearwater-homer/icon.svg 2014-11-10 14:55:38 +0000
2521@@ -0,0 +1,407 @@
2522+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2523+<!-- Created with Inkscape (http://www.inkscape.org/) -->
2524+
2525+<svg
2526+ xmlns:dc="http://purl.org/dc/elements/1.1/"
2527+ xmlns:cc="http://creativecommons.org/ns#"
2528+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
2529+ xmlns:svg="http://www.w3.org/2000/svg"
2530+ xmlns="http://www.w3.org/2000/svg"
2531+ xmlns:xlink="http://www.w3.org/1999/xlink"
2532+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
2533+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
2534+ width="96"
2535+ height="96"
2536+ id="svg6517"
2537+ version="1.1"
2538+ inkscape:version="0.48.2 r9819"
2539+ sodipodi:docname="icon.svg">
2540+ <defs
2541+ id="defs6519">
2542+ <linearGradient
2543+ id="Background">
2544+ <stop
2545+ id="stop4178"
2546+ offset="0"
2547+ style="stop-color:#b8b8b8;stop-opacity:1" />
2548+ <stop
2549+ id="stop4180"
2550+ offset="1"
2551+ style="stop-color:#c9c9c9;stop-opacity:1" />
2552+ </linearGradient>
2553+ <filter
2554+ style="color-interpolation-filters:sRGB;"
2555+ inkscape:label="Inner Shadow"
2556+ id="filter1121">
2557+ <feFlood
2558+ flood-opacity="0.59999999999999998"
2559+ flood-color="rgb(0,0,0)"
2560+ result="flood"
2561+ id="feFlood1123" />
2562+ <feComposite
2563+ in="flood"
2564+ in2="SourceGraphic"
2565+ operator="out"
2566+ result="composite1"
2567+ id="feComposite1125" />
2568+ <feGaussianBlur
2569+ in="composite1"
2570+ stdDeviation="1"
2571+ result="blur"
2572+ id="feGaussianBlur1127" />
2573+ <feOffset
2574+ dx="0"
2575+ dy="2"
2576+ result="offset"
2577+ id="feOffset1129" />
2578+ <feComposite
2579+ in="offset"
2580+ in2="SourceGraphic"
2581+ operator="atop"
2582+ result="composite2"
2583+ id="feComposite1131" />
2584+ </filter>
2585+ <filter
2586+ style="color-interpolation-filters:sRGB;"
2587+ inkscape:label="Drop Shadow"
2588+ id="filter950">
2589+ <feFlood
2590+ flood-opacity="0.25"
2591+ flood-color="rgb(0,0,0)"
2592+ result="flood"
2593+ id="feFlood952" />
2594+ <feComposite
2595+ in="flood"
2596+ in2="SourceGraphic"
2597+ operator="in"
2598+ result="composite1"
2599+ id="feComposite954" />
2600+ <feGaussianBlur
2601+ in="composite1"
2602+ stdDeviation="1"
2603+ result="blur"
2604+ id="feGaussianBlur956" />
2605+ <feOffset
2606+ dx="0"
2607+ dy="1"
2608+ result="offset"
2609+ id="feOffset958" />
2610+ <feComposite
2611+ in="SourceGraphic"
2612+ in2="offset"
2613+ operator="over"
2614+ result="composite2"
2615+ id="feComposite960" />
2616+ </filter>
2617+ <clipPath
2618+ clipPathUnits="userSpaceOnUse"
2619+ id="clipPath873">
2620+ <g
2621+ transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
2622+ id="g875"
2623+ inkscape:label="Layer 1"
2624+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
2625+ <path
2626+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
2627+ d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
2628+ id="path877"
2629+ inkscape:connector-curvature="0"
2630+ sodipodi:nodetypes="sssssssss" />
2631+ </g>
2632+ </clipPath>
2633+ <filter
2634+ inkscape:collect="always"
2635+ id="filter891"
2636+ inkscape:label="Badge Shadow">
2637+ <feGaussianBlur
2638+ inkscape:collect="always"
2639+ stdDeviation="0.71999962"
2640+ id="feGaussianBlur893" />
2641+ </filter>
2642+ </defs>
2643+ <sodipodi:namedview
2644+ id="base"
2645+ pagecolor="#ffffff"
2646+ bordercolor="#666666"
2647+ borderopacity="1.0"
2648+ inkscape:pageopacity="0.0"
2649+ inkscape:pageshadow="2"
2650+ inkscape:zoom="1.3995495"
2651+ inkscape:cx="18.514671"
2652+ inkscape:cy="49.018169"
2653+ inkscape:document-units="px"
2654+ inkscape:current-layer="layer1"
2655+ showgrid="true"
2656+ fit-margin-top="0"
2657+ fit-margin-left="0"
2658+ fit-margin-right="0"
2659+ fit-margin-bottom="0"
2660+ inkscape:window-width="1331"
2661+ inkscape:window-height="674"
2662+ inkscape:window-x="19"
2663+ inkscape:window-y="1"
2664+ inkscape:window-maximized="0"
2665+ showborder="true"
2666+ showguides="true"
2667+ inkscape:guide-bbox="true"
2668+ inkscape:showpageshadow="false">
2669+ <inkscape:grid
2670+ type="xygrid"
2671+ id="grid821" />
2672+ <sodipodi:guide
2673+ orientation="1,0"
2674+ position="16,48"
2675+ id="guide823" />
2676+ <sodipodi:guide
2677+ orientation="0,1"
2678+ position="64,80"
2679+ id="guide825" />
2680+ <sodipodi:guide
2681+ orientation="1,0"
2682+ position="80,40"
2683+ id="guide827" />
2684+ <sodipodi:guide
2685+ orientation="0,1"
2686+ position="64,16"
2687+ id="guide829" />
2688+ </sodipodi:namedview>
2689+ <metadata
2690+ id="metadata6522">
2691+ <rdf:RDF>
2692+ <cc:Work
2693+ rdf:about="">
2694+ <dc:format>image/svg+xml</dc:format>
2695+ <dc:type
2696+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
2697+ <dc:title></dc:title>
2698+ </cc:Work>
2699+ </rdf:RDF>
2700+ </metadata>
2701+ <g
2702+ inkscape:label="BACKGROUND"
2703+ inkscape:groupmode="layer"
2704+ id="layer1"
2705+ transform="translate(268,-635.29076)"
2706+ style="display:inline">
2707+ <path
2708+ style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
2709+ d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
2710+ id="path6455"
2711+ inkscape:connector-curvature="0"
2712+ sodipodi:nodetypes="sssssssss" />
2713+ <image
2714+ y="633.29077"
2715+ x="-270"
2716+ id="image3169"
2717+ xlink:href="data:image/png;base64,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
2846+AABJRU5ErkJggg==
2847+"
2848+ height="96"
2849+ width="96"
2850+ style="stroke:#000000;stroke-opacity:0.18666669" />
2851+ </g>
2852+ <g
2853+ inkscape:groupmode="layer"
2854+ id="layer3"
2855+ inkscape:label="PLACE YOUR PICTOGRAM HERE"
2856+ style="display:inline" />
2857+ <g
2858+ inkscape:groupmode="layer"
2859+ id="layer2"
2860+ inkscape:label="BADGE"
2861+ style="display:none"
2862+ sodipodi:insensitive="true">
2863+ <g
2864+ style="display:inline"
2865+ transform="translate(-340.00001,-581)"
2866+ id="g4394"
2867+ clip-path="none">
2868+ <g
2869+ id="g855">
2870+ <g
2871+ inkscape:groupmode="maskhelper"
2872+ id="g870"
2873+ clip-path="url(#clipPath873)"
2874+ style="opacity:0.6;filter:url(#filter891)">
2875+ <path
2876+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
2877+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
2878+ sodipodi:ry="12"
2879+ sodipodi:rx="12"
2880+ sodipodi:cy="552.36218"
2881+ sodipodi:cx="252"
2882+ id="path844"
2883+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
2884+ sodipodi:type="arc" />
2885+ </g>
2886+ <g
2887+ id="g862">
2888+ <path
2889+ sodipodi:type="arc"
2890+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
2891+ id="path4398"
2892+ sodipodi:cx="252"
2893+ sodipodi:cy="552.36218"
2894+ sodipodi:rx="12"
2895+ sodipodi:ry="12"
2896+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
2897+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
2898+ <path
2899+ transform="matrix(1.25,0,0,1.25,33,-100.45273)"
2900+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
2901+ sodipodi:ry="12"
2902+ sodipodi:rx="12"
2903+ sodipodi:cy="552.36218"
2904+ sodipodi:cx="252"
2905+ id="path4400"
2906+ style="color:#000000;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
2907+ sodipodi:type="arc" />
2908+ <path
2909+ sodipodi:type="star"
2910+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
2911+ id="path4459"
2912+ sodipodi:sides="5"
2913+ sodipodi:cx="666.19574"
2914+ sodipodi:cy="589.50385"
2915+ sodipodi:r1="7.2431178"
2916+ sodipodi:r2="4.3458705"
2917+ sodipodi:arg1="1.0471976"
2918+ sodipodi:arg2="1.6755161"
2919+ inkscape:flatsided="false"
2920+ inkscape:rounded="0.1"
2921+ inkscape:randomized="0"
2922+ d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
2923+ transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
2924+ </g>
2925+ </g>
2926+ </g>
2927+ </g>
2928+</svg>
2929
2930=== added directory 'telco/precise/clearwater-homer/lib'
2931=== added file 'telco/precise/clearwater-homer/lib/chef_solo_install'
2932--- telco/precise/clearwater-homer/lib/chef_solo_install 1970-01-01 00:00:00 +0000
2933+++ telco/precise/clearwater-homer/lib/chef_solo_install 2014-11-10 14:55:38 +0000
2934@@ -0,0 +1,34 @@
2935+#!/bin/bash
2936+
2937+# This covers installing chef-solo and the Clearwater chef recipes
2938+# Install needed libraries
2939+apt-get -y install git libxml2-dev libxslt1-dev wget curl
2940+
2941+# Install chef
2942+install_sh="http://opscode.com/chef/install.sh"
2943+version_string="-v 11.6.0"
2944+bash <(wget ${install_sh} -O -) ${version_string}
2945+
2946+# Pull down the Clearwater chef recipes
2947+if [ ! -d /home/ubuntu/chef-solo ]
2948+then
2949+ mkdir /home/ubuntu/chef-solo
2950+ git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
2951+fi
2952+
2953+# Update the chef recipes
2954+cd /home/ubuntu/chef-solo
2955+git pull origin --recurse-submodules master
2956+
2957+# Create the solo.rb file
2958+cat > /home/ubuntu/chef-solo/solo.rb <<EOP
2959+file_cache_path "/var/chef-solo"
2960+cookbook_path [
2961+ "/home/ubuntu/chef-solo/cookbooks"
2962+]
2963+data_bag_path "/home/ubuntu/chef-solo/data_bags"
2964+environment_path "/home/ubuntu/chef-solo/environments"
2965+role_path "/home/ubuntu/chef-solo/roles"
2966+verbose_logging true
2967+log_level :debug
2968+EOP
2969
2970=== added file 'telco/precise/clearwater-homer/lib/config_script'
2971--- telco/precise/clearwater-homer/lib/config_script 1970-01-01 00:00:00 +0000
2972+++ telco/precise/clearwater-homer/lib/config_script 2014-11-10 14:55:38 +0000
2973@@ -0,0 +1,43 @@
2974+#!/bin/bash
2975+
2976+relation_name=$1
2977+
2978+set -e
2979+
2980+# Defaults
2981+sprout_hostname=sprout.$(config-get zone)
2982+hs_hostname=homestead.$(config-get zone):8888
2983+hs_provisioning_hostname=homestead.$(config-get zone):8889
2984+xdms_hostname=homer.$(config-get zone):7888
2985+ralf_hostname=
2986+sas_server=0.0.0.0
2987+enum_server=
2988+
2989+# Import existing configuration
2990+[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
2991+
2992+# Apply new configuration
2993+home_domain=$(config-get zone)
2994+sas_server=$(config-get sas)
2995+local_ip=$($CHARM_DIR/lib/unit-get private-address)
2996+public_ip=$($CHARM_DIR/lib/unit-get public-address)
2997+public_hostname=homer-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
2998+
2999+# Write configuration back
3000+mkdir -p /etc/clearwater
3001+cat >/etc/clearwater/config <<EOF
3002+# Deployment definitions
3003+home_domain=$home_domain
3004+sprout_hostname=$sprout_hostname
3005+hs_hostname=$hs_hostname
3006+hs_provisioning_hostname=$hs_provisioning_hostname
3007+xdms_hostname=$xdms_hostname
3008+ralf_hostname=$ralf_hostname
3009+sas_server=$sas_server
3010+enum_server=$enum_server
3011+
3012+# Local IP configuration
3013+local_ip=$local_ip
3014+public_ip=$public_ip
3015+public_hostname=$public_hostname
3016+EOF
3017
3018=== added file 'telco/precise/clearwater-homer/lib/node_json_clustered_script'
3019--- telco/precise/clearwater-homer/lib/node_json_clustered_script 1970-01-01 00:00:00 +0000
3020+++ telco/precise/clearwater-homer/lib/node_json_clustered_script 2014-11-10 14:55:38 +0000
3021@@ -0,0 +1,58 @@
3022+#!/usr/bin/python
3023+import subprocess
3024+import string
3025+import socket
3026+import os
3027+import sys
3028+import argparse
3029+
3030+# Create the ~/chef-solo/data_bags/node/<index>.json files.
3031+#
3032+# The node.json file contains the machines IP address, the machine ID (a number)
3033+# and the repo server.
3034+#
3035+# If the node is being clustered, the role 'clustered' is added, and if the
3036+# node is joinging the attribute 'joining' is added
3037+#
3038+# The node.json file is templated in lib/node_json_clustered_template.
3039+
3040+parser = argparse.ArgumentParser()
3041+
3042+parser.add_argument('--cluster', action='store_true')
3043+parser.add_argument('--joining', action='store_true')
3044+parser.add_argument('--index', type=int, required=True)
3045+parser.add_argument('--ip', type=str, required=True)
3046+
3047+args = parser.parse_args()
3048+
3049+# Populate the dictionary
3050+d = {}
3051+
3052+d['LOCAL_IP'] = socket.gethostbyname(args.ip)
3053+d['MACHINE_ID'] = str(args.index + 1)
3054+d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
3055+
3056+if args.cluster:
3057+ d['CLUSTER'] = ",\n \"role[clustered]\""
3058+ d['CLUSTERED'] = ", \"clustered\""
3059+else:
3060+ d['CLUSTER'] = ""
3061+ d['CLUSTERED'] = ""
3062+
3063+if args.joining:
3064+ d['JOINING'] = ",\n \"joining\": true"
3065+else:
3066+ d['JOINING'] = ""
3067+
3068+# Open template file
3069+charm_dir = os.environ['CHARM_DIR']
3070+with open( '%s/lib/node_json_clustered_template' % charm_dir ) as f:
3071+ src = string.Template( f.read() )
3072+
3073+# Make the substitutions
3074+result = src.substitute(d)
3075+
3076+# Write to ~/chef-solo/data_bags/node/<index>.json
3077+node_file = str(args.index + 1) + ".json"
3078+with open('/home/ubuntu/chef-solo/data_bags/node/%s' % node_file, 'w') as f:
3079+ f.write(result)
3080
3081=== added file 'telco/precise/clearwater-homer/lib/node_json_clustered_template'
3082--- telco/precise/clearwater-homer/lib/node_json_clustered_template 1970-01-01 00:00:00 +0000
3083+++ telco/precise/clearwater-homer/lib/node_json_clustered_template 2014-11-10 14:55:38 +0000
3084@@ -0,0 +1,20 @@
3085+{
3086+ "id": "$LOCAL_IP",
3087+ "name": "$LOCAL_IP",
3088+ "chef_environment": "_default",
3089+ "json_class": "Chef::Node",
3090+ "automatic": {
3091+ "role": "homer",
3092+ "roles": ["clearwater-infrastructure", "homer"$CLUSTERED],
3093+ "cloud": {
3094+ "local_ipv4": "$LOCAL_IP"
3095+ },
3096+ "clearwater": {
3097+ "index": $MACHINE_ID$JOINING
3098+ }
3099+ },
3100+ "chef_type": "node",
3101+ "run_list": [
3102+ "role[homer]"$CLUSTER
3103+ ]
3104+}
3105
3106=== added file 'telco/precise/clearwater-homer/lib/node_json_script'
3107--- telco/precise/clearwater-homer/lib/node_json_script 1970-01-01 00:00:00 +0000
3108+++ telco/precise/clearwater-homer/lib/node_json_script 2014-11-10 14:55:38 +0000
3109@@ -0,0 +1,57 @@
3110+#!/usr/bin/python
3111+
3112+import subprocess
3113+import string
3114+import socket
3115+import os
3116+import argparse
3117+
3118+# Create the ~/chef-solo/node.json file.
3119+#
3120+# The node.json file contains the machines IP address, the machine ID (a number)
3121+# and the repo server.
3122+#
3123+# If the node is being clustered, the role 'clustered' is added, and after
3124+# clustering the tag 'clustered' is added (for homer/homestead)
3125+#
3126+# The node.json file is templated in lib/node_json_template.
3127+
3128+parser = argparse.ArgumentParser()
3129+
3130+parser.add_argument('--cluster', action='store_true')
3131+parser.add_argument('--tag', action='store_true')
3132+
3133+args = parser.parse_args()
3134+
3135+# Populate the dictionary
3136+d = {}
3137+
3138+d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
3139+d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
3140+d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
3141+
3142+node_file = "/home/ubuntu/chef-solo/node.json"
3143+if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
3144+ d['CLUSTER'] = ",\n \"role[clustered]\""
3145+ d['CLUSTERED'] = ", \"clustered\""
3146+ d['TAG'] = ""
3147+
3148+ if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
3149+ d['TAG'] = ",\n \"tags\": [\"clustered\"]"
3150+
3151+else:
3152+ d['CLUSTER'] = ""
3153+ d['CLUSTERED'] = ""
3154+ d['TAG'] = ""
3155+
3156+# Open template file
3157+charm_dir = os.environ['CHARM_DIR']
3158+with open( '%s/lib/node_json_template' % charm_dir ) as f:
3159+ src = string.Template( f.read() )
3160+
3161+# Make the substitutions
3162+result = src.substitute(d)
3163+
3164+# Write to ~/chef-solo/node.json
3165+with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
3166+ f.write(result)
3167
3168=== added file 'telco/precise/clearwater-homer/lib/node_json_template'
3169--- telco/precise/clearwater-homer/lib/node_json_template 1970-01-01 00:00:00 +0000
3170+++ telco/precise/clearwater-homer/lib/node_json_template 2014-11-10 14:55:38 +0000
3171@@ -0,0 +1,17 @@
3172+{
3173+ "id": "$LOCAL_IP",
3174+ "name": "$LOCAL_IP",
3175+ "chef_environment": "_default",
3176+ "role": "homer",
3177+ "roles": ["clearwater-infrastructure", "homer"$CLUSTERED],
3178+ "cloud": {
3179+ "local_ipv4": "$LOCAL_IP"
3180+ },
3181+ "clearwater": {
3182+ "index": $MACHINE_ID,
3183+ "repo_server": "$REPO"
3184+ },
3185+ "run_list": [
3186+ "role[homer]"$CLUSTER
3187+ ]$TAG
3188+}
3189
3190=== added file 'telco/precise/clearwater-homer/lib/restart'
3191--- telco/precise/clearwater-homer/lib/restart 1970-01-01 00:00:00 +0000
3192+++ telco/precise/clearwater-homer/lib/restart 2014-11-10 14:55:38 +0000
3193@@ -0,0 +1,6 @@
3194+#!/bin/bash
3195+set -e
3196+
3197+# Restart clearwater-infrastructure, and stop homer (to be restarted by monit)
3198+service clearwater-infrastructure restart
3199+service homer stop
3200
3201=== added file 'telco/precise/clearwater-homer/lib/unit-get'
3202--- telco/precise/clearwater-homer/lib/unit-get 1970-01-01 00:00:00 +0000
3203+++ telco/precise/clearwater-homer/lib/unit-get 2014-11-10 14:55:38 +0000
3204@@ -0,0 +1,36 @@
3205+#!/bin/bash
3206+set -ex
3207+onEC2=false
3208+key=$1
3209+val=$(unit-get $1)
3210+
3211+if [ -f $CHARM_DIR/lib/provider.txt ]
3212+then
3213+ PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
3214+else
3215+ #checking dirty ec2 hack will work
3216+ wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
3217+ if ( "$onEC2" == true )
3218+ then
3219+ echo "EC2" > $CHARM_DIR/lib/provider.txt
3220+ else
3221+ echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
3222+ fi
3223+fi
3224+
3225+if [ "$PROVIDER" == "EC2" ]
3226+then
3227+ if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
3228+ then
3229+ val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
3230+ elif [ "$key" = "private-address" ]
3231+ then
3232+ val_ip=$(dig +short $val | head -1)
3233+ [ -z "$val_ip" ] || val=$val_ip
3234+ ##if val_ip is empty getting the system IP
3235+ [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
3236+ fi
3237+fi
3238+
3239+echo $val
3240+
3241
3242=== added file 'telco/precise/clearwater-homer/metadata.yaml'
3243--- telco/precise/clearwater-homer/metadata.yaml 1970-01-01 00:00:00 +0000
3244+++ telco/precise/clearwater-homer/metadata.yaml 2014-11-10 14:55:38 +0000
3245@@ -0,0 +1,16 @@
3246+name: clearwater-homer
3247+summary: Homer charm for Project Clearwater
3248+maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
3249+description: Homer charm for Project Clearwater
3250+categories:
3251+ - misc
3252+subordinate: false
3253+requires:
3254+ programmable-multiple:
3255+ interface: dns-multi
3256+provides:
3257+ xdms-user:
3258+ interface: 3GPP-Ut
3259+peers:
3260+ homer:
3261+ interface: homer-interface
3262
3263=== added file 'telco/precise/clearwater-homer/revision'
3264--- telco/precise/clearwater-homer/revision 1970-01-01 00:00:00 +0000
3265+++ telco/precise/clearwater-homer/revision 2014-11-10 14:55:38 +0000
3266@@ -0,0 +1,1 @@
3267+1
3268
3269=== added directory 'telco/precise/clearwater-homestead'
3270=== added file 'telco/precise/clearwater-homestead/README.md'
3271--- telco/precise/clearwater-homestead/README.md 1970-01-01 00:00:00 +0000
3272+++ telco/precise/clearwater-homestead/README.md 2014-11-10 14:55:38 +0000
3273@@ -0,0 +1,90 @@
3274+# Overview
3275+
3276+This charm supports deployment and scaling of the Homestead component of a Project Clearwater system. See http://www.projectclearwater.org for more information on Project Clearwater.
3277+
3278+# Usage
3279+
3280+The Homestead service should be deployed as part of a Clearwater system. A Clearwater system can be deployed in a Juju environment by creating a config.yaml file then running the following commands.
3281+
3282+ juju deploy --config config.yaml clearwater-route53
3283+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
3284+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
3285+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
3286+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
3287+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
3288+ juju add-relation clearwater-ellis clearwater-route53:register-ellis
3289+ juju add-relation clearwater-bono clearwater-route53:register-bono
3290+ juju add-relation clearwater-sprout clearwater-route53:register-sprout
3291+ juju add-relation clearwater-homestead clearwater-route53:register-homestead
3292+ juju add-relation clearwater-homer clearwater-route53:register-homer
3293+ juju expose clearwater-bono
3294+ juju expose clearwater-ellis
3295+
3296+The config.yaml configuration file takes the following format.
3297+
3298+ clearwater-route53:
3299+ zone: <domain>
3300+ access_key: <ec2 access key>
3301+ secret_key: <ec2 secret access key>
3302+ sas: "0.0.0.0"
3303+
3304+ clearwater-ellis:
3305+ smtp_server: smtp.cw-ngv.com
3306+ smtp_username: username
3307+ smtp_password: password
3308+ email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
3309+ signup_key: secret
3310+ base_number: "6505550000"
3311+ number_count: 1000
3312+ repo: http://repo.cw-ngv.com/stable
3313+
3314+ clearwater-bono:
3315+ turn_workaround: password
3316+ repo: http://repo.cw-ngv.com/stable
3317+
3318+ clearwater-sprout:
3319+ reg_min_expires: 400
3320+ session_max_expires: 900
3321+ repo: http://repo.cw-ngv.com/stable
3322+
3323+ clearwater-homestead:
3324+ repo: http://repo.cw-ngv.com/stable
3325+
3326+ clearwater-homer:
3327+ repo: http://repo.cw-ngv.com/stable
3328+
3329+Note that the clearwater-homestead charm can only be deployed on the `amd64` architecture.
3330+
3331+## Scale out Usage
3332+
3333+## Known Limitations and Issues
3334+
3335+The only currently supported DNS service for Clearwater is clearwater-route53 (when deploying in Amazon EC2), so will currently only work on EC2. Additional DNS services will be added for other environments in future.
3336+
3337+clearwater-homestead currently only supports running as a single unit. Clustering support will be released shortly, which will allow units to be added to and removed from a clearwater-homestead deployment using juju add-unit and juju remove-unit commands.
3338+
3339+Note that this charm does not current pass charm proof because its hooks use EC2 APIs directly to obtain the public IP address rather than unit-get public-address. This is to work around what looks like a Juju bug - unit-get public-address on EC2 returns the public hostname of the unit rather than the public IP address. Unfortunately EC2 public hostname are actually split horizon hostnames, so if you attempt to resolve the hostname from within EC2 it actually resolved to a private IP address - it will only resolve to a public address if resolved from outside EC2.
3340+
3341+# Configuration
3342+
3343+Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
3344+
3345+clearwater-route53
3346+
3347+- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
3348+- `access_key:` and `secret_key:` These must be set to the AWS access key and secret key of the AWS account which owns the DNS zone name.
3349+
3350+clearwater-ellis
3351+
3352+- `signup_key:` This is used as a signup key on the Ellis self-provisioning portal, so should be set to a unique string for each installation.
3353+- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
3354+
3355+# Contact Information
3356+
3357+## Upstream Project Name
3358+
3359+See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
3360+
3361+Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
3362+
3363+The Clearwater mailing list is at lists.projectclearwater.org.
3364
3365=== added file 'telco/precise/clearwater-homestead/config.yaml'
3366--- telco/precise/clearwater-homestead/config.yaml 1970-01-01 00:00:00 +0000
3367+++ telco/precise/clearwater-homestead/config.yaml 2014-11-10 14:55:38 +0000
3368@@ -0,0 +1,12 @@
3369+options:
3370+ zone:
3371+ description: The DNS root zone for this service
3372+ type: string
3373+ sas:
3374+ default: ""
3375+ description: The location of the SAS server
3376+ type: string
3377+ repo:
3378+ default: http://repo.cw-ngv.com/stable
3379+ description: The location of the repo server
3380+ type: string
3381
3382=== added file 'telco/precise/clearwater-homestead/copyright'
3383--- telco/precise/clearwater-homestead/copyright 1970-01-01 00:00:00 +0000
3384+++ telco/precise/clearwater-homestead/copyright 2014-11-10 14:55:38 +0000
3385@@ -0,0 +1,31 @@
3386+Project Clearwater - IMS in the Cloud
3387+Copyright (C) 2013 Metaswitch Networks Ltd
3388+
3389+This program is free software: you can redistribute it and/or modify it
3390+under the terms of the GNU General Public License as published by the
3391+Free Software Foundation, either version 3 of the License, or (at your
3392+option) any later version, along with the "Special Exception" for use of
3393+the program along with SSL, set forth below. This program is distributed
3394+in the hope that it will be useful, but WITHOUT ANY WARRANTY;
3395+without even the implied warranty of MERCHANTABILITY or FITNESS FOR
3396+A PARTICULAR PURPOSE. See the GNU General Public License for more
3397+details. You should have received a copy of the GNU General Public
3398+License along with this program. If not, see
3399+<http://www.gnu.org/licenses/>.
3400+
3401+The author can be reached by email at clearwater@metaswitch.com or by
3402+post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
3403+
3404+Special Exception
3405+Metaswitch Networks Ltd grants you permission to copy, modify,
3406+propagate, and distribute a work formed by combining OpenSSL with The
3407+Software, or a work derivative of such a combination, even if such
3408+copying, modification, propagation, or distribution would otherwise
3409+violate the terms of the GPL. You must comply with the GPL in all
3410+respects for all of the code used other than OpenSSL.
3411+"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
3412+Project and licensed under the OpenSSL Licenses, or a work based on such
3413+software and licensed under the OpenSSL Licenses.
3414+"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
3415+under which the OpenSSL Project distributes the OpenSSL toolkit software,
3416+as those licenses appear in the file LICENSE-OPENSSL.
3417
3418=== added directory 'telco/precise/clearwater-homestead/hooks'
3419=== added file 'telco/precise/clearwater-homestead/hooks/config-changed'
3420--- telco/precise/clearwater-homestead/hooks/config-changed 1970-01-01 00:00:00 +0000
3421+++ telco/precise/clearwater-homestead/hooks/config-changed 2014-11-10 14:55:38 +0000
3422@@ -0,0 +1,9 @@
3423+#!/bin/bash
3424+set -e
3425+
3426+# Update the /etc/clearwater/config file, the node.json, and re-run
3427+# chef-solo
3428+$CHARM_DIR/lib/config_script
3429+$CHARM_DIR/lib/node_json_script
3430+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
3431+$CHARM_DIR/lib/restart
3432
3433=== added file 'telco/precise/clearwater-homestead/hooks/homestead-cscf-relation-joined'
3434--- telco/precise/clearwater-homestead/hooks/homestead-cscf-relation-joined 1970-01-01 00:00:00 +0000
3435+++ telco/precise/clearwater-homestead/hooks/homestead-cscf-relation-joined 2014-11-10 14:55:38 +0000
3436@@ -0,0 +1,4 @@
3437+#!/bin/bash
3438+set -e
3439+
3440+relation-set public-address=homestead.$(config-get zone)
3441
3442=== added file 'telco/precise/clearwater-homestead/hooks/homestead-prov-user-relation-joined'
3443--- telco/precise/clearwater-homestead/hooks/homestead-prov-user-relation-joined 1970-01-01 00:00:00 +0000
3444+++ telco/precise/clearwater-homestead/hooks/homestead-prov-user-relation-joined 2014-11-10 14:55:38 +0000
3445@@ -0,0 +1,4 @@
3446+#!/bin/bash
3447+set -e
3448+
3449+relation-set public-address=homestead.$(config-get zone)
3450
3451=== added file 'telco/precise/clearwater-homestead/hooks/homestead-relation-changed'
3452--- telco/precise/clearwater-homestead/hooks/homestead-relation-changed 1970-01-01 00:00:00 +0000
3453+++ telco/precise/clearwater-homestead/hooks/homestead-relation-changed 2014-11-10 14:55:38 +0000
3454@@ -0,0 +1,22 @@
3455+#!/bin/bash
3456+set -e
3457+
3458+# Get the IP address of this unit and the remote unit
3459+peer_ip=$(relation-get private-address)
3460+this_ip=$(unit-get private-address)
3461+
3462+# Get the machine number of this unit and the remote unit. This
3463+# takes the form '<charm name>/<index>
3464+peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
3465+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
3466+
3467+# Re-create the node.json files in the data bags
3468+$CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
3469+$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
3470+
3471+# Re-create the node.json file and re-run chef sole
3472+$CHARM_DIR/lib/node_json_script --cluster
3473+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
3474+
3475+# Re-create the node.json with the tag.
3476+$CHARM_DIR/lib/node_json_script --cluster --tag
3477
3478=== added file 'telco/precise/clearwater-homestead/hooks/homestead-relation-departed'
3479--- telco/precise/clearwater-homestead/hooks/homestead-relation-departed 1970-01-01 00:00:00 +0000
3480+++ telco/precise/clearwater-homestead/hooks/homestead-relation-departed 2014-11-10 14:55:38 +0000
3481@@ -0,0 +1,25 @@
3482+#!/bin/bash
3483+set -e
3484+
3485+# Get the machine number of this unit and the remote unit. This
3486+# takes the form '<charm name>/<index>
3487+peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
3488+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
3489+
3490+if [ $this_index -gt $peer_index ]
3491+ then
3492+ # Remove this node. This relation can be called more than once, so check
3493+ # whether the node has already been decommissioned.
3494+ decommissioned=$(nodetool netstats | grep DECOMMISSIONED > /dev/null; echo $?)
3495+ if [[ $decommissioned == 1* ]]
3496+ then
3497+ monit stop homestead
3498+ monit unmonitor cassandra
3499+ nodetool decommission
3500+ fi
3501+ else
3502+ # Remove the node.json in databags that corresponds to the node being removed.
3503+ file_name="/home/ubuntu/chef-solo/data_bags/node/"$peer_index".json"
3504+ rm $file_name
3505+ chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
3506+fi
3507
3508=== added file 'telco/precise/clearwater-homestead/hooks/homestead-relation-joined'
3509--- telco/precise/clearwater-homestead/hooks/homestead-relation-joined 1970-01-01 00:00:00 +0000
3510+++ telco/precise/clearwater-homestead/hooks/homestead-relation-joined 2014-11-10 14:55:38 +0000
3511@@ -0,0 +1,33 @@
3512+#!/bin/bash
3513+set -e
3514+
3515+# Get the IP address of this unit and the remote unit
3516+peer_ip=$(relation-get private-address)
3517+this_ip=$(unit-get private-address)
3518+
3519+# Get the machine number of this unit and the remote unit. This
3520+# takes the form '<charm name>/<index>
3521+peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
3522+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
3523+
3524+# Re-create the node.json files in the data bags. Mark the new
3525+# node as joining - the new node is the one with the higher index
3526+if [ $this_index -gt $peer_index ]
3527+ then
3528+ $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
3529+ $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster --joining
3530+ else
3531+ $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster --joining
3532+ $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
3533+fi
3534+
3535+# Re-create the node.json file and re-run chef solo
3536+$CHARM_DIR/lib/node_json_script --cluster
3537+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
3538+
3539+# Re-create the node.json with the tag. Only do this for the existing node, not the
3540+# joining node
3541+if [ $this_index -lt $peer_index ]
3542+ then
3543+ $CHARM_DIR/lib/node_json_script --cluster --tag
3544+fi
3545
3546=== added file 'telco/precise/clearwater-homestead/hooks/install'
3547--- telco/precise/clearwater-homestead/hooks/install 1970-01-01 00:00:00 +0000
3548+++ telco/precise/clearwater-homestead/hooks/install 2014-11-10 14:55:38 +0000
3549@@ -0,0 +1,37 @@
3550+#!/bin/bash
3551+set -e
3552+
3553+# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
3554+# for public-address and private-address. To work-around this, we resolve the
3555+# host names. However, after we've joined to the DNSaaS charm, we can no longer
3556+# resolve these, so add them to /etc/hosts.
3557+if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
3558+ private_address=$(unit-get private-address)
3559+ public_address=$(unit-get public-address)
3560+ private_ip=$($CHARM_DIR/lib/unit-get private-address)
3561+ public_ip=$($CHARM_DIR/lib/unit-get public-address)
3562+ [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
3563+ [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
3564+ echo "$private_ip homestead-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
3565+fi
3566+
3567+# Install chef solo
3568+$CHARM_DIR/lib/chef_solo_install
3569+
3570+this_ip=$(unit-get private-address)
3571+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
3572+$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index"
3573+$CHARM_DIR/lib/node_json_script
3574+
3575+# Update the config file
3576+$CHARM_DIR/lib/config_script
3577+
3578+apt-get update
3579+
3580+# Install the node
3581+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
3582+
3583+# Expose the correct ports
3584+open-port 22/tcp
3585+open-port 123/udp
3586+open-port 161/udp
3587
3588=== added file 'telco/precise/clearwater-homestead/hooks/programmable-multiple-relation-changed'
3589--- telco/precise/clearwater-homestead/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
3590+++ telco/precise/clearwater-homestead/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
3591@@ -0,0 +1,24 @@
3592+#!/bin/bash
3593+set -e
3594+
3595+# Set our DNS requirements
3596+TTL=300
3597+id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
3598+ip=$($CHARM_DIR/lib/unit-get private-address)
3599+relation-set domain=$(config-get zone)
3600+relation-set resources='homestead '$TTL' IN A '$ip'
3601+homestead-'$id' '$TTL' IN A '$ip
3602+
3603+# Update our DNS server
3604+if [ "$(relation-get public-address)" != "" ]
3605+then
3606+ echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
3607+ grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
3608+ mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
3609+ echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
3610+ service dnsmasq restart
3611+fi
3612+
3613+# Update Clearwater configuration and restart
3614+$CHARM_DIR/lib/config_script programmable-multiple
3615+$CHARM_DIR/lib/restart
3616
3617=== added file 'telco/precise/clearwater-homestead/hooks/start'
3618--- telco/precise/clearwater-homestead/hooks/start 1970-01-01 00:00:00 +0000
3619+++ telco/precise/clearwater-homestead/hooks/start 2014-11-10 14:55:38 +0000
3620@@ -0,0 +1,18 @@
3621+#!/bin/bash
3622+# Here put anything that is needed to start the service.
3623+# Note that currently this is run directly after install
3624+# i.e. 'service apache2 start'
3625+set -e
3626+
3627+# This hook needs to be idempotent, so this could be run when homestead is
3628+# already running, when it's running but not monitored by monit, when
3629+# it's stopped but being monitored (so it's about to start), or stopped
3630+# and unmonitored. To cover all these cases, stop monit, start homestead, start
3631+# monit, then finally have monit monitor homestead
3632+service monit stop
3633+service homestead start
3634+service homestead-prov start
3635+service monit start
3636+sleep 1
3637+monit monitor homestead
3638+monit monitor homestead-prov
3639
3640=== added file 'telco/precise/clearwater-homestead/hooks/stop'
3641--- telco/precise/clearwater-homestead/hooks/stop 1970-01-01 00:00:00 +0000
3642+++ telco/precise/clearwater-homestead/hooks/stop 2014-11-10 14:55:38 +0000
3643@@ -0,0 +1,13 @@
3644+#!/bin/bash
3645+# This will be run when the service is being torn down, allowing you to disable
3646+# it in various ways..
3647+# For example, if your web app uses a text file to signal to the load balancer
3648+# that it is live... you could remove it and sleep for a bit to allow the load
3649+# balancer to stop sending traffic.
3650+# rm /srv/webroot/server-live.txt && sleep 30
3651+set -e
3652+
3653+# Stop homestead via monit
3654+service monit start
3655+monit stop homestead
3656+monit stop homestead-prov
3657
3658=== added file 'telco/precise/clearwater-homestead/hooks/upgrade-charm'
3659--- telco/precise/clearwater-homestead/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
3660+++ telco/precise/clearwater-homestead/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
3661@@ -0,0 +1,9 @@
3662+#!/bin/bash
3663+# This hook is executed each time a charm is upgraded after the new charm
3664+# contents have been unpacked
3665+# Best practice suggests you execute the hooks/install and
3666+# hooks/config-changed to ensure all updates are processed
3667+set -e
3668+
3669+$CHARM_DIR/hooks/install
3670+$CHARM_DIR/hooks/config-changed
3671
3672=== added file 'telco/precise/clearwater-homestead/icon.svg'
3673--- telco/precise/clearwater-homestead/icon.svg 1970-01-01 00:00:00 +0000
3674+++ telco/precise/clearwater-homestead/icon.svg 2014-11-10 14:55:38 +0000
3675@@ -0,0 +1,407 @@
3676+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
3677+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3678+
3679+<svg
3680+ xmlns:dc="http://purl.org/dc/elements/1.1/"
3681+ xmlns:cc="http://creativecommons.org/ns#"
3682+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
3683+ xmlns:svg="http://www.w3.org/2000/svg"
3684+ xmlns="http://www.w3.org/2000/svg"
3685+ xmlns:xlink="http://www.w3.org/1999/xlink"
3686+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
3687+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
3688+ width="96"
3689+ height="96"
3690+ id="svg6517"
3691+ version="1.1"
3692+ inkscape:version="0.48.2 r9819"
3693+ sodipodi:docname="icon.svg">
3694+ <defs
3695+ id="defs6519">
3696+ <linearGradient
3697+ id="Background">
3698+ <stop
3699+ id="stop4178"
3700+ offset="0"
3701+ style="stop-color:#b8b8b8;stop-opacity:1" />
3702+ <stop
3703+ id="stop4180"
3704+ offset="1"
3705+ style="stop-color:#c9c9c9;stop-opacity:1" />
3706+ </linearGradient>
3707+ <filter
3708+ style="color-interpolation-filters:sRGB;"
3709+ inkscape:label="Inner Shadow"
3710+ id="filter1121">
3711+ <feFlood
3712+ flood-opacity="0.59999999999999998"
3713+ flood-color="rgb(0,0,0)"
3714+ result="flood"
3715+ id="feFlood1123" />
3716+ <feComposite
3717+ in="flood"
3718+ in2="SourceGraphic"
3719+ operator="out"
3720+ result="composite1"
3721+ id="feComposite1125" />
3722+ <feGaussianBlur
3723+ in="composite1"
3724+ stdDeviation="1"
3725+ result="blur"
3726+ id="feGaussianBlur1127" />
3727+ <feOffset
3728+ dx="0"
3729+ dy="2"
3730+ result="offset"
3731+ id="feOffset1129" />
3732+ <feComposite
3733+ in="offset"
3734+ in2="SourceGraphic"
3735+ operator="atop"
3736+ result="composite2"
3737+ id="feComposite1131" />
3738+ </filter>
3739+ <filter
3740+ style="color-interpolation-filters:sRGB;"
3741+ inkscape:label="Drop Shadow"
3742+ id="filter950">
3743+ <feFlood
3744+ flood-opacity="0.25"
3745+ flood-color="rgb(0,0,0)"
3746+ result="flood"
3747+ id="feFlood952" />
3748+ <feComposite
3749+ in="flood"
3750+ in2="SourceGraphic"
3751+ operator="in"
3752+ result="composite1"
3753+ id="feComposite954" />
3754+ <feGaussianBlur
3755+ in="composite1"
3756+ stdDeviation="1"
3757+ result="blur"
3758+ id="feGaussianBlur956" />
3759+ <feOffset
3760+ dx="0"
3761+ dy="1"
3762+ result="offset"
3763+ id="feOffset958" />
3764+ <feComposite
3765+ in="SourceGraphic"
3766+ in2="offset"
3767+ operator="over"
3768+ result="composite2"
3769+ id="feComposite960" />
3770+ </filter>
3771+ <clipPath
3772+ clipPathUnits="userSpaceOnUse"
3773+ id="clipPath873">
3774+ <g
3775+ transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
3776+ id="g875"
3777+ inkscape:label="Layer 1"
3778+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
3779+ <path
3780+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
3781+ d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
3782+ id="path877"
3783+ inkscape:connector-curvature="0"
3784+ sodipodi:nodetypes="sssssssss" />
3785+ </g>
3786+ </clipPath>
3787+ <filter
3788+ inkscape:collect="always"
3789+ id="filter891"
3790+ inkscape:label="Badge Shadow">
3791+ <feGaussianBlur
3792+ inkscape:collect="always"
3793+ stdDeviation="0.71999962"
3794+ id="feGaussianBlur893" />
3795+ </filter>
3796+ </defs>
3797+ <sodipodi:namedview
3798+ id="base"
3799+ pagecolor="#ffffff"
3800+ bordercolor="#666666"
3801+ borderopacity="1.0"
3802+ inkscape:pageopacity="0.0"
3803+ inkscape:pageshadow="2"
3804+ inkscape:zoom="1.3995495"
3805+ inkscape:cx="18.514671"
3806+ inkscape:cy="49.018169"
3807+ inkscape:document-units="px"
3808+ inkscape:current-layer="layer1"
3809+ showgrid="true"
3810+ fit-margin-top="0"
3811+ fit-margin-left="0"
3812+ fit-margin-right="0"
3813+ fit-margin-bottom="0"
3814+ inkscape:window-width="1331"
3815+ inkscape:window-height="674"
3816+ inkscape:window-x="19"
3817+ inkscape:window-y="1"
3818+ inkscape:window-maximized="0"
3819+ showborder="true"
3820+ showguides="true"
3821+ inkscape:guide-bbox="true"
3822+ inkscape:showpageshadow="false">
3823+ <inkscape:grid
3824+ type="xygrid"
3825+ id="grid821" />
3826+ <sodipodi:guide
3827+ orientation="1,0"
3828+ position="16,48"
3829+ id="guide823" />
3830+ <sodipodi:guide
3831+ orientation="0,1"
3832+ position="64,80"
3833+ id="guide825" />
3834+ <sodipodi:guide
3835+ orientation="1,0"
3836+ position="80,40"
3837+ id="guide827" />
3838+ <sodipodi:guide
3839+ orientation="0,1"
3840+ position="64,16"
3841+ id="guide829" />
3842+ </sodipodi:namedview>
3843+ <metadata
3844+ id="metadata6522">
3845+ <rdf:RDF>
3846+ <cc:Work
3847+ rdf:about="">
3848+ <dc:format>image/svg+xml</dc:format>
3849+ <dc:type
3850+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
3851+ <dc:title></dc:title>
3852+ </cc:Work>
3853+ </rdf:RDF>
3854+ </metadata>
3855+ <g
3856+ inkscape:label="BACKGROUND"
3857+ inkscape:groupmode="layer"
3858+ id="layer1"
3859+ transform="translate(268,-635.29076)"
3860+ style="display:inline">
3861+ <path
3862+ style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
3863+ d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
3864+ id="path6455"
3865+ inkscape:connector-curvature="0"
3866+ sodipodi:nodetypes="sssssssss" />
3867+ <image
3868+ y="633.29077"
3869+ x="-270"
3870+ id="image3169"
3871+ xlink:href="data:image/png;base64,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
4000+AABJRU5ErkJggg==
4001+"
4002+ height="96"
4003+ width="96"
4004+ style="stroke:#000000;stroke-opacity:0.18666669" />
4005+ </g>
4006+ <g
4007+ inkscape:groupmode="layer"
4008+ id="layer3"
4009+ inkscape:label="PLACE YOUR PICTOGRAM HERE"
4010+ style="display:inline" />
4011+ <g
4012+ inkscape:groupmode="layer"
4013+ id="layer2"
4014+ inkscape:label="BADGE"
4015+ style="display:none"
4016+ sodipodi:insensitive="true">
4017+ <g
4018+ style="display:inline"
4019+ transform="translate(-340.00001,-581)"
4020+ id="g4394"
4021+ clip-path="none">
4022+ <g
4023+ id="g855">
4024+ <g
4025+ inkscape:groupmode="maskhelper"
4026+ id="g870"
4027+ clip-path="url(#clipPath873)"
4028+ style="opacity:0.6;filter:url(#filter891)">
4029+ <path
4030+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
4031+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
4032+ sodipodi:ry="12"
4033+ sodipodi:rx="12"
4034+ sodipodi:cy="552.36218"
4035+ sodipodi:cx="252"
4036+ id="path844"
4037+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4038+ sodipodi:type="arc" />
4039+ </g>
4040+ <g
4041+ id="g862">
4042+ <path
4043+ sodipodi:type="arc"
4044+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4045+ id="path4398"
4046+ sodipodi:cx="252"
4047+ sodipodi:cy="552.36218"
4048+ sodipodi:rx="12"
4049+ sodipodi:ry="12"
4050+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
4051+ transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
4052+ <path
4053+ transform="matrix(1.25,0,0,1.25,33,-100.45273)"
4054+ d="m 264,552.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
4055+ sodipodi:ry="12"
4056+ sodipodi:rx="12"
4057+ sodipodi:cy="552.36218"
4058+ sodipodi:cx="252"
4059+ id="path4400"
4060+ style="color:#000000;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4061+ sodipodi:type="arc" />
4062+ <path
4063+ sodipodi:type="star"
4064+ style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4065+ id="path4459"
4066+ sodipodi:sides="5"
4067+ sodipodi:cx="666.19574"
4068+ sodipodi:cy="589.50385"
4069+ sodipodi:r1="7.2431178"
4070+ sodipodi:r2="4.3458705"
4071+ sodipodi:arg1="1.0471976"
4072+ sodipodi:arg2="1.6755161"
4073+ inkscape:flatsided="false"
4074+ inkscape:rounded="0.1"
4075+ inkscape:randomized="0"
4076+ d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
4077+ transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
4078+ </g>
4079+ </g>
4080+ </g>
4081+ </g>
4082+</svg>
4083
4084=== added directory 'telco/precise/clearwater-homestead/lib'
4085=== added file 'telco/precise/clearwater-homestead/lib/chef_solo_install'
4086--- telco/precise/clearwater-homestead/lib/chef_solo_install 1970-01-01 00:00:00 +0000
4087+++ telco/precise/clearwater-homestead/lib/chef_solo_install 2014-11-10 14:55:38 +0000
4088@@ -0,0 +1,34 @@
4089+#!/bin/bash
4090+
4091+# This covers installing chef-solo and the Clearwater chef recipes
4092+# Install needed libraries
4093+apt-get -y install git libxml2-dev libxslt1-dev wget curl
4094+
4095+# Install chef
4096+install_sh="http://opscode.com/chef/install.sh"
4097+version_string="-v 11.6.0"
4098+bash <(wget ${install_sh} -O -) ${version_string}
4099+
4100+# Pull down the Clearwater chef recipes
4101+if [ ! -d /home/ubuntu/chef-solo ]
4102+then
4103+ mkdir /home/ubuntu/chef-solo
4104+ git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
4105+fi
4106+
4107+# Update the chef recipes
4108+cd /home/ubuntu/chef-solo
4109+git pull origin --recurse-submodules master
4110+
4111+# Create the solo.rb file
4112+cat > /home/ubuntu/chef-solo/solo.rb <<EOP
4113+file_cache_path "/var/chef-solo"
4114+cookbook_path [
4115+ "/home/ubuntu/chef-solo/cookbooks"
4116+]
4117+data_bag_path "/home/ubuntu/chef-solo/data_bags"
4118+environment_path "/home/ubuntu/chef-solo/environments"
4119+role_path "/home/ubuntu/chef-solo/roles"
4120+verbose_logging true
4121+log_level :debug
4122+EOP
4123
4124=== added file 'telco/precise/clearwater-homestead/lib/config_script'
4125--- telco/precise/clearwater-homestead/lib/config_script 1970-01-01 00:00:00 +0000
4126+++ telco/precise/clearwater-homestead/lib/config_script 2014-11-10 14:55:38 +0000
4127@@ -0,0 +1,43 @@
4128+#!/bin/bash
4129+
4130+relation_name=$1
4131+
4132+set -e
4133+
4134+# Defaults
4135+sprout_hostname=sprout.$(config-get zone)
4136+hs_hostname=homestead.$(config-get zone):8888
4137+hs_provisioning_hostname=homestead.$(config-get zone):8889
4138+xdms_hostname=homer.$(config-get zone):7888
4139+ralf_hostname=
4140+sas_server=0.0.0.0
4141+enum_server=
4142+
4143+# Import existing configuration
4144+[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
4145+
4146+# Apply new configuration
4147+home_domain=$(config-get zone)
4148+sas_server=$(config-get sas)
4149+local_ip=$($CHARM_DIR/lib/unit-get private-address)
4150+public_ip=$($CHARM_DIR/lib/unit-get public-address)
4151+public_hostname=homestead-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
4152+
4153+# Write configuration back
4154+mkdir -p /etc/clearwater
4155+cat >/etc/clearwater/config <<EOF
4156+# Deployment definitions
4157+home_domain=$home_domain
4158+sprout_hostname=$sprout_hostname
4159+hs_hostname=$hs_hostname
4160+hs_provisioning_hostname=$hs_provisioning_hostname
4161+xdms_hostname=$xdms_hostname
4162+ralf_hostname=$ralf_hostname
4163+sas_server=$sas_server
4164+enum_server=$enum_server
4165+
4166+# Local IP configuration
4167+local_ip=$local_ip
4168+public_ip=$public_ip
4169+public_hostname=$public_hostname
4170+EOF
4171
4172=== added file 'telco/precise/clearwater-homestead/lib/node_json_clustered_script'
4173--- telco/precise/clearwater-homestead/lib/node_json_clustered_script 1970-01-01 00:00:00 +0000
4174+++ telco/precise/clearwater-homestead/lib/node_json_clustered_script 2014-11-10 14:55:38 +0000
4175@@ -0,0 +1,58 @@
4176+#!/usr/bin/python
4177+import subprocess
4178+import string
4179+import socket
4180+import os
4181+import sys
4182+import argparse
4183+
4184+# Create the ~/chef-solo/data_bags/node/<index>.json files.
4185+#
4186+# The node.json file contains the machines IP address, the machine ID (a number)
4187+# and the repo server.
4188+#
4189+# If the node is being clustered, the role 'clustered' is added, and if the
4190+# node is joinging the attribute 'joining' is added
4191+#
4192+# The node.json file is templated in lib/node_json_clustered_template.
4193+
4194+parser = argparse.ArgumentParser()
4195+
4196+parser.add_argument('--cluster', action='store_true')
4197+parser.add_argument('--joining', action='store_true')
4198+parser.add_argument('--index', type=int, required=True)
4199+parser.add_argument('--ip', type=str, required=True)
4200+
4201+args = parser.parse_args()
4202+
4203+# Populate the dictionary
4204+d = {}
4205+
4206+d['LOCAL_IP'] = socket.gethostbyname(args.ip)
4207+d['MACHINE_ID'] = str(args.index + 1)
4208+d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
4209+
4210+if args.cluster:
4211+ d['CLUSTER'] = ",\n \"role[clustered]\""
4212+ d['CLUSTERED'] = ", \"clustered\""
4213+else:
4214+ d['CLUSTER'] = ""
4215+ d['CLUSTERED'] = ""
4216+
4217+if args.joining:
4218+ d['JOINING'] = ",\n \"joining\": true"
4219+else:
4220+ d['JOINING'] = ""
4221+
4222+# Open template file
4223+charm_dir = os.environ['CHARM_DIR']
4224+with open( '%s/lib/node_json_clustered_template' % charm_dir ) as f:
4225+ src = string.Template( f.read() )
4226+
4227+# Make the substitutions
4228+result = src.substitute(d)
4229+
4230+# Write to ~/chef-solo/data_bags/node/<index>.json
4231+node_file = str(args.index + 1) + ".json"
4232+with open('/home/ubuntu/chef-solo/data_bags/node/%s' % node_file, 'w') as f:
4233+ f.write(result)
4234
4235=== added file 'telco/precise/clearwater-homestead/lib/node_json_clustered_template'
4236--- telco/precise/clearwater-homestead/lib/node_json_clustered_template 1970-01-01 00:00:00 +0000
4237+++ telco/precise/clearwater-homestead/lib/node_json_clustered_template 2014-11-10 14:55:38 +0000
4238@@ -0,0 +1,20 @@
4239+{
4240+ "id": "$LOCAL_IP",
4241+ "name": "$LOCAL_IP",
4242+ "chef_environment": "_default",
4243+ "json_class": "Chef::Node",
4244+ "automatic": {
4245+ "role": "homestead",
4246+ "roles": ["clearwater-infrastructure", "homestead"$CLUSTERED],
4247+ "cloud": {
4248+ "local_ipv4": "$LOCAL_IP"
4249+ },
4250+ "clearwater": {
4251+ "index": $MACHINE_ID$JOINING
4252+ }
4253+ },
4254+ "chef_type": "node",
4255+ "run_list": [
4256+ "role[homestead]"$CLUSTER
4257+ ]
4258+}
4259
4260=== added file 'telco/precise/clearwater-homestead/lib/node_json_script'
4261--- telco/precise/clearwater-homestead/lib/node_json_script 1970-01-01 00:00:00 +0000
4262+++ telco/precise/clearwater-homestead/lib/node_json_script 2014-11-10 14:55:38 +0000
4263@@ -0,0 +1,57 @@
4264+#!/usr/bin/python
4265+
4266+import subprocess
4267+import string
4268+import socket
4269+import os
4270+import argparse
4271+
4272+# Create the ~/chef-solo/node.json file.
4273+#
4274+# The node.json file contains the machines IP address, the machine ID (a number)
4275+# and the repo server.
4276+#
4277+# If the node is being clustered, the role 'clustered' is added, and after
4278+# clustering the tag 'clustered' is added (for homer/homestead)
4279+#
4280+# The node.json file is templated in lib/node_json_template.
4281+
4282+parser = argparse.ArgumentParser()
4283+
4284+parser.add_argument('--cluster', action='store_true')
4285+parser.add_argument('--tag', action='store_true')
4286+
4287+args = parser.parse_args()
4288+
4289+# Populate the dictionary
4290+d = {}
4291+
4292+d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
4293+d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
4294+d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
4295+
4296+node_file = "/home/ubuntu/chef-solo/node.json"
4297+if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
4298+ d['CLUSTER'] = ",\n \"role[clustered]\""
4299+ d['CLUSTERED'] = ", \"clustered\""
4300+ d['TAG'] = ""
4301+
4302+ if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
4303+ d['TAG'] = ",\n \"tags\": [\"clustered\"]"
4304+
4305+else:
4306+ d['CLUSTER'] = ""
4307+ d['CLUSTERED'] = ""
4308+ d['TAG'] = ""
4309+
4310+# Open template file
4311+charm_dir = os.environ['CHARM_DIR']
4312+with open( '%s/lib/node_json_template' % charm_dir ) as f:
4313+ src = string.Template( f.read() )
4314+
4315+# Make the substitutions
4316+result = src.substitute(d)
4317+
4318+# Write to ~/chef-solo/node.json
4319+with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
4320+ f.write(result)
4321
4322=== added file 'telco/precise/clearwater-homestead/lib/node_json_template'
4323--- telco/precise/clearwater-homestead/lib/node_json_template 1970-01-01 00:00:00 +0000
4324+++ telco/precise/clearwater-homestead/lib/node_json_template 2014-11-10 14:55:38 +0000
4325@@ -0,0 +1,17 @@
4326+{
4327+ "id": "$LOCAL_IP",
4328+ "name": "$LOCAL_IP",
4329+ "chef_environment": "_default",
4330+ "role": "homestead",
4331+ "roles": ["clearwater-infrastructure", "homestead"$CLUSTERED],
4332+ "cloud": {
4333+ "local_ipv4": "$LOCAL_IP"
4334+ },
4335+ "clearwater": {
4336+ "index": $MACHINE_ID,
4337+ "repo_server": "$REPO"
4338+ },
4339+ "run_list": [
4340+ "role[homestead]"$CLUSTER
4341+ ]$TAG
4342+}
4343
4344=== added file 'telco/precise/clearwater-homestead/lib/restart'
4345--- telco/precise/clearwater-homestead/lib/restart 1970-01-01 00:00:00 +0000
4346+++ telco/precise/clearwater-homestead/lib/restart 2014-11-10 14:55:38 +0000
4347@@ -0,0 +1,7 @@
4348+#!/bin/bash
4349+set -e
4350+
4351+# Restart clearwater-infrastructure, and stop homestead/homestead-prov (to be restarted by monit)
4352+service clearwater-infrastructure restart
4353+service homestead stop
4354+service homestead-prov stop
4355
4356=== added file 'telco/precise/clearwater-homestead/lib/unit-get'
4357--- telco/precise/clearwater-homestead/lib/unit-get 1970-01-01 00:00:00 +0000
4358+++ telco/precise/clearwater-homestead/lib/unit-get 2014-11-10 14:55:38 +0000
4359@@ -0,0 +1,36 @@
4360+#!/bin/bash
4361+set -ex
4362+onEC2=false
4363+key=$1
4364+val=$(unit-get $1)
4365+
4366+if [ -f $CHARM_DIR/lib/provider.txt ]
4367+then
4368+ PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
4369+else
4370+ #checking dirty ec2 hack will work
4371+ wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
4372+ if ( "$onEC2" == true )
4373+ then
4374+ echo "EC2" > $CHARM_DIR/lib/provider.txt
4375+ else
4376+ echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
4377+ fi
4378+fi
4379+
4380+if [ "$PROVIDER" == "EC2" ]
4381+then
4382+ if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
4383+ then
4384+ val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
4385+ elif [ "$key" = "private-address" ]
4386+ then
4387+ val_ip=$(dig +short $val | head -1)
4388+ [ -z "$val_ip" ] || val=$val_ip
4389+ ##if val_ip is empty getting the system IP
4390+ [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
4391+ fi
4392+fi
4393+
4394+echo $val
4395+
4396
4397=== added file 'telco/precise/clearwater-homestead/metadata.yaml'
4398--- telco/precise/clearwater-homestead/metadata.yaml 1970-01-01 00:00:00 +0000
4399+++ telco/precise/clearwater-homestead/metadata.yaml 2014-11-10 14:55:38 +0000
4400@@ -0,0 +1,18 @@
4401+name: clearwater-homestead
4402+summary: Homestead charm for Project Clearwater
4403+maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
4404+description: Homestead charm for Project Clearwater
4405+categories:
4406+ - misc
4407+subordinate: false
4408+requires:
4409+ programmable-multiple:
4410+ interface: dns-multi
4411+provides:
4412+ homestead-cscf:
4413+ interface: homestead-hss-interface
4414+ homestead-prov-user:
4415+ interface: homestead-prov-interface
4416+peers:
4417+ homestead:
4418+ interface: homestead-interface
4419
4420=== added file 'telco/precise/clearwater-homestead/revision'
4421--- telco/precise/clearwater-homestead/revision 1970-01-01 00:00:00 +0000
4422+++ telco/precise/clearwater-homestead/revision 2014-11-10 14:55:38 +0000
4423@@ -0,0 +1,1 @@
4424+1
4425
4426=== added directory 'telco/precise/clearwater-ralf'
4427=== added file 'telco/precise/clearwater-ralf/README.md'
4428--- telco/precise/clearwater-ralf/README.md 1970-01-01 00:00:00 +0000
4429+++ telco/precise/clearwater-ralf/README.md 2014-11-10 14:55:38 +0000
4430@@ -0,0 +1,90 @@
4431+# Overview
4432+
4433+This charm supports deployment and scaling of the Ralf component of a Project Clearwater system. See http://www.projectclearwater.org for more information on Project Clearwater.
4434+
4435+# Usage
4436+
4437+The Ralf service should be deployed as part of a Clearwater system. A Clearwater system can be deployed in a Juju environment by creating a config.yaml file then running the following commands.
4438+
4439+ juju deploy --config config.yaml clearwater-route53
4440+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
4441+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
4442+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
4443+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
4444+ juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
4445+ juju add-relation clearwater-ellis clearwater-route53:register-ellis
4446+ juju add-relation clearwater-bono clearwater-route53:register-bono
4447+ juju add-relation clearwater-sprout clearwater-route53:register-sprout
4448+ juju add-relation clearwater-homestead clearwater-route53:register-homestead
4449+ juju add-relation clearwater-homer clearwater-route53:register-homer
4450+ juju expose clearwater-bono
4451+ juju expose clearwater-ellis
4452+
4453+The config.yaml configuration file takes the following format.
4454+
4455+ clearwater-route53:
4456+ zone: <domain>
4457+ access_key: <ec2 access key>
4458+ secret_key: <ec2 secret access key>
4459+ sas: "0.0.0.0"
4460+
4461+ clearwater-ellis:
4462+ smtp_server: smtp.cw-ngv.com
4463+ smtp_username: username
4464+ smtp_password: password
4465+ email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
4466+ signup_key: secret
4467+ base_number: "6505550000"
4468+ number_count: 1000
4469+ repo: http://repo.cw-ngv.com/stable
4470+
4471+ clearwater-bono:
4472+ turn_workaround: password
4473+ repo: http://repo.cw-ngv.com/stable
4474+
4475+ clearwater-sprout:
4476+ reg_min_expires: 400
4477+ session_max_expires: 900
4478+ repo: http://repo.cw-ngv.com/stable
4479+
4480+ clearwater-homestead:
4481+ repo: http://repo.cw-ngv.com/stable
4482+
4483+ clearwater-homer:
4484+ repo: http://repo.cw-ngv.com/stable
4485+
4486+Note that the clearwater-ralf charm can only be deployed on the `amd64` architecture.
4487+
4488+## Scale out Usage
4489+
4490+## Known Limitations and Issues
4491+
4492+The only currently supported DNS service for Clearwater is clearwater-route53 (when deploying in Amazon EC2), so will currently only work on EC2. Additional DNS services will be added for other environments in future.
4493+
4494+clearwater-ralf currently only supports running as a single unit. Clustering support will be released shortly, which will allow units to be added to and removed from a clearwater-ralf deployment using juju add-unit and juju remove-unit commands.
4495+
4496+Note that this charm does not current pass charm proof because its hooks use EC2 APIs directly to obtain the public IP address rather than unit-get public-address. This is to work around what looks like a Juju bug - unit-get public-address on EC2 returns the public hostname of the unit rather than the public IP address. Unfortunately EC2 public hostname are actually split horizon hostnames, so if you attempt to resolve the hostname from within EC2 it actually resolved to a private IP address - it will only resolve to a public address if resolved from outside EC2.
4497+
4498+# Configuration
4499+
4500+Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
4501+
4502+clearwater-route53
4503+
4504+- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
4505+- `access_key:` and `secret_key:` These must be set to the AWS access key and secret key of the AWS account which owns the DNS zone name.
4506+
4507+clearwater-ellis
4508+
4509+- `signup_key:` This is used as a signup key on the Ellis self-provisioning portal, so should be set to a unique string for each installation.
4510+- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
4511+
4512+# Contact Information
4513+
4514+## Upstream Project Name
4515+
4516+See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
4517+
4518+Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
4519+
4520+The Clearwater mailing list is at lists.projectclearwater.org.
4521
4522=== added file 'telco/precise/clearwater-ralf/config.yaml'
4523--- telco/precise/clearwater-ralf/config.yaml 1970-01-01 00:00:00 +0000
4524+++ telco/precise/clearwater-ralf/config.yaml 2014-11-10 14:55:38 +0000
4525@@ -0,0 +1,12 @@
4526+options:
4527+ zone:
4528+ description: The DNS root zone for this service
4529+ type: string
4530+ sas:
4531+ default: ""
4532+ description: The location of the SAS server
4533+ type: string
4534+ repo:
4535+ default: http://repo.cw-ngv.com/stable
4536+ description: The location of the repo server
4537+ type: string
4538
4539=== added file 'telco/precise/clearwater-ralf/copyright'
4540--- telco/precise/clearwater-ralf/copyright 1970-01-01 00:00:00 +0000
4541+++ telco/precise/clearwater-ralf/copyright 2014-11-10 14:55:38 +0000
4542@@ -0,0 +1,31 @@
4543+Project Clearwater - IMS in the Cloud
4544+Copyright (C) 2013 Metaswitch Networks Ltd
4545+
4546+This program is free software: you can redistribute it and/or modify it
4547+under the terms of the GNU General Public License as published by the
4548+Free Software Foundation, either version 3 of the License, or (at your
4549+option) any later version, along with the "Special Exception" for use of
4550+the program along with SSL, set forth below. This program is distributed
4551+in the hope that it will be useful, but WITHOUT ANY WARRANTY;
4552+without even the implied warranty of MERCHANTABILITY or FITNESS FOR
4553+A PARTICULAR PURPOSE. See the GNU General Public License for more
4554+details. You should have received a copy of the GNU General Public
4555+License along with this program. If not, see
4556+<http://www.gnu.org/licenses/>.
4557+
4558+The author can be reached by email at clearwater@metaswitch.com or by
4559+post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
4560+
4561+Special Exception
4562+Metaswitch Networks Ltd grants you permission to copy, modify,
4563+propagate, and distribute a work formed by combining OpenSSL with The
4564+Software, or a work derivative of such a combination, even if such
4565+copying, modification, propagation, or distribution would otherwise
4566+violate the terms of the GPL. You must comply with the GPL in all
4567+respects for all of the code used other than OpenSSL.
4568+"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
4569+Project and licensed under the OpenSSL Licenses, or a work based on such
4570+software and licensed under the OpenSSL Licenses.
4571+"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
4572+under which the OpenSSL Project distributes the OpenSSL toolkit software,
4573+as those licenses appear in the file LICENSE-OPENSSL.
4574
4575=== added directory 'telco/precise/clearwater-ralf/hooks'
4576=== added file 'telco/precise/clearwater-ralf/hooks/config-changed'
4577--- telco/precise/clearwater-ralf/hooks/config-changed 1970-01-01 00:00:00 +0000
4578+++ telco/precise/clearwater-ralf/hooks/config-changed 2014-11-10 14:55:38 +0000
4579@@ -0,0 +1,9 @@
4580+#!/bin/bash
4581+set -e
4582+
4583+# Update the /etc/clearwater/config file, the node.json, and re-run
4584+# chef-solo
4585+$CHARM_DIR/lib/config_script
4586+$CHARM_DIR/lib/node_json_script
4587+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
4588+$CHARM_DIR/lib/restart
4589
4590=== added file 'telco/precise/clearwater-ralf/hooks/install'
4591--- telco/precise/clearwater-ralf/hooks/install 1970-01-01 00:00:00 +0000
4592+++ telco/precise/clearwater-ralf/hooks/install 2014-11-10 14:55:38 +0000
4593@@ -0,0 +1,37 @@
4594+#!/bin/bash
4595+set -e
4596+
4597+# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
4598+# for public-address and private-address. To work-around this, we resolve the
4599+# host names. However, after we've joined to the DNSaaS charm, we can no longer
4600+# resolve these, so add them to /etc/hosts.
4601+if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
4602+ private_address=$(unit-get private-address)
4603+ public_address=$(unit-get public-address)
4604+ private_ip=$($CHARM_DIR/lib/unit-get private-address)
4605+ public_ip=$($CHARM_DIR/lib/unit-get public-address)
4606+ [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
4607+ [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
4608+ echo "$private_ip ralf-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
4609+fi
4610+
4611+# Install chef solo
4612+$CHARM_DIR/lib/chef_solo_install
4613+
4614+this_ip=`unit-get private-address`
4615+this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
4616+$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index"
4617+$CHARM_DIR/lib/node_json_script
4618+
4619+# Update the config file
4620+$CHARM_DIR/lib/config_script
4621+
4622+apt-get update
4623+
4624+# Install the node
4625+chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
4626+
4627+# Expose the correct ports
4628+open-port 22/tcp
4629+open-port 123/udp
4630+open-port 161/udp
4631
4632=== added file 'telco/precise/clearwater-ralf/hooks/programmable-multiple-relation-changed'
4633--- telco/precise/clearwater-ralf/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
4634+++ telco/precise/clearwater-ralf/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
4635@@ -0,0 +1,24 @@
4636+#!/bin/bash
4637+set -e
4638+
4639+# Set our DNS requirements
4640+TTL=300
4641+id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
4642+ip=$($CHARM_DIR/lib/unit-get private-address)
4643+relation-set domain=$(config-get zone)
4644+relation-set resources='ralf '$TTL' IN A '$ip'
4645+ralf-'$id' '$TTL' IN A '$ip
4646+
4647+# Update our DNS server
4648+if [ "$(relation-get public-address)" != "" ]
4649+then
4650+ echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
4651+ grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
4652+ mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
4653+ echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
4654+ service dnsmasq restart
4655+fi
4656+
4657+# Update Clearwater configuration and restart
4658+$CHARM_DIR/lib/config_script programmable-multiple
4659+$CHARM_DIR/lib/restart
4660
4661=== added file 'telco/precise/clearwater-ralf/hooks/ralf-cscf-relation-joined'
4662--- telco/precise/clearwater-ralf/hooks/ralf-cscf-relation-joined 1970-01-01 00:00:00 +0000
4663+++ telco/precise/clearwater-ralf/hooks/ralf-cscf-relation-joined 2014-11-10 14:55:38 +0000
4664@@ -0,0 +1,4 @@
4665+#!/bin/bash
4666+set -e
4667+
4668+relation-set public-address=ralf.$(config-get zone)
4669
4670=== added file 'telco/precise/clearwater-ralf/hooks/start'
4671--- telco/precise/clearwater-ralf/hooks/start 1970-01-01 00:00:00 +0000
4672+++ telco/precise/clearwater-ralf/hooks/start 2014-11-10 14:55:38 +0000
4673@@ -0,0 +1,16 @@
4674+#!/bin/bash
4675+# Here put anything that is needed to start the service.
4676+# Note that currently this is run directly after install
4677+# i.e. 'service apache2 start'
4678+set -e
4679+
4680+# This hook needs to be idempotent, so this could be run when ralf is
4681+# already running, when it's running but not monitored by monit, when
4682+# it's stopped but being monitored (so it's about to start), or stopped
4683+# and unmonitored. To cover all these cases, stop monit, start ralf, start
4684+# monit, then finally have monit monitor ralf
4685+service monit stop
4686+service ralf start
4687+service monit start
4688+sleep 1
4689+monit monitor ralf
4690
4691=== added file 'telco/precise/clearwater-ralf/hooks/stop'
4692--- telco/precise/clearwater-ralf/hooks/stop 1970-01-01 00:00:00 +0000
4693+++ telco/precise/clearwater-ralf/hooks/stop 2014-11-10 14:55:38 +0000
4694@@ -0,0 +1,12 @@
4695+#!/bin/bash
4696+# This will be run when the service is being torn down, allowing you to disable
4697+# it in various ways..
4698+# For example, if your web app uses a text file to signal to the load balancer
4699+# that it is live... you could remove it and sleep for a bit to allow the load
4700+# balancer to stop sending traffic.
4701+# rm /srv/webroot/server-live.txt && sleep 30
4702+set -e
4703+
4704+# Stop ralf via monit
4705+sudo service monit start
4706+sudo monit stop ralf
4707
4708=== added file 'telco/precise/clearwater-ralf/hooks/upgrade-charm'
4709--- telco/precise/clearwater-ralf/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
4710+++ telco/precise/clearwater-ralf/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
4711@@ -0,0 +1,9 @@
4712+#!/bin/bash
4713+# This hook is executed each time a charm is upgraded after the new charm
4714+# contents have been unpacked
4715+# Best practice suggests you execute the hooks/install and
4716+# hooks/config-changed to ensure all updates are processed
4717+set -e
4718+
4719+$CHARM_DIR/hooks/install
4720+$CHARM_DIR/hooks/config-changed
4721
4722=== added file 'telco/precise/clearwater-ralf/icon.svg'
4723--- telco/precise/clearwater-ralf/icon.svg 1970-01-01 00:00:00 +0000
4724+++ telco/precise/clearwater-ralf/icon.svg 2014-11-10 14:55:38 +0000
4725@@ -0,0 +1,407 @@
4726+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
4727+<!-- Created with Inkscape (http://www.inkscape.org/) -->
4728+
4729+<svg
4730+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4731+ xmlns:cc="http://creativecommons.org/ns#"
4732+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
4733+ xmlns:svg="http://www.w3.org/2000/svg"
4734+ xmlns="http://www.w3.org/2000/svg"
4735+ xmlns:xlink="http://www.w3.org/1999/xlink"
4736+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
4737+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
4738+ width="96"
4739+ height="96"
4740+ id="svg6517"
4741+ version="1.1"
4742+ inkscape:version="0.48.2 r9819"
4743+ sodipodi:docname="icon.svg">
4744+ <defs
4745+ id="defs6519">
4746+ <linearGradient
4747+ id="Background">
4748+ <stop
4749+ id="stop4178"
4750+ offset="0"
4751+ style="stop-color:#b8b8b8;stop-opacity:1" />
4752+ <stop
4753+ id="stop4180"
4754+ offset="1"
4755+ style="stop-color:#c9c9c9;stop-opacity:1" />
4756+ </linearGradient>
4757+ <filter
4758+ style="color-interpolation-filters:sRGB;"
4759+ inkscape:label="Inner Shadow"
4760+ id="filter1121">
4761+ <feFlood
4762+ flood-opacity="0.59999999999999998"
4763+ flood-color="rgb(0,0,0)"
4764+ result="flood"
4765+ id="feFlood1123" />
4766+ <feComposite
4767+ in="flood"
4768+ in2="SourceGraphic"
4769+ operator="out"
4770+ result="composite1"
4771+ id="feComposite1125" />
4772+ <feGaussianBlur
4773+ in="composite1"
4774+ stdDeviation="1"
4775+ result="blur"
4776+ id="feGaussianBlur1127" />
4777+ <feOffset
4778+ dx="0"
4779+ dy="2"
4780+ result="offset"
4781+ id="feOffset1129" />
4782+ <feComposite
4783+ in="offset"
4784+ in2="SourceGraphic"
4785+ operator="atop"
4786+ result="composite2"
4787+ id="feComposite1131" />
4788+ </filter>
4789+ <filter
4790+ style="color-interpolation-filters:sRGB;"
4791+ inkscape:label="Drop Shadow"
4792+ id="filter950">
4793+ <feFlood
4794+ flood-opacity="0.25"
4795+ flood-color="rgb(0,0,0)"
4796+ result="flood"
4797+ id="feFlood952" />
4798+ <feComposite
4799+ in="flood"
4800+ in2="SourceGraphic"
4801+ operator="in"
4802+ result="composite1"
4803+ id="feComposite954" />
4804+ <feGaussianBlur
4805+ in="composite1"
4806+ stdDeviation="1"
4807+ result="blur"
4808+ id="feGaussianBlur956" />
4809+ <feOffset
4810+ dx="0"
4811+ dy="1"
4812+ result="offset"
4813+ id="feOffset958" />
4814+ <feComposite
4815+ in="SourceGraphic"
4816+ in2="offset"
4817+ operator="over"
4818+ result="composite2"
4819+ id="feComposite960" />
4820+ </filter>
4821+ <clipPath
4822+ clipPathUnits="userSpaceOnUse"
4823+ id="clipPath873">
4824+ <g
4825+ transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
4826+ id="g875"
4827+ inkscape:label="Layer 1"
4828+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
4829+ <path
4830+ style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
4831+ d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
4832+ id="path877"
4833+ inkscape:connector-curvature="0"
4834+ sodipodi:nodetypes="sssssssss" />
4835+ </g>
4836+ </clipPath>
4837+ <filter
4838+ inkscape:collect="always"
4839+ id="filter891"
4840+ inkscape:label="Badge Shadow">
4841+ <feGaussianBlur
4842+ inkscape:collect="always"
4843+ stdDeviation="0.71999962"
4844+ id="feGaussianBlur893" />
4845+ </filter>
4846+ </defs>
4847+ <sodipodi:namedview
4848+ id="base"
4849+ pagecolor="#ffffff"
4850+ bordercolor="#666666"
4851+ borderopacity="1.0"
4852+ inkscape:pageopacity="0.0"
4853+ inkscape:pageshadow="2"
4854+ inkscape:zoom="1.3995495"
4855+ inkscape:cx="18.514671"
4856+ inkscape:cy="49.018169"
4857+ inkscape:document-units="px"
4858+ inkscape:current-layer="layer1"
4859+ showgrid="true"
4860+ fit-margin-top="0"
4861+ fit-margin-left="0"
4862+ fit-margin-right="0"
4863+ fit-margin-bottom="0"
4864+ inkscape:window-width="1331"
4865+ inkscape:window-height="674"
4866+ inkscape:window-x="19"
4867+ inkscape:window-y="1"
4868+ inkscape:window-maximized="0"
4869+ showborder="true"
4870+ showguides="true"
4871+ inkscape:guide-bbox="true"
4872+ inkscape:showpageshadow="false">
4873+ <inkscape:grid
4874+ type="xygrid"
4875+ id="grid821" />
4876+ <sodipodi:guide
4877+ orientation="1,0"
4878+ position="16,48"
4879+ id="guide823" />
4880+ <sodipodi:guide
4881+ orientation="0,1"
4882+ position="64,80"
4883+ id="guide825" />
4884+ <sodipodi:guide
4885+ orientation="1,0"
4886+ position="80,40"
4887+ id="guide827" />
4888+ <sodipodi:guide
4889+ orientation="0,1"
4890+ position="64,16"
4891+ id="guide829" />
4892+ </sodipodi:namedview>
4893+ <metadata
4894+ id="metadata6522">
4895+ <rdf:RDF>
4896+ <cc:Work
4897+ rdf:about="">
4898+ <dc:format>image/svg+xml</dc:format>
4899+ <dc:type
4900+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
4901+ <dc:title></dc:title>
4902+ </cc:Work>
4903+ </rdf:RDF>
4904+ </metadata>
4905+ <g
4906+ inkscape:label="BACKGROUND"
4907+ inkscape:groupmode="layer"
4908+ id="layer1"
4909+ transform="translate(268,-635.29076)"
4910+ style="display:inline">
4911+ <path
4912+ style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
4913+ d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
4914+ id="path6455"
4915+ inkscape:connector-curvature="0"
4916+ sodipodi:nodetypes="sssssssss" />
4917+ <image
4918+ y="633.29077"
4919+ x="-270"
4920+ id="image3169"
4921+ xlink:href="data:image/png;base64,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
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches