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
=== modified file '.bzrignore'
--- .bzrignore 2014-10-28 18:40:11 +0000
+++ .bzrignore 2014-11-10 14:55:38 +0000
@@ -1,4 +1,2 @@
1precise1precise
2telco/precise
3telco/trusty
4cloudfoundry/trusty2cloudfoundry/trusty
53
=== modified file 'telco/01-deploy.sh'
--- telco/01-deploy.sh 2014-10-27 15:23:26 +0000
+++ telco/01-deploy.sh 2014-11-10 14:55:38 +0000
@@ -13,5 +13,5 @@
13 export JUJU_REPOSITORY=$PWD13 export JUJU_REPOSITORY=$PWD
14 juju-deployer -c bundle-telco.yaml14 juju-deployer -c bundle-telco.yaml
15else15else
16 echo "Run ./bzr-sync-local-charms before running this script"16 echo "Run ./sync-local-charms before running this script"
17fi17fi
1818
=== modified file 'telco/bundle-telco-store.yaml'
--- telco/bundle-telco-store.yaml 2014-11-10 00:33:48 +0000
+++ telco/bundle-telco-store.yaml 2014-11-10 14:55:38 +0000
@@ -78,7 +78,7 @@
78 "gui-x": "-857.8215242215981"78 "gui-x": "-857.8215242215981"
79 "gui-y": "698.5485784445332"79 "gui-y": "698.5485784445332"
80 sipml5: 80 sipml5:
81 charm: "local:trusty/sipml5"81 charm: "cs:~thomnico/trusty/sipml5"
82 num_units: 182 num_units: 1
83 expose: true83 expose: true
84 annotations: 84 annotations:
8585
=== modified file 'telco/bundle-telco.yaml'
--- telco/bundle-telco.yaml 2014-11-10 00:33:48 +0000
+++ telco/bundle-telco.yaml 2014-11-10 14:55:38 +0000
@@ -78,6 +78,7 @@
78 "gui-x": "-857.8215242215981"78 "gui-x": "-857.8215242215981"
79 "gui-y": "698.5485784445332"79 "gui-y": "698.5485784445332"
80 sipml5: 80 sipml5:
81# charm: "cs:~thomnico/trusty/sipml5"
81 charm: "local:trusty/sipml5"82 charm: "local:trusty/sipml5"
82 num_units: 183 num_units: 1
83 expose: true84 expose: true
8485
=== added directory 'telco/precise'
=== added directory 'telco/precise/clearwater-bono'
=== added file 'telco/precise/clearwater-bono/README.md'
--- telco/precise/clearwater-bono/README.md 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/README.md 2014-11-10 14:55:38 +0000
@@ -0,0 +1,90 @@
1# Overview
2
3This 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.
4
5# Usage
6
7The 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.
8
9 juju deploy --config config.yaml clearwater-route53
10 juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
11 juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
12 juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
13 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
14 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
15 juju add-relation clearwater-ellis clearwater-route53:register-ellis
16 juju add-relation clearwater-bono clearwater-route53:register-bono
17 juju add-relation clearwater-sprout clearwater-route53:register-sprout
18 juju add-relation clearwater-homestead clearwater-route53:register-homestead
19 juju add-relation clearwater-homer clearwater-route53:register-homer
20 juju expose clearwater-bono
21 juju expose clearwater-ellis
22
23The config.yaml configuration file takes the following format.
24
25 clearwater-route53:
26 zone: <domain>
27 access_key: <ec2 access key>
28 secret_key: <ec2 secret access key>
29 sas: "0.0.0.0"
30
31 clearwater-ellis:
32 smtp_server: smtp.cw-ngv.com
33 smtp_username: username
34 smtp_password: password
35 email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
36 signup_key: secret
37 base_number: "6505550000"
38 number_count: 1000
39 repo: http://repo.cw-ngv.com/stable
40
41 clearwater-bono:
42 turn_workaround: password
43 repo: http://repo.cw-ngv.com/stable
44
45 clearwater-sprout:
46 reg_min_expires: 400
47 session_max_expires: 900
48 repo: http://repo.cw-ngv.com/stable
49
50 clearwater-homestead:
51 repo: http://repo.cw-ngv.com/stable
52
53 clearwater-homer:
54 repo: http://repo.cw-ngv.com/stable
55
56Note that the clearwater-bono charm can only be deployed on the `amd64` architecture.
57
58## Scale out Usage
59
60## Known Limitations and Issues
61
62The 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.
63
64clearwater-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.
65
66Note 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.
67
68# Configuration
69
70Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
71
72clearwater-route53
73
74- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
75- `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.
76
77clearwater-ellis
78
79- `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.
80- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
81
82# Contact Information
83
84## Upstream Project Name
85
86See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
87
88Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
89
90The Clearwater mailing list is at lists.projectclearwater.org.
091
=== added file 'telco/precise/clearwater-bono/config.yaml'
--- telco/precise/clearwater-bono/config.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/config.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,20 @@
1options:
2 zone:
3 description: The DNS root zone for this service
4 type: string
5 sas:
6 default: ""
7 description: The location of the SAS server
8 type: string
9 turn_workaround:
10 default: ""
11 description: TURN workaround password, used by faulty WebRTC clients
12 type: string
13 trusted_peers:
14 default: ""
15 description: Comma-separated list of IP addresses of trusted peers
16 type: string
17 repo:
18 default: http://repo.cw-ngv.com/stable
19 description: The location of the repo server
20 type: string
021
=== added file 'telco/precise/clearwater-bono/copyright'
--- telco/precise/clearwater-bono/copyright 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/copyright 2014-11-10 14:55:38 +0000
@@ -0,0 +1,31 @@
1Project Clearwater - IMS in the Cloud
2Copyright (C) 2013 Metaswitch Networks Ltd
3
4This program is free software: you can redistribute it and/or modify it
5under the terms of the GNU General Public License as published by the
6Free Software Foundation, either version 3 of the License, or (at your
7option) any later version, along with the "Special Exception" for use of
8the program along with SSL, set forth below. This program is distributed
9in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11A PARTICULAR PURPOSE. See the GNU General Public License for more
12details. You should have received a copy of the GNU General Public
13License along with this program. If not, see
14<http://www.gnu.org/licenses/>.
15
16The author can be reached by email at clearwater@metaswitch.com or by
17post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
18
19Special Exception
20Metaswitch Networks Ltd grants you permission to copy, modify,
21propagate, and distribute a work formed by combining OpenSSL with The
22Software, or a work derivative of such a combination, even if such
23copying, modification, propagation, or distribution would otherwise
24violate the terms of the GPL. You must comply with the GPL in all
25respects for all of the code used other than OpenSSL.
26"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
27Project and licensed under the OpenSSL Licenses, or a work based on such
28software and licensed under the OpenSSL Licenses.
29"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
30under which the OpenSSL Project distributes the OpenSSL toolkit software,
31as those licenses appear in the file LICENSE-OPENSSL.
032
=== added directory 'telco/precise/clearwater-bono/hooks'
=== added file 'telco/precise/clearwater-bono/hooks/config-changed'
--- telco/precise/clearwater-bono/hooks/config-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/config-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2set -e
3
4# Update the /etc/clearwater/config file, the node.json, and re-run
5# chef-solo
6$CHARM_DIR/lib/config_script
7$CHARM_DIR/lib/node_json_script
8chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
9$CHARM_DIR/lib/restart
010
=== added file 'telco/precise/clearwater-bono/hooks/install'
--- telco/precise/clearwater-bono/hooks/install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,37 @@
1#!/bin/bash
2set -e
3
4# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
5# for public-address and private-address. To work-around this, we resolve the
6# host names. However, after we've joined to the DNSaaS charm, we can no longer
7# resolve these, so add them to /etc/hosts.
8if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
9 private_address=$(unit-get private-address)
10 public_address=$(unit-get public-address)
11 private_ip=$($CHARM_DIR/lib/unit-get private-address)
12 public_ip=$($CHARM_DIR/lib/unit-get public-address)
13 [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
14 [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
15 echo "$public_ip bono-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
16fi
17
18# Install chef solo, and create the node.json and config file
19$CHARM_DIR/lib/chef_solo_install
20$CHARM_DIR/lib/node_json_script
21$CHARM_DIR/lib/config_script
22
23apt-get update
24
25# Install the node
26chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
27
28# Expose the correct ports
29open-port 22/tcp
30open-port 123/udp
31open-port 161/udp
32open-port 3478/tcp
33open-port 3478/udp
34open-port 5060/tcp
35open-port 5060/udp
36open-port 5062/tcp
37open-port 6666/tcp
038
=== added file 'telco/precise/clearwater-bono/hooks/programmable-multiple-relation-changed'
--- telco/precise/clearwater-bono/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,28 @@
1#!/bin/bash
2set -e
3
4# Set our DNS requirements
5TTL=300
6id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
7ip=$($CHARM_DIR/lib/unit-get public-address)
8relation-set domain=$(config-get zone)
9relation-set resources='@ '$TTL' IN A '$ip'
10@ '$TTL' IN NAPTR 1 1 "S" "SIP+D2T" "" _sip._tcp
11@ '$TTL' IN NAPTR 2 1 "S" "SIP+D2U" "" _sip._udp
12_sip._tcp '$TTL' IN SRV 0 0 5060 bono-'$id'
13_sip._udp '$TTL' IN SRV 0 0 5060 bono-'$id'
14bono-'$id' '$TTL' IN A '$ip
15
16# Update our DNS server
17if [ "$(relation-get public-address)" != "" ]
18then
19 echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
20 grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
21 mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
22 echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
23 service dnsmasq restart
24fi
25
26# Update Clearwater configuration and restart
27$CHARM_DIR/lib/config_script programmable-multiple
28$CHARM_DIR/lib/restart
029
=== added file 'telco/precise/clearwater-bono/hooks/ralf-ctf-relation-changed'
--- telco/precise/clearwater-bono/hooks/ralf-ctf-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/ralf-ctf-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Update Clearwater configuration and restart
5$CHARM_DIR/lib/config_script ralf-ctf
6$CHARM_DIR/lib/restart
07
=== added file 'telco/precise/clearwater-bono/hooks/scscf-relation-changed'
--- telco/precise/clearwater-bono/hooks/scscf-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/scscf-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Update Clearwater configuration and restart
5$CHARM_DIR/lib/config_script scscf
6$CHARM_DIR/lib/restart
07
=== added file 'telco/precise/clearwater-bono/hooks/start'
--- telco/precise/clearwater-bono/hooks/start 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/start 2014-11-10 14:55:38 +0000
@@ -0,0 +1,16 @@
1#!/bin/bash
2# Here put anything that is needed to start the service.
3# Note that currently this is run directly after install
4# i.e. 'service apache2 start'
5set -e
6
7# This hook needs to be idempotent, so this could be run when bono is
8# already running, when it's running but not monitored by monit, when
9# it's stopped but being monitored (so it's about to start), or stopped
10# and unmonitored. To cover all these cases, stop monit, start bono, start
11# monit, then finally have monit monitor bono
12service monit stop
13service bono start
14service monit start
15sleep 1
16monit monitor bono
017
=== added file 'telco/precise/clearwater-bono/hooks/stop'
--- telco/precise/clearwater-bono/hooks/stop 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/stop 2014-11-10 14:55:38 +0000
@@ -0,0 +1,12 @@
1#!/bin/bash
2# This will be run when the service is being torn down, allowing you to disable
3# it in various ways..
4# For example, if your web app uses a text file to signal to the load balancer
5# that it is live... you could remove it and sleep for a bit to allow the load
6# balancer to stop sending traffic.
7# rm /srv/webroot/server-live.txt && sleep 30
8set -e
9
10# Stop bono via monit
11sudo service monit start
12sudo monit stop bono
013
=== added file 'telco/precise/clearwater-bono/hooks/upgrade-charm'
--- telco/precise/clearwater-bono/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2# This hook is executed each time a charm is upgraded after the new charm
3# contents have been unpacked
4# Best practice suggests you execute the hooks/install and
5# hooks/config-changed to ensure all updates are processed
6set -e
7
8$CHARM_DIR/hooks/install
9$CHARM_DIR/hooks/config-changed
010
=== added file 'telco/precise/clearwater-bono/icon.svg'
--- telco/precise/clearwater-bono/icon.svg 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/icon.svg 2014-11-10 14:55:38 +0000
@@ -0,0 +1,407 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="96"
14 height="96"
15 id="svg6517"
16 version="1.1"
17 inkscape:version="0.48.2 r9819"
18 sodipodi:docname="icon.svg">
19 <defs
20 id="defs6519">
21 <linearGradient
22 id="Background">
23 <stop
24 id="stop4178"
25 offset="0"
26 style="stop-color:#b8b8b8;stop-opacity:1" />
27 <stop
28 id="stop4180"
29 offset="1"
30 style="stop-color:#c9c9c9;stop-opacity:1" />
31 </linearGradient>
32 <filter
33 style="color-interpolation-filters:sRGB;"
34 inkscape:label="Inner Shadow"
35 id="filter1121">
36 <feFlood
37 flood-opacity="0.59999999999999998"
38 flood-color="rgb(0,0,0)"
39 result="flood"
40 id="feFlood1123" />
41 <feComposite
42 in="flood"
43 in2="SourceGraphic"
44 operator="out"
45 result="composite1"
46 id="feComposite1125" />
47 <feGaussianBlur
48 in="composite1"
49 stdDeviation="1"
50 result="blur"
51 id="feGaussianBlur1127" />
52 <feOffset
53 dx="0"
54 dy="2"
55 result="offset"
56 id="feOffset1129" />
57 <feComposite
58 in="offset"
59 in2="SourceGraphic"
60 operator="atop"
61 result="composite2"
62 id="feComposite1131" />
63 </filter>
64 <filter
65 style="color-interpolation-filters:sRGB;"
66 inkscape:label="Drop Shadow"
67 id="filter950">
68 <feFlood
69 flood-opacity="0.25"
70 flood-color="rgb(0,0,0)"
71 result="flood"
72 id="feFlood952" />
73 <feComposite
74 in="flood"
75 in2="SourceGraphic"
76 operator="in"
77 result="composite1"
78 id="feComposite954" />
79 <feGaussianBlur
80 in="composite1"
81 stdDeviation="1"
82 result="blur"
83 id="feGaussianBlur956" />
84 <feOffset
85 dx="0"
86 dy="1"
87 result="offset"
88 id="feOffset958" />
89 <feComposite
90 in="SourceGraphic"
91 in2="offset"
92 operator="over"
93 result="composite2"
94 id="feComposite960" />
95 </filter>
96 <clipPath
97 clipPathUnits="userSpaceOnUse"
98 id="clipPath873">
99 <g
100 transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
101 id="g875"
102 inkscape:label="Layer 1"
103 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
104 <path
105 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
106 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"
107 id="path877"
108 inkscape:connector-curvature="0"
109 sodipodi:nodetypes="sssssssss" />
110 </g>
111 </clipPath>
112 <filter
113 inkscape:collect="always"
114 id="filter891"
115 inkscape:label="Badge Shadow">
116 <feGaussianBlur
117 inkscape:collect="always"
118 stdDeviation="0.71999962"
119 id="feGaussianBlur893" />
120 </filter>
121 </defs>
122 <sodipodi:namedview
123 id="base"
124 pagecolor="#ffffff"
125 bordercolor="#666666"
126 borderopacity="1.0"
127 inkscape:pageopacity="0.0"
128 inkscape:pageshadow="2"
129 inkscape:zoom="1.3995495"
130 inkscape:cx="18.514671"
131 inkscape:cy="49.018169"
132 inkscape:document-units="px"
133 inkscape:current-layer="layer1"
134 showgrid="true"
135 fit-margin-top="0"
136 fit-margin-left="0"
137 fit-margin-right="0"
138 fit-margin-bottom="0"
139 inkscape:window-width="1331"
140 inkscape:window-height="674"
141 inkscape:window-x="19"
142 inkscape:window-y="1"
143 inkscape:window-maximized="0"
144 showborder="true"
145 showguides="true"
146 inkscape:guide-bbox="true"
147 inkscape:showpageshadow="false">
148 <inkscape:grid
149 type="xygrid"
150 id="grid821" />
151 <sodipodi:guide
152 orientation="1,0"
153 position="16,48"
154 id="guide823" />
155 <sodipodi:guide
156 orientation="0,1"
157 position="64,80"
158 id="guide825" />
159 <sodipodi:guide
160 orientation="1,0"
161 position="80,40"
162 id="guide827" />
163 <sodipodi:guide
164 orientation="0,1"
165 position="64,16"
166 id="guide829" />
167 </sodipodi:namedview>
168 <metadata
169 id="metadata6522">
170 <rdf:RDF>
171 <cc:Work
172 rdf:about="">
173 <dc:format>image/svg+xml</dc:format>
174 <dc:type
175 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
176 <dc:title></dc:title>
177 </cc:Work>
178 </rdf:RDF>
179 </metadata>
180 <g
181 inkscape:label="BACKGROUND"
182 inkscape:groupmode="layer"
183 id="layer1"
184 transform="translate(268,-635.29076)"
185 style="display:inline">
186 <path
187 style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
188 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"
189 id="path6455"
190 inkscape:connector-curvature="0"
191 sodipodi:nodetypes="sssssssss" />
192 <image
193 y="633.29077"
194 x="-270"
195 id="image3169"
196 xlink:href="data:image/png;base64,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
325AABJRU5ErkJggg==
326"
327 height="96"
328 width="96"
329 style="stroke:#000000;stroke-opacity:0.18666669" />
330 </g>
331 <g
332 inkscape:groupmode="layer"
333 id="layer3"
334 inkscape:label="PLACE YOUR PICTOGRAM HERE"
335 style="display:inline" />
336 <g
337 inkscape:groupmode="layer"
338 id="layer2"
339 inkscape:label="BADGE"
340 style="display:none"
341 sodipodi:insensitive="true">
342 <g
343 style="display:inline"
344 transform="translate(-340.00001,-581)"
345 id="g4394"
346 clip-path="none">
347 <g
348 id="g855">
349 <g
350 inkscape:groupmode="maskhelper"
351 id="g870"
352 clip-path="url(#clipPath873)"
353 style="opacity:0.6;filter:url(#filter891)">
354 <path
355 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
356 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"
357 sodipodi:ry="12"
358 sodipodi:rx="12"
359 sodipodi:cy="552.36218"
360 sodipodi:cx="252"
361 id="path844"
362 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"
363 sodipodi:type="arc" />
364 </g>
365 <g
366 id="g862">
367 <path
368 sodipodi:type="arc"
369 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"
370 id="path4398"
371 sodipodi:cx="252"
372 sodipodi:cy="552.36218"
373 sodipodi:rx="12"
374 sodipodi:ry="12"
375 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"
376 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
377 <path
378 transform="matrix(1.25,0,0,1.25,33,-100.45273)"
379 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"
380 sodipodi:ry="12"
381 sodipodi:rx="12"
382 sodipodi:cy="552.36218"
383 sodipodi:cx="252"
384 id="path4400"
385 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"
386 sodipodi:type="arc" />
387 <path
388 sodipodi:type="star"
389 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"
390 id="path4459"
391 sodipodi:sides="5"
392 sodipodi:cx="666.19574"
393 sodipodi:cy="589.50385"
394 sodipodi:r1="7.2431178"
395 sodipodi:r2="4.3458705"
396 sodipodi:arg1="1.0471976"
397 sodipodi:arg2="1.6755161"
398 inkscape:flatsided="false"
399 inkscape:rounded="0.1"
400 inkscape:randomized="0"
401 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"
402 transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
403 </g>
404 </g>
405 </g>
406 </g>
407</svg>
0408
=== added directory 'telco/precise/clearwater-bono/lib'
=== added file 'telco/precise/clearwater-bono/lib/chef_solo_install'
--- telco/precise/clearwater-bono/lib/chef_solo_install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/lib/chef_solo_install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,34 @@
1#!/bin/bash
2
3# This covers installing chef-solo and the Clearwater chef recipes
4# Install needed libraries
5apt-get -y install git libxml2-dev libxslt1-dev wget curl
6
7# Install chef
8install_sh="http://opscode.com/chef/install.sh"
9version_string="-v 11.6.0"
10bash <(wget ${install_sh} -O -) ${version_string}
11
12# Pull down the Clearwater chef recipes
13if [ ! -d /home/ubuntu/chef-solo ]
14then
15 mkdir /home/ubuntu/chef-solo
16 git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
17fi
18
19# Update the chef recipes
20cd /home/ubuntu/chef-solo
21git pull origin --recurse-submodules master
22
23# Create the solo.rb file
24cat > /home/ubuntu/chef-solo/solo.rb <<EOP
25file_cache_path "/var/chef-solo"
26cookbook_path [
27 "/home/ubuntu/chef-solo/cookbooks"
28]
29data_bag_path "/home/ubuntu/chef-solo/data_bags"
30environment_path "/home/ubuntu/chef-solo/environments"
31role_path "/home/ubuntu/chef-solo/roles"
32verbose_logging true
33log_level :debug
34EOP
035
=== added file 'telco/precise/clearwater-bono/lib/config_script'
--- telco/precise/clearwater-bono/lib/config_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/lib/config_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,48 @@
1#!/bin/bash
2
3relation_name=$1
4
5set -e
6
7# Defaults
8sprout_hostname=sprout.$(config-get zone)
9hs_hostname=homestead.$(config-get zone):8888
10hs_provisioning_hostname=homestead.$(config-get zone):8889
11xdms_hostname=
12ralf_hostname=
13enum_server=
14
15# Import existing configuration
16[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
17
18# Apply new configuration
19home_domain=$(config-get zone)
20[ "$relation-name" != "scscf" ] || [ "$(relation-get public-address)" = "" ] || sprout_hostname=$(relation-get public-address)
21[ "$relation-name" != "ralf-ctf" ] || [ "$(relation-get public-address)" = "" ] || ralf_hostname=$(relation-get public-address):9888
22sas_server=$(config-get sas)
23local_ip=$($CHARM_DIR/lib/unit-get private-address)
24public_ip=$($CHARM_DIR/lib/unit-get public-address)
25public_hostname=bono-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
26turn_workaround=$(config-get turn_workaround)
27
28# Write configuration back
29mkdir -p /etc/clearwater
30cat >/etc/clearwater/config <<EOF
31# Deployment definitions
32home_domain=$home_domain
33sprout_hostname=$sprout_hostname
34hs_hostname=$hs_hostname
35hs_provisioning_hostname=$hs_provisioning_hostname
36xdms_hostname=$xdms_hostname
37ralf_hostname=$ralf_hostname
38sas_server=$sas_server
39enum_server=$enum_server
40
41# Local IP configuration
42local_ip=$local_ip
43public_ip=$public_ip
44public_hostname=$public_hostname
45
46# Keys
47turn_workaround=$turn_workaround
48EOF
049
=== added file 'telco/precise/clearwater-bono/lib/node_json_script'
--- telco/precise/clearwater-bono/lib/node_json_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/lib/node_json_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,58 @@
1#!/usr/bin/python
2
3import subprocess
4import string
5import socket
6import os
7import argparse
8
9# Create the ~/chef-solo/node.json file.
10#
11# The node.json file contains the machines IP address, the machine ID (a number)
12# and the repo server.
13#
14# If the node is being clustered, the role 'clustered' is added, and after
15# clustering the tag 'clustered' is added (for homer/homestead)
16#
17# The node.json file is templated in lib/node_json_template.
18
19parser = argparse.ArgumentParser()
20
21parser.add_argument('--cluster', action='store_true')
22parser.add_argument('--tag', action='store_true')
23
24args = parser.parse_args()
25
26# Populate the dictionary
27d = {}
28
29d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
30d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
31d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
32d['TRUSTED_PEERS'] = ','.join(['"' + ip + '"' for ip in subprocess.check_output(["config-get", "trusted_peers"]).rstrip().split(',')])
33
34node_file = "/home/ubuntu/chef-solo/node.json"
35if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
36 d['CLUSTER'] = ",\n \"role[clustered]\""
37 d['CLUSTERED'] = ", \"clustered\""
38 d['TAG'] = ""
39
40 if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
41 d['TAG'] = ",\n \"tags\": [\"clustered\"]"
42
43else:
44 d['CLUSTER'] = ""
45 d['CLUSTERED'] = ""
46 d['TAG'] = ""
47
48# Open template file
49charm_dir = os.environ['CHARM_DIR']
50with open( '%s/lib/node_json_template' % charm_dir ) as f:
51 src = string.Template( f.read() )
52
53# Make the substitutions
54result = src.substitute(d)
55
56# Write to ~/chef-solo/node.json
57with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
58 f.write(result)
059
=== added file 'telco/precise/clearwater-bono/lib/node_json_template'
--- telco/precise/clearwater-bono/lib/node_json_template 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/lib/node_json_template 2014-11-10 14:55:38 +0000
@@ -0,0 +1,18 @@
1{
2 "id": "$LOCAL_IP",
3 "name": "$LOCAL_IP",
4 "chef_environment": "_default",
5 "role": "bono",
6 "roles": ["clearwater-infrastructure", "bono"$CLUSTERED],
7 "cloud": {
8 "local_ipv4": "$LOCAL_IP"
9 },
10 "clearwater": {
11 "index": $MACHINE_ID,
12 "repo_server": "$REPO",
13 "trusted_peers": [$TRUSTED_PEERS]
14 },
15 "run_list": [
16 "role[bono]"$CLUSTER
17 ]$TAG
18}
019
=== added file 'telco/precise/clearwater-bono/lib/restart'
--- telco/precise/clearwater-bono/lib/restart 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/lib/restart 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Restart clearwater-infrastructure, and stop bono (to be restarted by monit)
5service clearwater-infrastructure restart
6service bono stop
07
=== added file 'telco/precise/clearwater-bono/lib/unit-get'
--- telco/precise/clearwater-bono/lib/unit-get 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/lib/unit-get 2014-11-10 14:55:38 +0000
@@ -0,0 +1,36 @@
1#!/bin/bash
2set -ex
3onEC2=false
4key=$1
5val=$(unit-get $1)
6
7if [ -f $CHARM_DIR/lib/provider.txt ]
8then
9 PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
10else
11 #checking dirty ec2 hack will work
12 wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
13 if ( "$onEC2" == true )
14 then
15 echo "EC2" > $CHARM_DIR/lib/provider.txt
16 else
17 echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
18 fi
19fi
20
21if [ "$PROVIDER" == "EC2" ]
22then
23 if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
24 then
25 val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
26 elif [ "$key" = "private-address" ]
27 then
28 val_ip=$(dig +short $val | head -1)
29 [ -z "$val_ip" ] || val=$val_ip
30 ##if val_ip is empty getting the system IP
31 [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
32 fi
33fi
34
35echo $val
36
037
=== added file 'telco/precise/clearwater-bono/metadata.yaml'
--- telco/precise/clearwater-bono/metadata.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/metadata.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,15 @@
1name: clearwater-bono
2summary: Bono charm for Project Clearwater
3maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
4description: Bono charm for Project Clearwater
5categories:
6 - misc
7subordinate: false
8requires:
9 programmable-multiple:
10 interface: dns-multi
11 scscf:
12 interface: 3GPP-Mr
13 ralf-ctf:
14 interface: ralf-ctf-interface
15 optional: true
016
=== added file 'telco/precise/clearwater-bono/revision'
--- telco/precise/clearwater-bono/revision 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-bono/revision 2014-11-10 14:55:38 +0000
@@ -0,0 +1,1 @@
11
02
=== added directory 'telco/precise/clearwater-ellis'
=== added file 'telco/precise/clearwater-ellis/README.md'
--- telco/precise/clearwater-ellis/README.md 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/README.md 2014-11-10 14:55:38 +0000
@@ -0,0 +1,90 @@
1# Overview
2
3This charm supports deployment of the Ellis self-provisioning portal for Project Clearwater system. See http://www.projectclearwater.org for more information on Project Clearwater.
4
5# Usage
6
7The 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.
8
9 juju deploy --config config.yaml clearwater-route53
10 juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
11 juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
12 juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
13 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
14 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
15 juju add-relation clearwater-ellis clearwater-route53:register-ellis
16 juju add-relation clearwater-bono clearwater-route53:register-bono
17 juju add-relation clearwater-sprout clearwater-route53:register-sprout
18 juju add-relation clearwater-homestead clearwater-route53:register-homestead
19 juju add-relation clearwater-homer clearwater-route53:register-homer
20 juju expose clearwater-bono
21 juju expose clearwater-ellis
22
23The config.yaml configuration file takes the following format.
24
25 clearwater-route53:
26 zone: <domain>
27 access_key: <ec2 access key>
28 secret_key: <ec2 secret access key>
29 sas: "0.0.0.0"
30
31 clearwater-ellis:
32 smtp_server: smtp.cw-ngv.com
33 smtp_username: username
34 smtp_password: password
35 email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
36 signup_key: secret
37 base_number: "6505550000"
38 number_count: 1000
39 repo: http://repo.cw-ngv.com/stable
40
41 clearwater-bono:
42 turn_workaround: password
43 repo: http://repo.cw-ngv.com/stable
44
45 clearwater-sprout:
46 reg_min_expires: 400
47 session_max_expires: 900
48 repo: http://repo.cw-ngv.com/stable
49
50 clearwater-homestead:
51 repo: http://repo.cw-ngv.com/stable
52
53 clearwater-homer:
54 repo: http://repo.cw-ngv.com/stable
55
56Note that the clearwater-ellis charm can only be deployed on the `amd64` architecture.
57
58## Scale out Usage
59
60Ellis does not currently support scaling out.
61
62## Known Limitations and Issues
63
64The 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.
65
66Note 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.
67
68# Configuration
69
70Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
71
72clearwater-route53
73
74- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
75- `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.
76
77clearwater-ellis
78
79- `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.
80- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
81
82# Contact Information
83
84## Upstream Project Name
85
86See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
87
88Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
89
90The Clearwater mailing list is at lists.projectclearwater.org.
091
=== added file 'telco/precise/clearwater-ellis/config.yaml'
--- telco/precise/clearwater-ellis/config.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/config.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,34 @@
1options:
2 zone:
3 description: The DNS root zone for this service
4 type: string
5 smtp_server:
6 default: ""
7 description: The SMTP server to send password recovery emails from
8 type: string
9 smtp_username:
10 default: ""
11 description: Username to authenticate with the SMTP server
12 type: string
13 smtp_password:
14 default: ""
15 description: Password to authenticate with the SMTP server
16 type: string
17 email_sender:
18 default: ""
19 description: Email address to send recovery emails from
20 type: string
21 signup_key:
22 description: The secret signup key used to create a new account
23 type: string
24 base_number:
25 description: The first number to be allocated in the number range
26 type: string
27 number_count:
28 default: 1
29 description: The count of numbers to allocate
30 type: int
31 repo:
32 default: http://repo.cw-ngv.com/stable
33 description: The location of the repo server
34 type: string
035
=== added file 'telco/precise/clearwater-ellis/copyright'
--- telco/precise/clearwater-ellis/copyright 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/copyright 2014-11-10 14:55:38 +0000
@@ -0,0 +1,31 @@
1Project Clearwater - IMS in the Cloud
2Copyright (C) 2013 Metaswitch Networks Ltd
3
4This program is free software: you can redistribute it and/or modify it
5under the terms of the GNU General Public License as published by the
6Free Software Foundation, either version 3 of the License, or (at your
7option) any later version, along with the "Special Exception" for use of
8the program along with SSL, set forth below. This program is distributed
9in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11A PARTICULAR PURPOSE. See the GNU General Public License for more
12details. You should have received a copy of the GNU General Public
13License along with this program. If not, see
14<http://www.gnu.org/licenses/>.
15
16The author can be reached by email at clearwater@metaswitch.com or by
17post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
18
19Special Exception
20Metaswitch Networks Ltd grants you permission to copy, modify,
21propagate, and distribute a work formed by combining OpenSSL with The
22Software, or a work derivative of such a combination, even if such
23copying, modification, propagation, or distribution would otherwise
24violate the terms of the GPL. You must comply with the GPL in all
25respects for all of the code used other than OpenSSL.
26"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
27Project and licensed under the OpenSSL Licenses, or a work based on such
28software and licensed under the OpenSSL Licenses.
29"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
30under which the OpenSSL Project distributes the OpenSSL toolkit software,
31as those licenses appear in the file LICENSE-OPENSSL.
032
=== added directory 'telco/precise/clearwater-ellis/hooks'
=== added file 'telco/precise/clearwater-ellis/hooks/as-catalog-relation-changed'
--- telco/precise/clearwater-ellis/hooks/as-catalog-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/as-catalog-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,32 @@
1#!/bin/bash
2set -e
3
4AS_JSON=/usr/share/clearwater/ellis/web-content/js/app-servers.json
5TMP_AS_JSON=/tmp/app-servers.json.$$
6
7id=$(cut -d/ -f2 <<< $JUJU_REMOTE_UNIT)
8as_name=$(relation-get as-name)
9as_uri=$(relation-get as-uri)
10
11# If an AS name was specified, create/update a file for the AS. Otherwise delete it.
12if [ "$as_name" != "" ] ; then
13 cat > $AS_JSON.$id <<EOF
14 "$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>",
15EOF
16else
17 rm -f $AS_JSON.$id
18fi
19
20{
21 # Open the JSON body
22 echo {
23 # Concatenate all the AS files,
24 # remove any duplicates (on the first field) and then
25 # remove a comma from the end of the last line.
26 cat $AS_JSON.* 2>/dev/null |
27 sort -k 1,1 -u |
28 sed -e '$ s/,$//'
29 # Close the JSON body
30 echo }
31} > $TMP_AS_JSON
32mv $TMP_AS_JSON $AS_JSON
033
=== added file 'telco/precise/clearwater-ellis/hooks/as-catalog-relation-departed'
--- telco/precise/clearwater-ellis/hooks/as-catalog-relation-departed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/as-catalog-relation-departed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,24 @@
1#!/bin/bash
2set -e
3
4AS_JSON=/usr/share/clearwater/ellis/web-content/js/app-servers.json
5TMP_AS_JSON=/tmp/app-servers.json.$$
6
7id=$(cut -d/ -f2 <<< $JUJU_REMOTE_UNIT)
8
9# Delete the entry for this relation peer.
10rm -f $AS_JSON.$id
11
12{
13 # Open the JSON body
14 echo {
15 # Concatenate all the AS files,
16 # remove any duplicates (on the first field) and then
17 # remove a comma from the end of the last line.
18 cat $AS_JSON.* 2>/dev/null |
19 sort -k 1,1 -u |
20 sed -e '$ s/,$//'
21 # Close the JSON body
22 echo }
23} > $TMP_AS_JSON
24mv $TMP_AS_JSON $AS_JSON
025
=== added file 'telco/precise/clearwater-ellis/hooks/config-changed'
--- telco/precise/clearwater-ellis/hooks/config-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/config-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,14 @@
1#!/bin/bash
2set -e
3
4# Update the /etc/clearwater/config file, the node.json, and re-run
5# chef-solo
6$CHARM_DIR/lib/config_script
7$CHARM_DIR/lib/node_json_script
8chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
9$CHARM_DIR/lib/restart
10
11# Create subscribers
12if [ "$(config-get base_number)" != "" ] ; then
13 /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)"
14fi
015
=== added file 'telco/precise/clearwater-ellis/hooks/homestead-prov-relation-changed'
--- telco/precise/clearwater-ellis/hooks/homestead-prov-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/homestead-prov-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Update Clearwater configuration and restart
5$CHARM_DIR/lib/config_script homestead-hss
6$CHARM_DIR/lib/restart
07
=== added file 'telco/precise/clearwater-ellis/hooks/install'
--- telco/precise/clearwater-ellis/hooks/install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,37 @@
1#!/bin/bash
2
3# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
4# for public-address and private-address. To work-around this, we resolve the
5# host names. However, after we've joined to the DNSaaS charm, we can no longer
6# resolve these, so add them to /etc/hosts.
7if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
8 private_address=$(unit-get private-address)
9 public_address=$(unit-get public-address)
10 private_ip=$($CHARM_DIR/lib/unit-get private-address)
11 public_ip=$($CHARM_DIR/lib/unit-get public-address)
12 [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
13 [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
14 echo "$public_ip ellis-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
15fi
16
17# Install chef solo, and create the node.json and config file
18$CHARM_DIR/lib/chef_solo_install
19$CHARM_DIR/lib/node_json_script
20$CHARM_DIR/lib/config_script
21
22apt-get update
23
24# Install the node
25chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
26
27# Create subscribers
28if [ "$(config-get base_number)" != "" ] ; then
29 /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)"
30fi
31
32# Expose the correct ports
33open-port 22/tcp
34open-port 80/tcp
35open-port 123/udp
36open-port 161/udp
37open-port 443/tcp
038
=== added file 'telco/precise/clearwater-ellis/hooks/programmable-multiple-relation-changed'
--- telco/precise/clearwater-ellis/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,24 @@
1#!/bin/bash
2set -e
3
4# Set our DNS requirements
5TTL=300
6id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
7ip=$($CHARM_DIR/lib/unit-get public-address)
8relation-set domain=$(config-get zone)
9relation-set resources='ellis '$TTL' IN A '$ip'
10ellis-'$id' '$TTL' IN A '$ip
11
12# Update our DNS server
13if [ "$(relation-get public-address)" != "" ]
14then
15 echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
16 grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
17 mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
18 echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
19 service dnsmasq restart
20fi
21
22# Update Clearwater configuration and restart
23$CHARM_DIR/lib/config_script programmable-multiple
24$CHARM_DIR/lib/restart
025
=== added file 'telco/precise/clearwater-ellis/hooks/start'
--- telco/precise/clearwater-ellis/hooks/start 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/start 2014-11-10 14:55:38 +0000
@@ -0,0 +1,16 @@
1#!/bin/bash
2# Here put anything that is needed to start the service.
3# Note that currently this is run directly after install
4# i.e. 'service apache2 start'
5set -e
6
7# This hook needs to be idempotent, so this could be run when ellis is
8# already running, when it's running but not monitored by monit, when
9# it's stopped but being monitored (so it's about to start), or stopped
10# and unmonitored. To cover all these cases, stop monit, start ellis, start
11# monit, then finally have monit monitor ellis
12service monit stop
13service ellis start
14service monit start
15sleep 1
16monit monitor ellis
017
=== added file 'telco/precise/clearwater-ellis/hooks/stop'
--- telco/precise/clearwater-ellis/hooks/stop 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/stop 2014-11-10 14:55:38 +0000
@@ -0,0 +1,12 @@
1#!/bin/bash
2# This will be run when the service is being torn down, allowing you to disable
3# it in various ways..
4# For example, if your web app uses a text file to signal to the load balancer
5# that it is live... you could remove it and sleep for a bit to allow the load
6# balancer to stop sending traffic.
7# rm /srv/webroot/server-live.txt && sleep 30
8set -e
9
10# Stop ellis via monit
11sudo service monit start
12sudo monit stop ellis
013
=== added file 'telco/precise/clearwater-ellis/hooks/upgrade-charm'
--- telco/precise/clearwater-ellis/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2# This hook is executed each time a charm is upgraded after the new charm
3# contents have been unpacked
4# Best practice suggests you execute the hooks/install and
5# hooks/config-changed to ensure all updates are processed
6set -e
7
8$CHARM_DIR/hooks/install
9$CHARM_DIR/hooks/config-changed
010
=== added file 'telco/precise/clearwater-ellis/hooks/xdms-relation-changed'
--- telco/precise/clearwater-ellis/hooks/xdms-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/hooks/xdms-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Update Clearwater configuration and restart
5$CHARM_DIR/lib/config_script xdms
6$CHARM_DIR/lib/restart
07
=== added file 'telco/precise/clearwater-ellis/icon.svg'
--- telco/precise/clearwater-ellis/icon.svg 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/icon.svg 2014-11-10 14:55:38 +0000
@@ -0,0 +1,407 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="96"
14 height="96"
15 id="svg6517"
16 version="1.1"
17 inkscape:version="0.48.2 r9819"
18 sodipodi:docname="icon.svg">
19 <defs
20 id="defs6519">
21 <linearGradient
22 id="Background">
23 <stop
24 id="stop4178"
25 offset="0"
26 style="stop-color:#b8b8b8;stop-opacity:1" />
27 <stop
28 id="stop4180"
29 offset="1"
30 style="stop-color:#c9c9c9;stop-opacity:1" />
31 </linearGradient>
32 <filter
33 style="color-interpolation-filters:sRGB;"
34 inkscape:label="Inner Shadow"
35 id="filter1121">
36 <feFlood
37 flood-opacity="0.59999999999999998"
38 flood-color="rgb(0,0,0)"
39 result="flood"
40 id="feFlood1123" />
41 <feComposite
42 in="flood"
43 in2="SourceGraphic"
44 operator="out"
45 result="composite1"
46 id="feComposite1125" />
47 <feGaussianBlur
48 in="composite1"
49 stdDeviation="1"
50 result="blur"
51 id="feGaussianBlur1127" />
52 <feOffset
53 dx="0"
54 dy="2"
55 result="offset"
56 id="feOffset1129" />
57 <feComposite
58 in="offset"
59 in2="SourceGraphic"
60 operator="atop"
61 result="composite2"
62 id="feComposite1131" />
63 </filter>
64 <filter
65 style="color-interpolation-filters:sRGB;"
66 inkscape:label="Drop Shadow"
67 id="filter950">
68 <feFlood
69 flood-opacity="0.25"
70 flood-color="rgb(0,0,0)"
71 result="flood"
72 id="feFlood952" />
73 <feComposite
74 in="flood"
75 in2="SourceGraphic"
76 operator="in"
77 result="composite1"
78 id="feComposite954" />
79 <feGaussianBlur
80 in="composite1"
81 stdDeviation="1"
82 result="blur"
83 id="feGaussianBlur956" />
84 <feOffset
85 dx="0"
86 dy="1"
87 result="offset"
88 id="feOffset958" />
89 <feComposite
90 in="SourceGraphic"
91 in2="offset"
92 operator="over"
93 result="composite2"
94 id="feComposite960" />
95 </filter>
96 <clipPath
97 clipPathUnits="userSpaceOnUse"
98 id="clipPath873">
99 <g
100 transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
101 id="g875"
102 inkscape:label="Layer 1"
103 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
104 <path
105 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
106 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"
107 id="path877"
108 inkscape:connector-curvature="0"
109 sodipodi:nodetypes="sssssssss" />
110 </g>
111 </clipPath>
112 <filter
113 inkscape:collect="always"
114 id="filter891"
115 inkscape:label="Badge Shadow">
116 <feGaussianBlur
117 inkscape:collect="always"
118 stdDeviation="0.71999962"
119 id="feGaussianBlur893" />
120 </filter>
121 </defs>
122 <sodipodi:namedview
123 id="base"
124 pagecolor="#ffffff"
125 bordercolor="#666666"
126 borderopacity="1.0"
127 inkscape:pageopacity="0.0"
128 inkscape:pageshadow="2"
129 inkscape:zoom="1.3995495"
130 inkscape:cx="18.514671"
131 inkscape:cy="49.018169"
132 inkscape:document-units="px"
133 inkscape:current-layer="layer1"
134 showgrid="true"
135 fit-margin-top="0"
136 fit-margin-left="0"
137 fit-margin-right="0"
138 fit-margin-bottom="0"
139 inkscape:window-width="1331"
140 inkscape:window-height="674"
141 inkscape:window-x="19"
142 inkscape:window-y="1"
143 inkscape:window-maximized="0"
144 showborder="true"
145 showguides="true"
146 inkscape:guide-bbox="true"
147 inkscape:showpageshadow="false">
148 <inkscape:grid
149 type="xygrid"
150 id="grid821" />
151 <sodipodi:guide
152 orientation="1,0"
153 position="16,48"
154 id="guide823" />
155 <sodipodi:guide
156 orientation="0,1"
157 position="64,80"
158 id="guide825" />
159 <sodipodi:guide
160 orientation="1,0"
161 position="80,40"
162 id="guide827" />
163 <sodipodi:guide
164 orientation="0,1"
165 position="64,16"
166 id="guide829" />
167 </sodipodi:namedview>
168 <metadata
169 id="metadata6522">
170 <rdf:RDF>
171 <cc:Work
172 rdf:about="">
173 <dc:format>image/svg+xml</dc:format>
174 <dc:type
175 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
176 <dc:title></dc:title>
177 </cc:Work>
178 </rdf:RDF>
179 </metadata>
180 <g
181 inkscape:label="BACKGROUND"
182 inkscape:groupmode="layer"
183 id="layer1"
184 transform="translate(268,-635.29076)"
185 style="display:inline">
186 <path
187 style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
188 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"
189 id="path6455"
190 inkscape:connector-curvature="0"
191 sodipodi:nodetypes="sssssssss" />
192 <image
193 y="633.29077"
194 x="-270"
195 id="image3169"
196 xlink:href="data:image/png;base64,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
325AABJRU5ErkJggg==
326"
327 height="96"
328 width="96"
329 style="stroke:#000000;stroke-opacity:0.18666669" />
330 </g>
331 <g
332 inkscape:groupmode="layer"
333 id="layer3"
334 inkscape:label="PLACE YOUR PICTOGRAM HERE"
335 style="display:inline" />
336 <g
337 inkscape:groupmode="layer"
338 id="layer2"
339 inkscape:label="BADGE"
340 style="display:none"
341 sodipodi:insensitive="true">
342 <g
343 style="display:inline"
344 transform="translate(-340.00001,-581)"
345 id="g4394"
346 clip-path="none">
347 <g
348 id="g855">
349 <g
350 inkscape:groupmode="maskhelper"
351 id="g870"
352 clip-path="url(#clipPath873)"
353 style="opacity:0.6;filter:url(#filter891)">
354 <path
355 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
356 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"
357 sodipodi:ry="12"
358 sodipodi:rx="12"
359 sodipodi:cy="552.36218"
360 sodipodi:cx="252"
361 id="path844"
362 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"
363 sodipodi:type="arc" />
364 </g>
365 <g
366 id="g862">
367 <path
368 sodipodi:type="arc"
369 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"
370 id="path4398"
371 sodipodi:cx="252"
372 sodipodi:cy="552.36218"
373 sodipodi:rx="12"
374 sodipodi:ry="12"
375 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"
376 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
377 <path
378 transform="matrix(1.25,0,0,1.25,33,-100.45273)"
379 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"
380 sodipodi:ry="12"
381 sodipodi:rx="12"
382 sodipodi:cy="552.36218"
383 sodipodi:cx="252"
384 id="path4400"
385 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"
386 sodipodi:type="arc" />
387 <path
388 sodipodi:type="star"
389 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"
390 id="path4459"
391 sodipodi:sides="5"
392 sodipodi:cx="666.19574"
393 sodipodi:cy="589.50385"
394 sodipodi:r1="7.2431178"
395 sodipodi:r2="4.3458705"
396 sodipodi:arg1="1.0471976"
397 sodipodi:arg2="1.6755161"
398 inkscape:flatsided="false"
399 inkscape:rounded="0.1"
400 inkscape:randomized="0"
401 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"
402 transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
403 </g>
404 </g>
405 </g>
406 </g>
407</svg>
0408
=== added directory 'telco/precise/clearwater-ellis/lib'
=== added file 'telco/precise/clearwater-ellis/lib/chef_solo_install'
--- telco/precise/clearwater-ellis/lib/chef_solo_install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/lib/chef_solo_install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,34 @@
1#!/bin/bash
2
3# This covers installing chef-solo and the Clearwater chef recipes
4# Install needed libraries
5apt-get -y install git libxml2-dev libxslt1-dev wget curl
6
7# Install chef
8install_sh="http://opscode.com/chef/install.sh"
9version_string="-v 11.6.0"
10bash <(wget ${install_sh} -O -) ${version_string}
11
12# Pull down the Clearwater chef recipes
13if [ ! -d /home/ubuntu/chef-solo ]
14then
15 mkdir /home/ubuntu/chef-solo
16 git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
17fi
18
19# Update the chef recipes
20cd /home/ubuntu/chef-solo
21git pull origin --recurse-submodules master
22
23# Create the solo.rb file
24cat > /home/ubuntu/chef-solo/solo.rb <<EOP
25file_cache_path "/var/chef-solo"
26cookbook_path [
27 "/home/ubuntu/chef-solo/cookbooks"
28]
29data_bag_path "/home/ubuntu/chef-solo/data_bags"
30environment_path "/home/ubuntu/chef-solo/environments"
31role_path "/home/ubuntu/chef-solo/roles"
32verbose_logging true
33log_level :debug
34EOP
035
=== added file 'telco/precise/clearwater-ellis/lib/config_script'
--- telco/precise/clearwater-ellis/lib/config_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/lib/config_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,63 @@
1#!/bin/bash
2
3relation_name=$1
4
5set -e
6
7# Defaults
8sprout_hostname=sprout.$(config-get zone)
9hs_hostname=homestead.$(config-get zone):8888
10hs_provisioning_hostname=homestead.$(config-get zone):8889
11xdms_hostname=homer.$(config-get zone):7888
12ralf_hostname=
13sas_server=0.0.0.0
14enum_server=
15ellis_cookie_key=secret
16ellis_api_key=$(hexdump -v -n 15 -e '1/1 "%02x"' /dev/random)
17
18# Import existing configuration
19[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
20
21# Apply new configuration
22home_domain=$(config-get zone)
23[ "$relation-name" != "homestead-hss" ] || [ "$(relation-get public-address)" = "" ] || sprout_hostname=$(relation-get public-address)
24[ "$relation-name" != "xdms" ] || [ "$(relation-get public-address)" = "" ] || xdms_hostname=$(relation-get public-address):9888
25sas_server=$(config-get sas)
26local_ip=$($CHARM_DIR/lib/unit-get private-address)
27public_ip=$($CHARM_DIR/lib/unit-get public-address)
28public_hostname=ellis-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
29smtp_smarthost=$(config-get smtp_server)
30smtp_username=$(config-get smtp_username)
31smtp_password=$(config-get smtp_password)
32email_recovery_sender=$(config-get email_sender)
33signup_key=$(config-get signup_key)
34
35# Write configuration back
36mkdir -p /etc/clearwater
37cat >/etc/clearwater/config <<EOF
38# Deployment definitions
39home_domain=$home_domain
40sprout_hostname=$sprout_hostname
41hs_hostname=$hs_hostname
42hs_provisioning_hostname=$hs_provisioning_hostname
43xdms_hostname=$xdms_hostname
44ralf_hostname=$ralf_hostname
45sas_server=$sas_server
46enum_server=$enum_server
47
48# Local IP configuration
49local_ip=$local_ip
50public_ip=$public_ip
51public_hostname=$public_hostname
52
53# Email server configuration
54smtp_smarthost=$smtp_smarthost
55smtp_username=$smtp_username
56smtp_password=$smtp_password
57email_recovery_sender=$email_recovery_sender
58
59# Keys
60signup_key=$signup_key
61ellis_cookie_key=$ellis_cookie_key
62ellis_api_key=$ellis_api_key
63EOF
064
=== added file 'telco/precise/clearwater-ellis/lib/node_json_script'
--- telco/precise/clearwater-ellis/lib/node_json_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/lib/node_json_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,57 @@
1#!/usr/bin/python
2
3import subprocess
4import string
5import socket
6import os
7import argparse
8
9# Create the ~/chef-solo/node.json file.
10#
11# The node.json file contains the machines IP address, the machine ID (a number)
12# and the repo server.
13#
14# If the node is being clustered, the role 'clustered' is added, and after
15# clustering the tag 'clustered' is added (for homer/homestead)
16#
17# The node.json file is templated in lib/node_json_template.
18
19parser = argparse.ArgumentParser()
20
21parser.add_argument('--cluster', action='store_true')
22parser.add_argument('--tag', action='store_true')
23
24args = parser.parse_args()
25
26# Populate the dictionary
27d = {}
28
29d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
30d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
31d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
32
33node_file = "/home/ubuntu/chef-solo/node.json"
34if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
35 d['CLUSTER'] = ",\n \"role[clustered]\""
36 d['CLUSTERED'] = ", \"clustered\""
37 d['TAG'] = ""
38
39 if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
40 d['TAG'] = ",\n \"tags\": [\"clustered\"]"
41
42else:
43 d['CLUSTER'] = ""
44 d['CLUSTERED'] = ""
45 d['TAG'] = ""
46
47# Open template file
48charm_dir = os.environ['CHARM_DIR']
49with open( '%s/lib/node_json_template' % charm_dir ) as f:
50 src = string.Template( f.read() )
51
52# Make the substitutions
53result = src.substitute(d)
54
55# Write to ~/chef-solo/node.json
56with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
57 f.write(result)
058
=== added file 'telco/precise/clearwater-ellis/lib/node_json_template'
--- telco/precise/clearwater-ellis/lib/node_json_template 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/lib/node_json_template 2014-11-10 14:55:38 +0000
@@ -0,0 +1,22 @@
1{
2 "id": "$LOCAL_IP",
3 "name": "$LOCAL_IP",
4 "chef_environment": "_default",
5 "role": "ellis",
6 "roles": ["clearwater-infrastructure", "ellis"$CLUSTERED],
7 "cloud": {
8 "local_ipv4": "$LOCAL_IP"
9 },
10 "clearwater": {
11 "index": $MACHINE_ID,
12 "repo_server": "$REPO",
13 "number_start": 0,
14 "number_count": 0,
15 "pstn_number_start": 0,
16 "pstn_number_count": 0,
17 "repo_server": "$REPO"
18 },
19 "run_list": [
20 "role[ellis]"$CLUSTER
21 ]$TAG
22}
023
=== added file 'telco/precise/clearwater-ellis/lib/restart'
--- telco/precise/clearwater-ellis/lib/restart 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/lib/restart 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Restart clearwater-infrastructure, and stop ellis (to be restarted by monit)
5service clearwater-infrastructure restart
6service ellis stop
07
=== added file 'telco/precise/clearwater-ellis/lib/unit-get'
--- telco/precise/clearwater-ellis/lib/unit-get 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/lib/unit-get 2014-11-10 14:55:38 +0000
@@ -0,0 +1,36 @@
1#!/bin/bash
2set -ex
3onEC2=false
4key=$1
5val=$(unit-get $1)
6
7if [ -f $CHARM_DIR/lib/provider.txt ]
8then
9 PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
10else
11 #checking dirty ec2 hack will work
12 wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
13 if ( "$onEC2" == true )
14 then
15 echo "EC2" > $CHARM_DIR/lib/provider.txt
16 else
17 echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
18 fi
19fi
20
21if [ "$PROVIDER" == "EC2" ]
22then
23 if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
24 then
25 val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
26 elif [ "$key" = "private-address" ]
27 then
28 val_ip=$(dig +short $val | head -1)
29 [ -z "$val_ip" ] || val=$val_ip
30 ##if val_ip is empty getting the system IP
31 [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
32 fi
33fi
34
35echo $val
36
037
=== added file 'telco/precise/clearwater-ellis/metadata.yaml'
--- telco/precise/clearwater-ellis/metadata.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/metadata.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,17 @@
1name: clearwater-ellis
2summary: Ellis charm for Project Clearwater
3maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
4description: Ellis charm for Project Clearwater
5categories:
6 - misc
7subordinate: false
8requires:
9 programmable-multiple:
10 interface: dns-multi
11 homestead-prov:
12 interface: homestead-prov-interface
13 xdms:
14 interface: 3GPP-Ut
15provides:
16 as-catalog:
17 interface: as-register
018
=== added file 'telco/precise/clearwater-ellis/revision'
--- telco/precise/clearwater-ellis/revision 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ellis/revision 2014-11-10 14:55:38 +0000
@@ -0,0 +1,1 @@
11
02
=== added directory 'telco/precise/clearwater-homer'
=== added file 'telco/precise/clearwater-homer/README.md'
--- telco/precise/clearwater-homer/README.md 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/README.md 2014-11-10 14:55:38 +0000
@@ -0,0 +1,90 @@
1# Overview
2
3This 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.
4
5# Usage
6
7The 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.
8
9 juju deploy --config config.yaml clearwater-route53
10 juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
11 juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
12 juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
13 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
14 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
15 juju add-relation clearwater-ellis clearwater-route53:register-ellis
16 juju add-relation clearwater-bono clearwater-route53:register-bono
17 juju add-relation clearwater-sprout clearwater-route53:register-sprout
18 juju add-relation clearwater-homestead clearwater-route53:register-homestead
19 juju add-relation clearwater-homer clearwater-route53:register-homer
20 juju expose clearwater-bono
21 juju expose clearwater-ellis
22
23The config.yaml configuration file takes the following format.
24
25 clearwater-route53:
26 zone: <domain>
27 access_key: <ec2 access key>
28 secret_key: <ec2 secret access key>
29 sas: "0.0.0.0"
30
31 clearwater-ellis:
32 smtp_server: smtp.cw-ngv.com
33 smtp_username: username
34 smtp_password: password
35 email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
36 signup_key: secret
37 base_number: "6505550000"
38 number_count: 1000
39 repo: http://repo.cw-ngv.com/stable
40
41 clearwater-bono:
42 turn_workaround: password
43 repo: http://repo.cw-ngv.com/stable
44
45 clearwater-sprout:
46 reg_min_expires: 400
47 session_max_expires: 900
48 repo: http://repo.cw-ngv.com/stable
49
50 clearwater-homestead:
51 repo: http://repo.cw-ngv.com/stable
52
53 clearwater-homer:
54 repo: http://repo.cw-ngv.com/stable
55
56Note that the clearwater-homer charm can only be deployed on the `amd64` architecture.
57
58## Scale out Usage
59
60## Known Limitations and Issues
61
62The 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.
63
64clearwater-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.
65
66Note 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.
67
68# Configuration
69
70Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
71
72clearwater-route53
73
74- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
75- `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.
76
77clearwater-ellis
78
79- `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.
80- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
81
82# Contact Information
83
84## Upstream Project Name
85
86See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
87
88Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
89
90The Clearwater mailing list is at lists.projectclearwater.org.
091
=== added file 'telco/precise/clearwater-homer/config.yaml'
--- telco/precise/clearwater-homer/config.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/config.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,8 @@
1options:
2 zone:
3 description: The DNS root zone for this service
4 type: string
5 repo:
6 default: http://repo.cw-ngv.com/stable
7 description: The location of the repo server
8 type: string
09
=== added file 'telco/precise/clearwater-homer/copyright'
--- telco/precise/clearwater-homer/copyright 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/copyright 2014-11-10 14:55:38 +0000
@@ -0,0 +1,31 @@
1Project Clearwater - IMS in the Cloud
2Copyright (C) 2013 Metaswitch Networks Ltd
3
4This program is free software: you can redistribute it and/or modify it
5under the terms of the GNU General Public License as published by the
6Free Software Foundation, either version 3 of the License, or (at your
7option) any later version, along with the "Special Exception" for use of
8the program along with SSL, set forth below. This program is distributed
9in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11A PARTICULAR PURPOSE. See the GNU General Public License for more
12details. You should have received a copy of the GNU General Public
13License along with this program. If not, see
14<http://www.gnu.org/licenses/>.
15
16The author can be reached by email at clearwater@metaswitch.com or by
17post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
18
19Special Exception
20Metaswitch Networks Ltd grants you permission to copy, modify,
21propagate, and distribute a work formed by combining OpenSSL with The
22Software, or a work derivative of such a combination, even if such
23copying, modification, propagation, or distribution would otherwise
24violate the terms of the GPL. You must comply with the GPL in all
25respects for all of the code used other than OpenSSL.
26"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
27Project and licensed under the OpenSSL Licenses, or a work based on such
28software and licensed under the OpenSSL Licenses.
29"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
30under which the OpenSSL Project distributes the OpenSSL toolkit software,
31as those licenses appear in the file LICENSE-OPENSSL.
032
=== added directory 'telco/precise/clearwater-homer/hooks'
=== added file 'telco/precise/clearwater-homer/hooks/config-changed'
--- telco/precise/clearwater-homer/hooks/config-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/config-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2set -e
3
4# Update the /etc/clearwater/config file, the node.json, and re-run
5# chef-solo
6$CHARM_DIR/lib/config_script
7$CHARM_DIR/lib/node_json_script
8chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
9$CHARM_DIR/lib/restart
010
=== added file 'telco/precise/clearwater-homer/hooks/homer-relation-changed'
--- telco/precise/clearwater-homer/hooks/homer-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/homer-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,22 @@
1#!/bin/bash
2set -e
3
4# Get the IP address of this unit and the remote unit
5peer_ip=$(relation-get private-address)
6this_ip=$(unit-get private-address)
7
8# Get the machine number of this unit and the remote unit. This
9# takes the form '<charm name>/<index>
10peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
11this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
12
13# Re-create the node.json files in the data bags
14$CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
15$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
16
17# Re-create the node.json file and re-run chef sole
18$CHARM_DIR/lib/node_json_script --cluster
19chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
20
21# Re-create the node.json with the tag.
22$CHARM_DIR/lib/node_json_script --cluster --tag
023
=== added file 'telco/precise/clearwater-homer/hooks/homer-relation-departed'
--- telco/precise/clearwater-homer/hooks/homer-relation-departed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/homer-relation-departed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,25 @@
1#!/bin/bash
2set -e
3
4# Get the machine number of this unit and the remote unit. This
5# takes the form '<charm name>/<index>
6peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
7this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
8
9if [ $this_index -gt $peer_index ]
10 then
11 # Remove this node. This relation can be called more than once, so check
12 # whether the node has already been decommissioned.
13 decommissioned=$(nodetool netstats | grep DECOMMISSIONED > /dev/null; echo $?)
14 if [[ $decommissioned == 1* ]]
15 then
16 monit stop homer
17 monit unmonitor cassandra
18 nodetool decommission
19 fi
20 else
21 # Remove the node.json in databags that corresponds to the node being removed.
22 file_name="/home/ubuntu/chef-solo/data_bags/node/"$peer_index".json"
23 rm $file_name
24 chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
25fi
026
=== added file 'telco/precise/clearwater-homer/hooks/homer-relation-joined'
--- telco/precise/clearwater-homer/hooks/homer-relation-joined 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/homer-relation-joined 2014-11-10 14:55:38 +0000
@@ -0,0 +1,33 @@
1#!/bin/bash
2set -e
3
4# Get the IP address of this unit and the remote unit
5peer_ip=$(relation-get private-address)
6this_ip=$(unit-get private-address)
7
8# Get the machine number of this unit and the remote unit. This
9# takes the form '<charm name>/<index>
10peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
11this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
12
13# Re-create the node.json files in the data bags. Mark the new
14# node as joining - the new node is the one with the higher index
15if [ $this_index -gt $peer_index ]
16 then
17 $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
18 $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster --joining
19 else
20 $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster --joining
21 $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
22fi
23
24# Re-create the node.json file and re-run chef solo
25$CHARM_DIR/lib/node_json_script --cluster
26chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
27
28# Re-create the node.json with the tag. Only do this for the existing node, not the
29# joining node
30if [ $this_index -lt $peer_index ]
31 then
32 $CHARM_DIR/lib/node_json_script --cluster --tag
33fi
034
=== added file 'telco/precise/clearwater-homer/hooks/install'
--- telco/precise/clearwater-homer/hooks/install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,40 @@
1#!/bin/bash
2set -e
3
4# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
5# for public-address and private-address. To work-around this, we resolve the
6# host names. However, after we've joined to the DNSaaS charm, we can no longer
7# resolve these, so add them to /etc/hosts.
8if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
9 private_address=$(unit-get private-address)
10 public_address=$(unit-get public-address)
11 private_ip=$($CHARM_DIR/lib/unit-get private-address)
12 public_ip=$($CHARM_DIR/lib/unit-get public-address)
13 [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
14 [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
15 echo "$private_ip homer-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
16fi
17
18# Install chef solo
19$CHARM_DIR/lib/chef_solo_install
20
21# Get the ip address and machine number of this unit. The index
22# takes the form '<charm name>/<index>
23this_ip=$(unit-get private-address)
24this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
25
26$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index"
27$CHARM_DIR/lib/node_json_script
28
29# Update the config file
30$CHARM_DIR/lib/config_script
31
32apt-get update
33
34# Install the node
35chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
36
37# Expose the correct ports
38open-port 22/tcp
39open-port 123/udp
40open-port 161/udp
041
=== added file 'telco/precise/clearwater-homer/hooks/programmable-multiple-relation-changed'
--- telco/precise/clearwater-homer/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,24 @@
1#!/bin/bash
2set -e
3
4# Set our DNS requirements
5TTL=300
6id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
7ip=$($CHARM_DIR/lib/unit-get private-address)
8relation-set domain=$(config-get zone)
9relation-set resources='homer '$TTL' IN A '$ip'
10homer-'$id' '$TTL' IN A '$ip
11
12# Update our DNS server
13if [ "$(relation-get public-address)" != "" ]
14then
15 echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
16 grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
17 mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
18 echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
19 service dnsmasq restart
20fi
21
22# Update Clearwater configuration and restart
23$CHARM_DIR/lib/config_script programmable-multiple
24$CHARM_DIR/lib/restart
025
=== added file 'telco/precise/clearwater-homer/hooks/start'
--- telco/precise/clearwater-homer/hooks/start 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/start 2014-11-10 14:55:38 +0000
@@ -0,0 +1,16 @@
1#!/bin/bash
2# Here put anything that is needed to start the service.
3# Note that currently this is run directly after install
4# i.e. 'service apache2 start'
5set -e
6
7# This hook needs to be idempotent, so this could be run when homer is
8# already running, when it's running but not monitored by monit, when
9# it's stopped but being monitored (so it's about to start), or stopped
10# and unmonitored. To cover all these cases, stop monit, start homer, start
11# monit, then finally have monit monitor homer
12service monit stop
13service homer start
14service monit start
15sleep 1
16monit monitor homer
017
=== added file 'telco/precise/clearwater-homer/hooks/stop'
--- telco/precise/clearwater-homer/hooks/stop 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/stop 2014-11-10 14:55:38 +0000
@@ -0,0 +1,12 @@
1#!/bin/bash
2# This will be run when the service is being torn down, allowing you to disable
3# it in various ways..
4# For example, if your web app uses a text file to signal to the load balancer
5# that it is live... you could remove it and sleep for a bit to allow the load
6# balancer to stop sending traffic.
7# rm /srv/webroot/server-live.txt && sleep 30
8set -e
9
10# Stop homer via monit
11sudo service monit start
12sudo monit stop homer
013
=== added file 'telco/precise/clearwater-homer/hooks/upgrade-charm'
--- telco/precise/clearwater-homer/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2# This hook is executed each time a charm is upgraded after the new charm
3# contents have been unpacked
4# Best practice suggests you execute the hooks/install and
5# hooks/config-changed to ensure all updates are processed
6set -e
7
8$CHARM_DIR/hooks/install
9$CHARM_DIR/hooks/config-changed
010
=== added file 'telco/precise/clearwater-homer/hooks/xdms-user-relation-joined'
--- telco/precise/clearwater-homer/hooks/xdms-user-relation-joined 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/hooks/xdms-user-relation-joined 2014-11-10 14:55:38 +0000
@@ -0,0 +1,4 @@
1#!/bin/bash
2set -e
3
4relation-set public-address=homer.$(config-get zone)
05
=== added file 'telco/precise/clearwater-homer/icon.svg'
--- telco/precise/clearwater-homer/icon.svg 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/icon.svg 2014-11-10 14:55:38 +0000
@@ -0,0 +1,407 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="96"
14 height="96"
15 id="svg6517"
16 version="1.1"
17 inkscape:version="0.48.2 r9819"
18 sodipodi:docname="icon.svg">
19 <defs
20 id="defs6519">
21 <linearGradient
22 id="Background">
23 <stop
24 id="stop4178"
25 offset="0"
26 style="stop-color:#b8b8b8;stop-opacity:1" />
27 <stop
28 id="stop4180"
29 offset="1"
30 style="stop-color:#c9c9c9;stop-opacity:1" />
31 </linearGradient>
32 <filter
33 style="color-interpolation-filters:sRGB;"
34 inkscape:label="Inner Shadow"
35 id="filter1121">
36 <feFlood
37 flood-opacity="0.59999999999999998"
38 flood-color="rgb(0,0,0)"
39 result="flood"
40 id="feFlood1123" />
41 <feComposite
42 in="flood"
43 in2="SourceGraphic"
44 operator="out"
45 result="composite1"
46 id="feComposite1125" />
47 <feGaussianBlur
48 in="composite1"
49 stdDeviation="1"
50 result="blur"
51 id="feGaussianBlur1127" />
52 <feOffset
53 dx="0"
54 dy="2"
55 result="offset"
56 id="feOffset1129" />
57 <feComposite
58 in="offset"
59 in2="SourceGraphic"
60 operator="atop"
61 result="composite2"
62 id="feComposite1131" />
63 </filter>
64 <filter
65 style="color-interpolation-filters:sRGB;"
66 inkscape:label="Drop Shadow"
67 id="filter950">
68 <feFlood
69 flood-opacity="0.25"
70 flood-color="rgb(0,0,0)"
71 result="flood"
72 id="feFlood952" />
73 <feComposite
74 in="flood"
75 in2="SourceGraphic"
76 operator="in"
77 result="composite1"
78 id="feComposite954" />
79 <feGaussianBlur
80 in="composite1"
81 stdDeviation="1"
82 result="blur"
83 id="feGaussianBlur956" />
84 <feOffset
85 dx="0"
86 dy="1"
87 result="offset"
88 id="feOffset958" />
89 <feComposite
90 in="SourceGraphic"
91 in2="offset"
92 operator="over"
93 result="composite2"
94 id="feComposite960" />
95 </filter>
96 <clipPath
97 clipPathUnits="userSpaceOnUse"
98 id="clipPath873">
99 <g
100 transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
101 id="g875"
102 inkscape:label="Layer 1"
103 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
104 <path
105 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
106 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"
107 id="path877"
108 inkscape:connector-curvature="0"
109 sodipodi:nodetypes="sssssssss" />
110 </g>
111 </clipPath>
112 <filter
113 inkscape:collect="always"
114 id="filter891"
115 inkscape:label="Badge Shadow">
116 <feGaussianBlur
117 inkscape:collect="always"
118 stdDeviation="0.71999962"
119 id="feGaussianBlur893" />
120 </filter>
121 </defs>
122 <sodipodi:namedview
123 id="base"
124 pagecolor="#ffffff"
125 bordercolor="#666666"
126 borderopacity="1.0"
127 inkscape:pageopacity="0.0"
128 inkscape:pageshadow="2"
129 inkscape:zoom="1.3995495"
130 inkscape:cx="18.514671"
131 inkscape:cy="49.018169"
132 inkscape:document-units="px"
133 inkscape:current-layer="layer1"
134 showgrid="true"
135 fit-margin-top="0"
136 fit-margin-left="0"
137 fit-margin-right="0"
138 fit-margin-bottom="0"
139 inkscape:window-width="1331"
140 inkscape:window-height="674"
141 inkscape:window-x="19"
142 inkscape:window-y="1"
143 inkscape:window-maximized="0"
144 showborder="true"
145 showguides="true"
146 inkscape:guide-bbox="true"
147 inkscape:showpageshadow="false">
148 <inkscape:grid
149 type="xygrid"
150 id="grid821" />
151 <sodipodi:guide
152 orientation="1,0"
153 position="16,48"
154 id="guide823" />
155 <sodipodi:guide
156 orientation="0,1"
157 position="64,80"
158 id="guide825" />
159 <sodipodi:guide
160 orientation="1,0"
161 position="80,40"
162 id="guide827" />
163 <sodipodi:guide
164 orientation="0,1"
165 position="64,16"
166 id="guide829" />
167 </sodipodi:namedview>
168 <metadata
169 id="metadata6522">
170 <rdf:RDF>
171 <cc:Work
172 rdf:about="">
173 <dc:format>image/svg+xml</dc:format>
174 <dc:type
175 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
176 <dc:title></dc:title>
177 </cc:Work>
178 </rdf:RDF>
179 </metadata>
180 <g
181 inkscape:label="BACKGROUND"
182 inkscape:groupmode="layer"
183 id="layer1"
184 transform="translate(268,-635.29076)"
185 style="display:inline">
186 <path
187 style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
188 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"
189 id="path6455"
190 inkscape:connector-curvature="0"
191 sodipodi:nodetypes="sssssssss" />
192 <image
193 y="633.29077"
194 x="-270"
195 id="image3169"
196 xlink:href="data:image/png;base64,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
325AABJRU5ErkJggg==
326"
327 height="96"
328 width="96"
329 style="stroke:#000000;stroke-opacity:0.18666669" />
330 </g>
331 <g
332 inkscape:groupmode="layer"
333 id="layer3"
334 inkscape:label="PLACE YOUR PICTOGRAM HERE"
335 style="display:inline" />
336 <g
337 inkscape:groupmode="layer"
338 id="layer2"
339 inkscape:label="BADGE"
340 style="display:none"
341 sodipodi:insensitive="true">
342 <g
343 style="display:inline"
344 transform="translate(-340.00001,-581)"
345 id="g4394"
346 clip-path="none">
347 <g
348 id="g855">
349 <g
350 inkscape:groupmode="maskhelper"
351 id="g870"
352 clip-path="url(#clipPath873)"
353 style="opacity:0.6;filter:url(#filter891)">
354 <path
355 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
356 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"
357 sodipodi:ry="12"
358 sodipodi:rx="12"
359 sodipodi:cy="552.36218"
360 sodipodi:cx="252"
361 id="path844"
362 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"
363 sodipodi:type="arc" />
364 </g>
365 <g
366 id="g862">
367 <path
368 sodipodi:type="arc"
369 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"
370 id="path4398"
371 sodipodi:cx="252"
372 sodipodi:cy="552.36218"
373 sodipodi:rx="12"
374 sodipodi:ry="12"
375 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"
376 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
377 <path
378 transform="matrix(1.25,0,0,1.25,33,-100.45273)"
379 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"
380 sodipodi:ry="12"
381 sodipodi:rx="12"
382 sodipodi:cy="552.36218"
383 sodipodi:cx="252"
384 id="path4400"
385 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"
386 sodipodi:type="arc" />
387 <path
388 sodipodi:type="star"
389 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"
390 id="path4459"
391 sodipodi:sides="5"
392 sodipodi:cx="666.19574"
393 sodipodi:cy="589.50385"
394 sodipodi:r1="7.2431178"
395 sodipodi:r2="4.3458705"
396 sodipodi:arg1="1.0471976"
397 sodipodi:arg2="1.6755161"
398 inkscape:flatsided="false"
399 inkscape:rounded="0.1"
400 inkscape:randomized="0"
401 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"
402 transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
403 </g>
404 </g>
405 </g>
406 </g>
407</svg>
0408
=== added directory 'telco/precise/clearwater-homer/lib'
=== added file 'telco/precise/clearwater-homer/lib/chef_solo_install'
--- telco/precise/clearwater-homer/lib/chef_solo_install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/chef_solo_install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,34 @@
1#!/bin/bash
2
3# This covers installing chef-solo and the Clearwater chef recipes
4# Install needed libraries
5apt-get -y install git libxml2-dev libxslt1-dev wget curl
6
7# Install chef
8install_sh="http://opscode.com/chef/install.sh"
9version_string="-v 11.6.0"
10bash <(wget ${install_sh} -O -) ${version_string}
11
12# Pull down the Clearwater chef recipes
13if [ ! -d /home/ubuntu/chef-solo ]
14then
15 mkdir /home/ubuntu/chef-solo
16 git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
17fi
18
19# Update the chef recipes
20cd /home/ubuntu/chef-solo
21git pull origin --recurse-submodules master
22
23# Create the solo.rb file
24cat > /home/ubuntu/chef-solo/solo.rb <<EOP
25file_cache_path "/var/chef-solo"
26cookbook_path [
27 "/home/ubuntu/chef-solo/cookbooks"
28]
29data_bag_path "/home/ubuntu/chef-solo/data_bags"
30environment_path "/home/ubuntu/chef-solo/environments"
31role_path "/home/ubuntu/chef-solo/roles"
32verbose_logging true
33log_level :debug
34EOP
035
=== added file 'telco/precise/clearwater-homer/lib/config_script'
--- telco/precise/clearwater-homer/lib/config_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/config_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,43 @@
1#!/bin/bash
2
3relation_name=$1
4
5set -e
6
7# Defaults
8sprout_hostname=sprout.$(config-get zone)
9hs_hostname=homestead.$(config-get zone):8888
10hs_provisioning_hostname=homestead.$(config-get zone):8889
11xdms_hostname=homer.$(config-get zone):7888
12ralf_hostname=
13sas_server=0.0.0.0
14enum_server=
15
16# Import existing configuration
17[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
18
19# Apply new configuration
20home_domain=$(config-get zone)
21sas_server=$(config-get sas)
22local_ip=$($CHARM_DIR/lib/unit-get private-address)
23public_ip=$($CHARM_DIR/lib/unit-get public-address)
24public_hostname=homer-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
25
26# Write configuration back
27mkdir -p /etc/clearwater
28cat >/etc/clearwater/config <<EOF
29# Deployment definitions
30home_domain=$home_domain
31sprout_hostname=$sprout_hostname
32hs_hostname=$hs_hostname
33hs_provisioning_hostname=$hs_provisioning_hostname
34xdms_hostname=$xdms_hostname
35ralf_hostname=$ralf_hostname
36sas_server=$sas_server
37enum_server=$enum_server
38
39# Local IP configuration
40local_ip=$local_ip
41public_ip=$public_ip
42public_hostname=$public_hostname
43EOF
044
=== added file 'telco/precise/clearwater-homer/lib/node_json_clustered_script'
--- telco/precise/clearwater-homer/lib/node_json_clustered_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/node_json_clustered_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,58 @@
1#!/usr/bin/python
2import subprocess
3import string
4import socket
5import os
6import sys
7import argparse
8
9# Create the ~/chef-solo/data_bags/node/<index>.json files.
10#
11# The node.json file contains the machines IP address, the machine ID (a number)
12# and the repo server.
13#
14# If the node is being clustered, the role 'clustered' is added, and if the
15# node is joinging the attribute 'joining' is added
16#
17# The node.json file is templated in lib/node_json_clustered_template.
18
19parser = argparse.ArgumentParser()
20
21parser.add_argument('--cluster', action='store_true')
22parser.add_argument('--joining', action='store_true')
23parser.add_argument('--index', type=int, required=True)
24parser.add_argument('--ip', type=str, required=True)
25
26args = parser.parse_args()
27
28# Populate the dictionary
29d = {}
30
31d['LOCAL_IP'] = socket.gethostbyname(args.ip)
32d['MACHINE_ID'] = str(args.index + 1)
33d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
34
35if args.cluster:
36 d['CLUSTER'] = ",\n \"role[clustered]\""
37 d['CLUSTERED'] = ", \"clustered\""
38else:
39 d['CLUSTER'] = ""
40 d['CLUSTERED'] = ""
41
42if args.joining:
43 d['JOINING'] = ",\n \"joining\": true"
44else:
45 d['JOINING'] = ""
46
47# Open template file
48charm_dir = os.environ['CHARM_DIR']
49with open( '%s/lib/node_json_clustered_template' % charm_dir ) as f:
50 src = string.Template( f.read() )
51
52# Make the substitutions
53result = src.substitute(d)
54
55# Write to ~/chef-solo/data_bags/node/<index>.json
56node_file = str(args.index + 1) + ".json"
57with open('/home/ubuntu/chef-solo/data_bags/node/%s' % node_file, 'w') as f:
58 f.write(result)
059
=== added file 'telco/precise/clearwater-homer/lib/node_json_clustered_template'
--- telco/precise/clearwater-homer/lib/node_json_clustered_template 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/node_json_clustered_template 2014-11-10 14:55:38 +0000
@@ -0,0 +1,20 @@
1{
2 "id": "$LOCAL_IP",
3 "name": "$LOCAL_IP",
4 "chef_environment": "_default",
5 "json_class": "Chef::Node",
6 "automatic": {
7 "role": "homer",
8 "roles": ["clearwater-infrastructure", "homer"$CLUSTERED],
9 "cloud": {
10 "local_ipv4": "$LOCAL_IP"
11 },
12 "clearwater": {
13 "index": $MACHINE_ID$JOINING
14 }
15 },
16 "chef_type": "node",
17 "run_list": [
18 "role[homer]"$CLUSTER
19 ]
20}
021
=== added file 'telco/precise/clearwater-homer/lib/node_json_script'
--- telco/precise/clearwater-homer/lib/node_json_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/node_json_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,57 @@
1#!/usr/bin/python
2
3import subprocess
4import string
5import socket
6import os
7import argparse
8
9# Create the ~/chef-solo/node.json file.
10#
11# The node.json file contains the machines IP address, the machine ID (a number)
12# and the repo server.
13#
14# If the node is being clustered, the role 'clustered' is added, and after
15# clustering the tag 'clustered' is added (for homer/homestead)
16#
17# The node.json file is templated in lib/node_json_template.
18
19parser = argparse.ArgumentParser()
20
21parser.add_argument('--cluster', action='store_true')
22parser.add_argument('--tag', action='store_true')
23
24args = parser.parse_args()
25
26# Populate the dictionary
27d = {}
28
29d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
30d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
31d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
32
33node_file = "/home/ubuntu/chef-solo/node.json"
34if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
35 d['CLUSTER'] = ",\n \"role[clustered]\""
36 d['CLUSTERED'] = ", \"clustered\""
37 d['TAG'] = ""
38
39 if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
40 d['TAG'] = ",\n \"tags\": [\"clustered\"]"
41
42else:
43 d['CLUSTER'] = ""
44 d['CLUSTERED'] = ""
45 d['TAG'] = ""
46
47# Open template file
48charm_dir = os.environ['CHARM_DIR']
49with open( '%s/lib/node_json_template' % charm_dir ) as f:
50 src = string.Template( f.read() )
51
52# Make the substitutions
53result = src.substitute(d)
54
55# Write to ~/chef-solo/node.json
56with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
57 f.write(result)
058
=== added file 'telco/precise/clearwater-homer/lib/node_json_template'
--- telco/precise/clearwater-homer/lib/node_json_template 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/node_json_template 2014-11-10 14:55:38 +0000
@@ -0,0 +1,17 @@
1{
2 "id": "$LOCAL_IP",
3 "name": "$LOCAL_IP",
4 "chef_environment": "_default",
5 "role": "homer",
6 "roles": ["clearwater-infrastructure", "homer"$CLUSTERED],
7 "cloud": {
8 "local_ipv4": "$LOCAL_IP"
9 },
10 "clearwater": {
11 "index": $MACHINE_ID,
12 "repo_server": "$REPO"
13 },
14 "run_list": [
15 "role[homer]"$CLUSTER
16 ]$TAG
17}
018
=== added file 'telco/precise/clearwater-homer/lib/restart'
--- telco/precise/clearwater-homer/lib/restart 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/restart 2014-11-10 14:55:38 +0000
@@ -0,0 +1,6 @@
1#!/bin/bash
2set -e
3
4# Restart clearwater-infrastructure, and stop homer (to be restarted by monit)
5service clearwater-infrastructure restart
6service homer stop
07
=== added file 'telco/precise/clearwater-homer/lib/unit-get'
--- telco/precise/clearwater-homer/lib/unit-get 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/lib/unit-get 2014-11-10 14:55:38 +0000
@@ -0,0 +1,36 @@
1#!/bin/bash
2set -ex
3onEC2=false
4key=$1
5val=$(unit-get $1)
6
7if [ -f $CHARM_DIR/lib/provider.txt ]
8then
9 PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
10else
11 #checking dirty ec2 hack will work
12 wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
13 if ( "$onEC2" == true )
14 then
15 echo "EC2" > $CHARM_DIR/lib/provider.txt
16 else
17 echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
18 fi
19fi
20
21if [ "$PROVIDER" == "EC2" ]
22then
23 if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
24 then
25 val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
26 elif [ "$key" = "private-address" ]
27 then
28 val_ip=$(dig +short $val | head -1)
29 [ -z "$val_ip" ] || val=$val_ip
30 ##if val_ip is empty getting the system IP
31 [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
32 fi
33fi
34
35echo $val
36
037
=== added file 'telco/precise/clearwater-homer/metadata.yaml'
--- telco/precise/clearwater-homer/metadata.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/metadata.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,16 @@
1name: clearwater-homer
2summary: Homer charm for Project Clearwater
3maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
4description: Homer charm for Project Clearwater
5categories:
6 - misc
7subordinate: false
8requires:
9 programmable-multiple:
10 interface: dns-multi
11provides:
12 xdms-user:
13 interface: 3GPP-Ut
14peers:
15 homer:
16 interface: homer-interface
017
=== added file 'telco/precise/clearwater-homer/revision'
--- telco/precise/clearwater-homer/revision 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homer/revision 2014-11-10 14:55:38 +0000
@@ -0,0 +1,1 @@
11
02
=== added directory 'telco/precise/clearwater-homestead'
=== added file 'telco/precise/clearwater-homestead/README.md'
--- telco/precise/clearwater-homestead/README.md 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/README.md 2014-11-10 14:55:38 +0000
@@ -0,0 +1,90 @@
1# Overview
2
3This 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.
4
5# Usage
6
7The 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.
8
9 juju deploy --config config.yaml clearwater-route53
10 juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
11 juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
12 juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
13 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
14 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
15 juju add-relation clearwater-ellis clearwater-route53:register-ellis
16 juju add-relation clearwater-bono clearwater-route53:register-bono
17 juju add-relation clearwater-sprout clearwater-route53:register-sprout
18 juju add-relation clearwater-homestead clearwater-route53:register-homestead
19 juju add-relation clearwater-homer clearwater-route53:register-homer
20 juju expose clearwater-bono
21 juju expose clearwater-ellis
22
23The config.yaml configuration file takes the following format.
24
25 clearwater-route53:
26 zone: <domain>
27 access_key: <ec2 access key>
28 secret_key: <ec2 secret access key>
29 sas: "0.0.0.0"
30
31 clearwater-ellis:
32 smtp_server: smtp.cw-ngv.com
33 smtp_username: username
34 smtp_password: password
35 email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
36 signup_key: secret
37 base_number: "6505550000"
38 number_count: 1000
39 repo: http://repo.cw-ngv.com/stable
40
41 clearwater-bono:
42 turn_workaround: password
43 repo: http://repo.cw-ngv.com/stable
44
45 clearwater-sprout:
46 reg_min_expires: 400
47 session_max_expires: 900
48 repo: http://repo.cw-ngv.com/stable
49
50 clearwater-homestead:
51 repo: http://repo.cw-ngv.com/stable
52
53 clearwater-homer:
54 repo: http://repo.cw-ngv.com/stable
55
56Note that the clearwater-homestead charm can only be deployed on the `amd64` architecture.
57
58## Scale out Usage
59
60## Known Limitations and Issues
61
62The 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.
63
64clearwater-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.
65
66Note 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.
67
68# Configuration
69
70Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
71
72clearwater-route53
73
74- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
75- `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.
76
77clearwater-ellis
78
79- `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.
80- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
81
82# Contact Information
83
84## Upstream Project Name
85
86See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
87
88Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
89
90The Clearwater mailing list is at lists.projectclearwater.org.
091
=== added file 'telco/precise/clearwater-homestead/config.yaml'
--- telco/precise/clearwater-homestead/config.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/config.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,12 @@
1options:
2 zone:
3 description: The DNS root zone for this service
4 type: string
5 sas:
6 default: ""
7 description: The location of the SAS server
8 type: string
9 repo:
10 default: http://repo.cw-ngv.com/stable
11 description: The location of the repo server
12 type: string
013
=== added file 'telco/precise/clearwater-homestead/copyright'
--- telco/precise/clearwater-homestead/copyright 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/copyright 2014-11-10 14:55:38 +0000
@@ -0,0 +1,31 @@
1Project Clearwater - IMS in the Cloud
2Copyright (C) 2013 Metaswitch Networks Ltd
3
4This program is free software: you can redistribute it and/or modify it
5under the terms of the GNU General Public License as published by the
6Free Software Foundation, either version 3 of the License, or (at your
7option) any later version, along with the "Special Exception" for use of
8the program along with SSL, set forth below. This program is distributed
9in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11A PARTICULAR PURPOSE. See the GNU General Public License for more
12details. You should have received a copy of the GNU General Public
13License along with this program. If not, see
14<http://www.gnu.org/licenses/>.
15
16The author can be reached by email at clearwater@metaswitch.com or by
17post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
18
19Special Exception
20Metaswitch Networks Ltd grants you permission to copy, modify,
21propagate, and distribute a work formed by combining OpenSSL with The
22Software, or a work derivative of such a combination, even if such
23copying, modification, propagation, or distribution would otherwise
24violate the terms of the GPL. You must comply with the GPL in all
25respects for all of the code used other than OpenSSL.
26"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
27Project and licensed under the OpenSSL Licenses, or a work based on such
28software and licensed under the OpenSSL Licenses.
29"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
30under which the OpenSSL Project distributes the OpenSSL toolkit software,
31as those licenses appear in the file LICENSE-OPENSSL.
032
=== added directory 'telco/precise/clearwater-homestead/hooks'
=== added file 'telco/precise/clearwater-homestead/hooks/config-changed'
--- telco/precise/clearwater-homestead/hooks/config-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/config-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2set -e
3
4# Update the /etc/clearwater/config file, the node.json, and re-run
5# chef-solo
6$CHARM_DIR/lib/config_script
7$CHARM_DIR/lib/node_json_script
8chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
9$CHARM_DIR/lib/restart
010
=== added file 'telco/precise/clearwater-homestead/hooks/homestead-cscf-relation-joined'
--- telco/precise/clearwater-homestead/hooks/homestead-cscf-relation-joined 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/homestead-cscf-relation-joined 2014-11-10 14:55:38 +0000
@@ -0,0 +1,4 @@
1#!/bin/bash
2set -e
3
4relation-set public-address=homestead.$(config-get zone)
05
=== added file 'telco/precise/clearwater-homestead/hooks/homestead-prov-user-relation-joined'
--- telco/precise/clearwater-homestead/hooks/homestead-prov-user-relation-joined 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/homestead-prov-user-relation-joined 2014-11-10 14:55:38 +0000
@@ -0,0 +1,4 @@
1#!/bin/bash
2set -e
3
4relation-set public-address=homestead.$(config-get zone)
05
=== added file 'telco/precise/clearwater-homestead/hooks/homestead-relation-changed'
--- telco/precise/clearwater-homestead/hooks/homestead-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/homestead-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,22 @@
1#!/bin/bash
2set -e
3
4# Get the IP address of this unit and the remote unit
5peer_ip=$(relation-get private-address)
6this_ip=$(unit-get private-address)
7
8# Get the machine number of this unit and the remote unit. This
9# takes the form '<charm name>/<index>
10peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
11this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
12
13# Re-create the node.json files in the data bags
14$CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
15$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
16
17# Re-create the node.json file and re-run chef sole
18$CHARM_DIR/lib/node_json_script --cluster
19chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
20
21# Re-create the node.json with the tag.
22$CHARM_DIR/lib/node_json_script --cluster --tag
023
=== added file 'telco/precise/clearwater-homestead/hooks/homestead-relation-departed'
--- telco/precise/clearwater-homestead/hooks/homestead-relation-departed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/homestead-relation-departed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,25 @@
1#!/bin/bash
2set -e
3
4# Get the machine number of this unit and the remote unit. This
5# takes the form '<charm name>/<index>
6peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
7this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
8
9if [ $this_index -gt $peer_index ]
10 then
11 # Remove this node. This relation can be called more than once, so check
12 # whether the node has already been decommissioned.
13 decommissioned=$(nodetool netstats | grep DECOMMISSIONED > /dev/null; echo $?)
14 if [[ $decommissioned == 1* ]]
15 then
16 monit stop homestead
17 monit unmonitor cassandra
18 nodetool decommission
19 fi
20 else
21 # Remove the node.json in databags that corresponds to the node being removed.
22 file_name="/home/ubuntu/chef-solo/data_bags/node/"$peer_index".json"
23 rm $file_name
24 chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
25fi
026
=== added file 'telco/precise/clearwater-homestead/hooks/homestead-relation-joined'
--- telco/precise/clearwater-homestead/hooks/homestead-relation-joined 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/homestead-relation-joined 2014-11-10 14:55:38 +0000
@@ -0,0 +1,33 @@
1#!/bin/bash
2set -e
3
4# Get the IP address of this unit and the remote unit
5peer_ip=$(relation-get private-address)
6this_ip=$(unit-get private-address)
7
8# Get the machine number of this unit and the remote unit. This
9# takes the form '<charm name>/<index>
10peer_index=$(echo $JUJU_REMOTE_UNIT | cut -d'/' -f2)
11this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
12
13# Re-create the node.json files in the data bags. Mark the new
14# node as joining - the new node is the one with the higher index
15if [ $this_index -gt $peer_index ]
16 then
17 $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster
18 $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster --joining
19 else
20 $CHARM_DIR/lib/node_json_clustered_script --ip "$peer_ip" --index "$peer_index" --cluster --joining
21 $CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index" --cluster
22fi
23
24# Re-create the node.json file and re-run chef solo
25$CHARM_DIR/lib/node_json_script --cluster
26chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
27
28# Re-create the node.json with the tag. Only do this for the existing node, not the
29# joining node
30if [ $this_index -lt $peer_index ]
31 then
32 $CHARM_DIR/lib/node_json_script --cluster --tag
33fi
034
=== added file 'telco/precise/clearwater-homestead/hooks/install'
--- telco/precise/clearwater-homestead/hooks/install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,37 @@
1#!/bin/bash
2set -e
3
4# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
5# for public-address and private-address. To work-around this, we resolve the
6# host names. However, after we've joined to the DNSaaS charm, we can no longer
7# resolve these, so add them to /etc/hosts.
8if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
9 private_address=$(unit-get private-address)
10 public_address=$(unit-get public-address)
11 private_ip=$($CHARM_DIR/lib/unit-get private-address)
12 public_ip=$($CHARM_DIR/lib/unit-get public-address)
13 [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
14 [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
15 echo "$private_ip homestead-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
16fi
17
18# Install chef solo
19$CHARM_DIR/lib/chef_solo_install
20
21this_ip=$(unit-get private-address)
22this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
23$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index"
24$CHARM_DIR/lib/node_json_script
25
26# Update the config file
27$CHARM_DIR/lib/config_script
28
29apt-get update
30
31# Install the node
32chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
33
34# Expose the correct ports
35open-port 22/tcp
36open-port 123/udp
37open-port 161/udp
038
=== added file 'telco/precise/clearwater-homestead/hooks/programmable-multiple-relation-changed'
--- telco/precise/clearwater-homestead/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,24 @@
1#!/bin/bash
2set -e
3
4# Set our DNS requirements
5TTL=300
6id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
7ip=$($CHARM_DIR/lib/unit-get private-address)
8relation-set domain=$(config-get zone)
9relation-set resources='homestead '$TTL' IN A '$ip'
10homestead-'$id' '$TTL' IN A '$ip
11
12# Update our DNS server
13if [ "$(relation-get public-address)" != "" ]
14then
15 echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
16 grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
17 mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
18 echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
19 service dnsmasq restart
20fi
21
22# Update Clearwater configuration and restart
23$CHARM_DIR/lib/config_script programmable-multiple
24$CHARM_DIR/lib/restart
025
=== added file 'telco/precise/clearwater-homestead/hooks/start'
--- telco/precise/clearwater-homestead/hooks/start 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/start 2014-11-10 14:55:38 +0000
@@ -0,0 +1,18 @@
1#!/bin/bash
2# Here put anything that is needed to start the service.
3# Note that currently this is run directly after install
4# i.e. 'service apache2 start'
5set -e
6
7# This hook needs to be idempotent, so this could be run when homestead is
8# already running, when it's running but not monitored by monit, when
9# it's stopped but being monitored (so it's about to start), or stopped
10# and unmonitored. To cover all these cases, stop monit, start homestead, start
11# monit, then finally have monit monitor homestead
12service monit stop
13service homestead start
14service homestead-prov start
15service monit start
16sleep 1
17monit monitor homestead
18monit monitor homestead-prov
019
=== added file 'telco/precise/clearwater-homestead/hooks/stop'
--- telco/precise/clearwater-homestead/hooks/stop 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/stop 2014-11-10 14:55:38 +0000
@@ -0,0 +1,13 @@
1#!/bin/bash
2# This will be run when the service is being torn down, allowing you to disable
3# it in various ways..
4# For example, if your web app uses a text file to signal to the load balancer
5# that it is live... you could remove it and sleep for a bit to allow the load
6# balancer to stop sending traffic.
7# rm /srv/webroot/server-live.txt && sleep 30
8set -e
9
10# Stop homestead via monit
11service monit start
12monit stop homestead
13monit stop homestead-prov
014
=== added file 'telco/precise/clearwater-homestead/hooks/upgrade-charm'
--- telco/precise/clearwater-homestead/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2# This hook is executed each time a charm is upgraded after the new charm
3# contents have been unpacked
4# Best practice suggests you execute the hooks/install and
5# hooks/config-changed to ensure all updates are processed
6set -e
7
8$CHARM_DIR/hooks/install
9$CHARM_DIR/hooks/config-changed
010
=== added file 'telco/precise/clearwater-homestead/icon.svg'
--- telco/precise/clearwater-homestead/icon.svg 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/icon.svg 2014-11-10 14:55:38 +0000
@@ -0,0 +1,407 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="96"
14 height="96"
15 id="svg6517"
16 version="1.1"
17 inkscape:version="0.48.2 r9819"
18 sodipodi:docname="icon.svg">
19 <defs
20 id="defs6519">
21 <linearGradient
22 id="Background">
23 <stop
24 id="stop4178"
25 offset="0"
26 style="stop-color:#b8b8b8;stop-opacity:1" />
27 <stop
28 id="stop4180"
29 offset="1"
30 style="stop-color:#c9c9c9;stop-opacity:1" />
31 </linearGradient>
32 <filter
33 style="color-interpolation-filters:sRGB;"
34 inkscape:label="Inner Shadow"
35 id="filter1121">
36 <feFlood
37 flood-opacity="0.59999999999999998"
38 flood-color="rgb(0,0,0)"
39 result="flood"
40 id="feFlood1123" />
41 <feComposite
42 in="flood"
43 in2="SourceGraphic"
44 operator="out"
45 result="composite1"
46 id="feComposite1125" />
47 <feGaussianBlur
48 in="composite1"
49 stdDeviation="1"
50 result="blur"
51 id="feGaussianBlur1127" />
52 <feOffset
53 dx="0"
54 dy="2"
55 result="offset"
56 id="feOffset1129" />
57 <feComposite
58 in="offset"
59 in2="SourceGraphic"
60 operator="atop"
61 result="composite2"
62 id="feComposite1131" />
63 </filter>
64 <filter
65 style="color-interpolation-filters:sRGB;"
66 inkscape:label="Drop Shadow"
67 id="filter950">
68 <feFlood
69 flood-opacity="0.25"
70 flood-color="rgb(0,0,0)"
71 result="flood"
72 id="feFlood952" />
73 <feComposite
74 in="flood"
75 in2="SourceGraphic"
76 operator="in"
77 result="composite1"
78 id="feComposite954" />
79 <feGaussianBlur
80 in="composite1"
81 stdDeviation="1"
82 result="blur"
83 id="feGaussianBlur956" />
84 <feOffset
85 dx="0"
86 dy="1"
87 result="offset"
88 id="feOffset958" />
89 <feComposite
90 in="SourceGraphic"
91 in2="offset"
92 operator="over"
93 result="composite2"
94 id="feComposite960" />
95 </filter>
96 <clipPath
97 clipPathUnits="userSpaceOnUse"
98 id="clipPath873">
99 <g
100 transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
101 id="g875"
102 inkscape:label="Layer 1"
103 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
104 <path
105 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
106 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"
107 id="path877"
108 inkscape:connector-curvature="0"
109 sodipodi:nodetypes="sssssssss" />
110 </g>
111 </clipPath>
112 <filter
113 inkscape:collect="always"
114 id="filter891"
115 inkscape:label="Badge Shadow">
116 <feGaussianBlur
117 inkscape:collect="always"
118 stdDeviation="0.71999962"
119 id="feGaussianBlur893" />
120 </filter>
121 </defs>
122 <sodipodi:namedview
123 id="base"
124 pagecolor="#ffffff"
125 bordercolor="#666666"
126 borderopacity="1.0"
127 inkscape:pageopacity="0.0"
128 inkscape:pageshadow="2"
129 inkscape:zoom="1.3995495"
130 inkscape:cx="18.514671"
131 inkscape:cy="49.018169"
132 inkscape:document-units="px"
133 inkscape:current-layer="layer1"
134 showgrid="true"
135 fit-margin-top="0"
136 fit-margin-left="0"
137 fit-margin-right="0"
138 fit-margin-bottom="0"
139 inkscape:window-width="1331"
140 inkscape:window-height="674"
141 inkscape:window-x="19"
142 inkscape:window-y="1"
143 inkscape:window-maximized="0"
144 showborder="true"
145 showguides="true"
146 inkscape:guide-bbox="true"
147 inkscape:showpageshadow="false">
148 <inkscape:grid
149 type="xygrid"
150 id="grid821" />
151 <sodipodi:guide
152 orientation="1,0"
153 position="16,48"
154 id="guide823" />
155 <sodipodi:guide
156 orientation="0,1"
157 position="64,80"
158 id="guide825" />
159 <sodipodi:guide
160 orientation="1,0"
161 position="80,40"
162 id="guide827" />
163 <sodipodi:guide
164 orientation="0,1"
165 position="64,16"
166 id="guide829" />
167 </sodipodi:namedview>
168 <metadata
169 id="metadata6522">
170 <rdf:RDF>
171 <cc:Work
172 rdf:about="">
173 <dc:format>image/svg+xml</dc:format>
174 <dc:type
175 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
176 <dc:title></dc:title>
177 </cc:Work>
178 </rdf:RDF>
179 </metadata>
180 <g
181 inkscape:label="BACKGROUND"
182 inkscape:groupmode="layer"
183 id="layer1"
184 transform="translate(268,-635.29076)"
185 style="display:inline">
186 <path
187 style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
188 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"
189 id="path6455"
190 inkscape:connector-curvature="0"
191 sodipodi:nodetypes="sssssssss" />
192 <image
193 y="633.29077"
194 x="-270"
195 id="image3169"
196 xlink:href="data:image/png;base64,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
325AABJRU5ErkJggg==
326"
327 height="96"
328 width="96"
329 style="stroke:#000000;stroke-opacity:0.18666669" />
330 </g>
331 <g
332 inkscape:groupmode="layer"
333 id="layer3"
334 inkscape:label="PLACE YOUR PICTOGRAM HERE"
335 style="display:inline" />
336 <g
337 inkscape:groupmode="layer"
338 id="layer2"
339 inkscape:label="BADGE"
340 style="display:none"
341 sodipodi:insensitive="true">
342 <g
343 style="display:inline"
344 transform="translate(-340.00001,-581)"
345 id="g4394"
346 clip-path="none">
347 <g
348 id="g855">
349 <g
350 inkscape:groupmode="maskhelper"
351 id="g870"
352 clip-path="url(#clipPath873)"
353 style="opacity:0.6;filter:url(#filter891)">
354 <path
355 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
356 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"
357 sodipodi:ry="12"
358 sodipodi:rx="12"
359 sodipodi:cy="552.36218"
360 sodipodi:cx="252"
361 id="path844"
362 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"
363 sodipodi:type="arc" />
364 </g>
365 <g
366 id="g862">
367 <path
368 sodipodi:type="arc"
369 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"
370 id="path4398"
371 sodipodi:cx="252"
372 sodipodi:cy="552.36218"
373 sodipodi:rx="12"
374 sodipodi:ry="12"
375 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"
376 transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
377 <path
378 transform="matrix(1.25,0,0,1.25,33,-100.45273)"
379 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"
380 sodipodi:ry="12"
381 sodipodi:rx="12"
382 sodipodi:cy="552.36218"
383 sodipodi:cx="252"
384 id="path4400"
385 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"
386 sodipodi:type="arc" />
387 <path
388 sodipodi:type="star"
389 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"
390 id="path4459"
391 sodipodi:sides="5"
392 sodipodi:cx="666.19574"
393 sodipodi:cy="589.50385"
394 sodipodi:r1="7.2431178"
395 sodipodi:r2="4.3458705"
396 sodipodi:arg1="1.0471976"
397 sodipodi:arg2="1.6755161"
398 inkscape:flatsided="false"
399 inkscape:rounded="0.1"
400 inkscape:randomized="0"
401 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"
402 transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
403 </g>
404 </g>
405 </g>
406 </g>
407</svg>
0408
=== added directory 'telco/precise/clearwater-homestead/lib'
=== added file 'telco/precise/clearwater-homestead/lib/chef_solo_install'
--- telco/precise/clearwater-homestead/lib/chef_solo_install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/chef_solo_install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,34 @@
1#!/bin/bash
2
3# This covers installing chef-solo and the Clearwater chef recipes
4# Install needed libraries
5apt-get -y install git libxml2-dev libxslt1-dev wget curl
6
7# Install chef
8install_sh="http://opscode.com/chef/install.sh"
9version_string="-v 11.6.0"
10bash <(wget ${install_sh} -O -) ${version_string}
11
12# Pull down the Clearwater chef recipes
13if [ ! -d /home/ubuntu/chef-solo ]
14then
15 mkdir /home/ubuntu/chef-solo
16 git clone --recursive -b master git://github.com/Metaswitch/chef.git /home/ubuntu/chef-solo
17fi
18
19# Update the chef recipes
20cd /home/ubuntu/chef-solo
21git pull origin --recurse-submodules master
22
23# Create the solo.rb file
24cat > /home/ubuntu/chef-solo/solo.rb <<EOP
25file_cache_path "/var/chef-solo"
26cookbook_path [
27 "/home/ubuntu/chef-solo/cookbooks"
28]
29data_bag_path "/home/ubuntu/chef-solo/data_bags"
30environment_path "/home/ubuntu/chef-solo/environments"
31role_path "/home/ubuntu/chef-solo/roles"
32verbose_logging true
33log_level :debug
34EOP
035
=== added file 'telco/precise/clearwater-homestead/lib/config_script'
--- telco/precise/clearwater-homestead/lib/config_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/config_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,43 @@
1#!/bin/bash
2
3relation_name=$1
4
5set -e
6
7# Defaults
8sprout_hostname=sprout.$(config-get zone)
9hs_hostname=homestead.$(config-get zone):8888
10hs_provisioning_hostname=homestead.$(config-get zone):8889
11xdms_hostname=homer.$(config-get zone):7888
12ralf_hostname=
13sas_server=0.0.0.0
14enum_server=
15
16# Import existing configuration
17[ ! -f /etc/clearwater/config ] || . /etc/clearwater/config
18
19# Apply new configuration
20home_domain=$(config-get zone)
21sas_server=$(config-get sas)
22local_ip=$($CHARM_DIR/lib/unit-get private-address)
23public_ip=$($CHARM_DIR/lib/unit-get public-address)
24public_hostname=homestead-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone)
25
26# Write configuration back
27mkdir -p /etc/clearwater
28cat >/etc/clearwater/config <<EOF
29# Deployment definitions
30home_domain=$home_domain
31sprout_hostname=$sprout_hostname
32hs_hostname=$hs_hostname
33hs_provisioning_hostname=$hs_provisioning_hostname
34xdms_hostname=$xdms_hostname
35ralf_hostname=$ralf_hostname
36sas_server=$sas_server
37enum_server=$enum_server
38
39# Local IP configuration
40local_ip=$local_ip
41public_ip=$public_ip
42public_hostname=$public_hostname
43EOF
044
=== added file 'telco/precise/clearwater-homestead/lib/node_json_clustered_script'
--- telco/precise/clearwater-homestead/lib/node_json_clustered_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/node_json_clustered_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,58 @@
1#!/usr/bin/python
2import subprocess
3import string
4import socket
5import os
6import sys
7import argparse
8
9# Create the ~/chef-solo/data_bags/node/<index>.json files.
10#
11# The node.json file contains the machines IP address, the machine ID (a number)
12# and the repo server.
13#
14# If the node is being clustered, the role 'clustered' is added, and if the
15# node is joinging the attribute 'joining' is added
16#
17# The node.json file is templated in lib/node_json_clustered_template.
18
19parser = argparse.ArgumentParser()
20
21parser.add_argument('--cluster', action='store_true')
22parser.add_argument('--joining', action='store_true')
23parser.add_argument('--index', type=int, required=True)
24parser.add_argument('--ip', type=str, required=True)
25
26args = parser.parse_args()
27
28# Populate the dictionary
29d = {}
30
31d['LOCAL_IP'] = socket.gethostbyname(args.ip)
32d['MACHINE_ID'] = str(args.index + 1)
33d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
34
35if args.cluster:
36 d['CLUSTER'] = ",\n \"role[clustered]\""
37 d['CLUSTERED'] = ", \"clustered\""
38else:
39 d['CLUSTER'] = ""
40 d['CLUSTERED'] = ""
41
42if args.joining:
43 d['JOINING'] = ",\n \"joining\": true"
44else:
45 d['JOINING'] = ""
46
47# Open template file
48charm_dir = os.environ['CHARM_DIR']
49with open( '%s/lib/node_json_clustered_template' % charm_dir ) as f:
50 src = string.Template( f.read() )
51
52# Make the substitutions
53result = src.substitute(d)
54
55# Write to ~/chef-solo/data_bags/node/<index>.json
56node_file = str(args.index + 1) + ".json"
57with open('/home/ubuntu/chef-solo/data_bags/node/%s' % node_file, 'w') as f:
58 f.write(result)
059
=== added file 'telco/precise/clearwater-homestead/lib/node_json_clustered_template'
--- telco/precise/clearwater-homestead/lib/node_json_clustered_template 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/node_json_clustered_template 2014-11-10 14:55:38 +0000
@@ -0,0 +1,20 @@
1{
2 "id": "$LOCAL_IP",
3 "name": "$LOCAL_IP",
4 "chef_environment": "_default",
5 "json_class": "Chef::Node",
6 "automatic": {
7 "role": "homestead",
8 "roles": ["clearwater-infrastructure", "homestead"$CLUSTERED],
9 "cloud": {
10 "local_ipv4": "$LOCAL_IP"
11 },
12 "clearwater": {
13 "index": $MACHINE_ID$JOINING
14 }
15 },
16 "chef_type": "node",
17 "run_list": [
18 "role[homestead]"$CLUSTER
19 ]
20}
021
=== added file 'telco/precise/clearwater-homestead/lib/node_json_script'
--- telco/precise/clearwater-homestead/lib/node_json_script 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/node_json_script 2014-11-10 14:55:38 +0000
@@ -0,0 +1,57 @@
1#!/usr/bin/python
2
3import subprocess
4import string
5import socket
6import os
7import argparse
8
9# Create the ~/chef-solo/node.json file.
10#
11# The node.json file contains the machines IP address, the machine ID (a number)
12# and the repo server.
13#
14# If the node is being clustered, the role 'clustered' is added, and after
15# clustering the tag 'clustered' is added (for homer/homestead)
16#
17# The node.json file is templated in lib/node_json_template.
18
19parser = argparse.ArgumentParser()
20
21parser.add_argument('--cluster', action='store_true')
22parser.add_argument('--tag', action='store_true')
23
24args = parser.parse_args()
25
26# Populate the dictionary
27d = {}
28
29d['LOCAL_IP'] = socket.gethostbyname(subprocess.check_output(["unit-get", "private-address"]).rstrip())
30d['MACHINE_ID'] = str(int(os.environ['JUJU_UNIT_NAME'].split('/')[1]) + 1)
31d['REPO'] = subprocess.check_output(["config-get", "repo"]).rstrip()
32
33node_file = "/home/ubuntu/chef-solo/node.json"
34if args.cluster or (os.path.exists(node_file) and "clustered" in open(node_file).read()):
35 d['CLUSTER'] = ",\n \"role[clustered]\""
36 d['CLUSTERED'] = ", \"clustered\""
37 d['TAG'] = ""
38
39 if args.tag or (os.path.exists(node_file) and "tags" in open(node_file).read()):
40 d['TAG'] = ",\n \"tags\": [\"clustered\"]"
41
42else:
43 d['CLUSTER'] = ""
44 d['CLUSTERED'] = ""
45 d['TAG'] = ""
46
47# Open template file
48charm_dir = os.environ['CHARM_DIR']
49with open( '%s/lib/node_json_template' % charm_dir ) as f:
50 src = string.Template( f.read() )
51
52# Make the substitutions
53result = src.substitute(d)
54
55# Write to ~/chef-solo/node.json
56with open('/home/ubuntu/chef-solo/node.json', 'w') as f:
57 f.write(result)
058
=== added file 'telco/precise/clearwater-homestead/lib/node_json_template'
--- telco/precise/clearwater-homestead/lib/node_json_template 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/node_json_template 2014-11-10 14:55:38 +0000
@@ -0,0 +1,17 @@
1{
2 "id": "$LOCAL_IP",
3 "name": "$LOCAL_IP",
4 "chef_environment": "_default",
5 "role": "homestead",
6 "roles": ["clearwater-infrastructure", "homestead"$CLUSTERED],
7 "cloud": {
8 "local_ipv4": "$LOCAL_IP"
9 },
10 "clearwater": {
11 "index": $MACHINE_ID,
12 "repo_server": "$REPO"
13 },
14 "run_list": [
15 "role[homestead]"$CLUSTER
16 ]$TAG
17}
018
=== added file 'telco/precise/clearwater-homestead/lib/restart'
--- telco/precise/clearwater-homestead/lib/restart 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/restart 2014-11-10 14:55:38 +0000
@@ -0,0 +1,7 @@
1#!/bin/bash
2set -e
3
4# Restart clearwater-infrastructure, and stop homestead/homestead-prov (to be restarted by monit)
5service clearwater-infrastructure restart
6service homestead stop
7service homestead-prov stop
08
=== added file 'telco/precise/clearwater-homestead/lib/unit-get'
--- telco/precise/clearwater-homestead/lib/unit-get 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/lib/unit-get 2014-11-10 14:55:38 +0000
@@ -0,0 +1,36 @@
1#!/bin/bash
2set -ex
3onEC2=false
4key=$1
5val=$(unit-get $1)
6
7if [ -f $CHARM_DIR/lib/provider.txt ]
8then
9 PROVIDER=`cat $CHARM_DIR/lib/provider.txt `
10else
11 #checking dirty ec2 hack will work
12 wget -q http://169.254.169.254/latest/meta-data/public-ipv4 && onEC2=true
13 if ( "$onEC2" == true )
14 then
15 echo "EC2" > $CHARM_DIR/lib/provider.txt
16 else
17 echo "NOTEC2" > $CHARM_DIR/lib/provider.txt
18 fi
19fi
20
21if [ "$PROVIDER" == "EC2" ]
22then
23 if [ "$key" = "public-address" ] && [ -n "$(dig +short $val | head -1)" ]
24 then
25 val=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
26 elif [ "$key" = "private-address" ]
27 then
28 val_ip=$(dig +short $val | head -1)
29 [ -z "$val_ip" ] || val=$val_ip
30 ##if val_ip is empty getting the system IP
31 [ -z "$val_ip" ] && val=`ip route | grep src | cut -d " " -f 12`
32 fi
33fi
34
35echo $val
36
037
=== added file 'telco/precise/clearwater-homestead/metadata.yaml'
--- telco/precise/clearwater-homestead/metadata.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/metadata.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,18 @@
1name: clearwater-homestead
2summary: Homestead charm for Project Clearwater
3maintainer: Project Clearwater Maintainers <maintainers@projectclearwater.org>
4description: Homestead charm for Project Clearwater
5categories:
6 - misc
7subordinate: false
8requires:
9 programmable-multiple:
10 interface: dns-multi
11provides:
12 homestead-cscf:
13 interface: homestead-hss-interface
14 homestead-prov-user:
15 interface: homestead-prov-interface
16peers:
17 homestead:
18 interface: homestead-interface
019
=== added file 'telco/precise/clearwater-homestead/revision'
--- telco/precise/clearwater-homestead/revision 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-homestead/revision 2014-11-10 14:55:38 +0000
@@ -0,0 +1,1 @@
11
02
=== added directory 'telco/precise/clearwater-ralf'
=== added file 'telco/precise/clearwater-ralf/README.md'
--- telco/precise/clearwater-ralf/README.md 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/README.md 2014-11-10 14:55:38 +0000
@@ -0,0 +1,90 @@
1# Overview
2
3This 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.
4
5# Usage
6
7The 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.
8
9 juju deploy --config config.yaml clearwater-route53
10 juju deploy --config config.yaml --constraints arch=amd64 clearwater-ellis
11 juju deploy --config config.yaml --constraints arch=amd64 clearwater-bono
12 juju deploy --config config.yaml --constraints arch=amd64 clearwater-sprout
13 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homestead
14 juju deploy --config config.yaml --constraints arch=amd64 clearwater-homer
15 juju add-relation clearwater-ellis clearwater-route53:register-ellis
16 juju add-relation clearwater-bono clearwater-route53:register-bono
17 juju add-relation clearwater-sprout clearwater-route53:register-sprout
18 juju add-relation clearwater-homestead clearwater-route53:register-homestead
19 juju add-relation clearwater-homer clearwater-route53:register-homer
20 juju expose clearwater-bono
21 juju expose clearwater-ellis
22
23The config.yaml configuration file takes the following format.
24
25 clearwater-route53:
26 zone: <domain>
27 access_key: <ec2 access key>
28 secret_key: <ec2 secret access key>
29 sas: "0.0.0.0"
30
31 clearwater-ellis:
32 smtp_server: smtp.cw-ngv.com
33 smtp_username: username
34 smtp_password: password
35 email_sender: blackhole@cw-ngv.com<mailto:blackhole@cw-ngv.com>
36 signup_key: secret
37 base_number: "6505550000"
38 number_count: 1000
39 repo: http://repo.cw-ngv.com/stable
40
41 clearwater-bono:
42 turn_workaround: password
43 repo: http://repo.cw-ngv.com/stable
44
45 clearwater-sprout:
46 reg_min_expires: 400
47 session_max_expires: 900
48 repo: http://repo.cw-ngv.com/stable
49
50 clearwater-homestead:
51 repo: http://repo.cw-ngv.com/stable
52
53 clearwater-homer:
54 repo: http://repo.cw-ngv.com/stable
55
56Note that the clearwater-ralf charm can only be deployed on the `amd64` architecture.
57
58## Scale out Usage
59
60## Known Limitations and Issues
61
62The 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.
63
64clearwater-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.
65
66Note 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.
67
68# Configuration
69
70Clearwater has a number of configuration fields which are non-defaultable. These are as follows.
71
72clearwater-route53
73
74- `zone:` This must be set to a DNS zone name which is managed by the AWS Route53 service.
75- `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.
76
77clearwater-ellis
78
79- `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.
80- `base_number:` and `number_count:` These define the telephone number range assigned to the Clearwater system.
81
82# Contact Information
83
84## Upstream Project Name
85
86See http:www.projectclearwater.org and https://github.com/Metaswitch/clearwater-docs/wiki for information about clearwater.
87
88Clearwater source code and issue list can be found at https://github.com/Metaswitch/.
89
90The Clearwater mailing list is at lists.projectclearwater.org.
091
=== added file 'telco/precise/clearwater-ralf/config.yaml'
--- telco/precise/clearwater-ralf/config.yaml 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/config.yaml 2014-11-10 14:55:38 +0000
@@ -0,0 +1,12 @@
1options:
2 zone:
3 description: The DNS root zone for this service
4 type: string
5 sas:
6 default: ""
7 description: The location of the SAS server
8 type: string
9 repo:
10 default: http://repo.cw-ngv.com/stable
11 description: The location of the repo server
12 type: string
013
=== added file 'telco/precise/clearwater-ralf/copyright'
--- telco/precise/clearwater-ralf/copyright 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/copyright 2014-11-10 14:55:38 +0000
@@ -0,0 +1,31 @@
1Project Clearwater - IMS in the Cloud
2Copyright (C) 2013 Metaswitch Networks Ltd
3
4This program is free software: you can redistribute it and/or modify it
5under the terms of the GNU General Public License as published by the
6Free Software Foundation, either version 3 of the License, or (at your
7option) any later version, along with the "Special Exception" for use of
8the program along with SSL, set forth below. This program is distributed
9in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11A PARTICULAR PURPOSE. See the GNU General Public License for more
12details. You should have received a copy of the GNU General Public
13License along with this program. If not, see
14<http://www.gnu.org/licenses/>.
15
16The author can be reached by email at clearwater@metaswitch.com or by
17post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
18
19Special Exception
20Metaswitch Networks Ltd grants you permission to copy, modify,
21propagate, and distribute a work formed by combining OpenSSL with The
22Software, or a work derivative of such a combination, even if such
23copying, modification, propagation, or distribution would otherwise
24violate the terms of the GPL. You must comply with the GPL in all
25respects for all of the code used other than OpenSSL.
26"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
27Project and licensed under the OpenSSL Licenses, or a work based on such
28software and licensed under the OpenSSL Licenses.
29"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
30under which the OpenSSL Project distributes the OpenSSL toolkit software,
31as those licenses appear in the file LICENSE-OPENSSL.
032
=== added directory 'telco/precise/clearwater-ralf/hooks'
=== added file 'telco/precise/clearwater-ralf/hooks/config-changed'
--- telco/precise/clearwater-ralf/hooks/config-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/config-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2set -e
3
4# Update the /etc/clearwater/config file, the node.json, and re-run
5# chef-solo
6$CHARM_DIR/lib/config_script
7$CHARM_DIR/lib/node_json_script
8chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
9$CHARM_DIR/lib/restart
010
=== added file 'telco/precise/clearwater-ralf/hooks/install'
--- telco/precise/clearwater-ralf/hooks/install 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/install 2014-11-10 14:55:38 +0000
@@ -0,0 +1,37 @@
1#!/bin/bash
2set -e
3
4# This is a big hack. Juju on EC2 returns hostnames rather than IP addresses
5# for public-address and private-address. To work-around this, we resolve the
6# host names. However, after we've joined to the DNSaaS charm, we can no longer
7# resolve these, so add them to /etc/hosts.
8if ! grep "# added by clearwater-*/hooks/install" /etc/hosts ; then
9 private_address=$(unit-get private-address)
10 public_address=$(unit-get public-address)
11 private_ip=$($CHARM_DIR/lib/unit-get private-address)
12 public_ip=$($CHARM_DIR/lib/unit-get public-address)
13 [ "$private_address" = "$private_ip" ] || echo "$private_ip $private_address # added by clearwater-*/hooks/install" >>/etc/hosts
14 [ "$public_address" = "$public_ip" ] || echo "$public_ip $public_address $(sed -e 's/\..*$//' <<< $public_address) # added by clearwater-*/hooks/install" >>/etc/hosts
15 echo "$private_ip ralf-$(cut -d/ -f2 <<< $JUJU_UNIT_NAME).$(config-get zone) # added by clearwater-*/hooks/install" >>/etc/hosts
16fi
17
18# Install chef solo
19$CHARM_DIR/lib/chef_solo_install
20
21this_ip=`unit-get private-address`
22this_index=$(echo $JUJU_UNIT_NAME | cut -d'/' -f2)
23$CHARM_DIR/lib/node_json_clustered_script --ip "$this_ip" --index "$this_index"
24$CHARM_DIR/lib/node_json_script
25
26# Update the config file
27$CHARM_DIR/lib/config_script
28
29apt-get update
30
31# Install the node
32chef-solo -c /home/ubuntu/chef-solo/solo.rb -j /home/ubuntu/chef-solo/node.json
33
34# Expose the correct ports
35open-port 22/tcp
36open-port 123/udp
37open-port 161/udp
038
=== added file 'telco/precise/clearwater-ralf/hooks/programmable-multiple-relation-changed'
--- telco/precise/clearwater-ralf/hooks/programmable-multiple-relation-changed 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/programmable-multiple-relation-changed 2014-11-10 14:55:38 +0000
@@ -0,0 +1,24 @@
1#!/bin/bash
2set -e
3
4# Set our DNS requirements
5TTL=300
6id=$(cut -d/ -f2 <<< $JUJU_UNIT_NAME)
7ip=$($CHARM_DIR/lib/unit-get private-address)
8relation-set domain=$(config-get zone)
9relation-set resources='ralf '$TTL' IN A '$ip'
10ralf-'$id' '$TTL' IN A '$ip
11
12# Update our DNS server
13if [ "$(relation-get public-address)" != "" ]
14then
15 echo nameserver $(relation-get public-address) > /etc/dnsmasq.resolv.conf
16 grep -v ^RESOLV_CONF= /etc/default/dnsmasq > /tmp/dnsmasq.$$ || juju-log "WARNING RESOLV_CONF not found"
17 mv /tmp/dnsmasq.$$ /etc/default/dnsmasq
18 echo RESOLV_CONF=/etc/dnsmasq.resolv.conf >> /etc/default/dnsmasq
19 service dnsmasq restart
20fi
21
22# Update Clearwater configuration and restart
23$CHARM_DIR/lib/config_script programmable-multiple
24$CHARM_DIR/lib/restart
025
=== added file 'telco/precise/clearwater-ralf/hooks/ralf-cscf-relation-joined'
--- telco/precise/clearwater-ralf/hooks/ralf-cscf-relation-joined 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/ralf-cscf-relation-joined 2014-11-10 14:55:38 +0000
@@ -0,0 +1,4 @@
1#!/bin/bash
2set -e
3
4relation-set public-address=ralf.$(config-get zone)
05
=== added file 'telco/precise/clearwater-ralf/hooks/start'
--- telco/precise/clearwater-ralf/hooks/start 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/start 2014-11-10 14:55:38 +0000
@@ -0,0 +1,16 @@
1#!/bin/bash
2# Here put anything that is needed to start the service.
3# Note that currently this is run directly after install
4# i.e. 'service apache2 start'
5set -e
6
7# This hook needs to be idempotent, so this could be run when ralf is
8# already running, when it's running but not monitored by monit, when
9# it's stopped but being monitored (so it's about to start), or stopped
10# and unmonitored. To cover all these cases, stop monit, start ralf, start
11# monit, then finally have monit monitor ralf
12service monit stop
13service ralf start
14service monit start
15sleep 1
16monit monitor ralf
017
=== added file 'telco/precise/clearwater-ralf/hooks/stop'
--- telco/precise/clearwater-ralf/hooks/stop 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/stop 2014-11-10 14:55:38 +0000
@@ -0,0 +1,12 @@
1#!/bin/bash
2# This will be run when the service is being torn down, allowing you to disable
3# it in various ways..
4# For example, if your web app uses a text file to signal to the load balancer
5# that it is live... you could remove it and sleep for a bit to allow the load
6# balancer to stop sending traffic.
7# rm /srv/webroot/server-live.txt && sleep 30
8set -e
9
10# Stop ralf via monit
11sudo service monit start
12sudo monit stop ralf
013
=== added file 'telco/precise/clearwater-ralf/hooks/upgrade-charm'
--- telco/precise/clearwater-ralf/hooks/upgrade-charm 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/hooks/upgrade-charm 2014-11-10 14:55:38 +0000
@@ -0,0 +1,9 @@
1#!/bin/bash
2# This hook is executed each time a charm is upgraded after the new charm
3# contents have been unpacked
4# Best practice suggests you execute the hooks/install and
5# hooks/config-changed to ensure all updates are processed
6set -e
7
8$CHARM_DIR/hooks/install
9$CHARM_DIR/hooks/config-changed
010
=== added file 'telco/precise/clearwater-ralf/icon.svg'
--- telco/precise/clearwater-ralf/icon.svg 1970-01-01 00:00:00 +0000
+++ telco/precise/clearwater-ralf/icon.svg 2014-11-10 14:55:38 +0000
@@ -0,0 +1,407 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="96"
14 height="96"
15 id="svg6517"
16 version="1.1"
17 inkscape:version="0.48.2 r9819"
18 sodipodi:docname="icon.svg">
19 <defs
20 id="defs6519">
21 <linearGradient
22 id="Background">
23 <stop
24 id="stop4178"
25 offset="0"
26 style="stop-color:#b8b8b8;stop-opacity:1" />
27 <stop
28 id="stop4180"
29 offset="1"
30 style="stop-color:#c9c9c9;stop-opacity:1" />
31 </linearGradient>
32 <filter
33 style="color-interpolation-filters:sRGB;"
34 inkscape:label="Inner Shadow"
35 id="filter1121">
36 <feFlood
37 flood-opacity="0.59999999999999998"
38 flood-color="rgb(0,0,0)"
39 result="flood"
40 id="feFlood1123" />
41 <feComposite
42 in="flood"
43 in2="SourceGraphic"
44 operator="out"
45 result="composite1"
46 id="feComposite1125" />
47 <feGaussianBlur
48 in="composite1"
49 stdDeviation="1"
50 result="blur"
51 id="feGaussianBlur1127" />
52 <feOffset
53 dx="0"
54 dy="2"
55 result="offset"
56 id="feOffset1129" />
57 <feComposite
58 in="offset"
59 in2="SourceGraphic"
60 operator="atop"
61 result="composite2"
62 id="feComposite1131" />
63 </filter>
64 <filter
65 style="color-interpolation-filters:sRGB;"
66 inkscape:label="Drop Shadow"
67 id="filter950">
68 <feFlood
69 flood-opacity="0.25"
70 flood-color="rgb(0,0,0)"
71 result="flood"
72 id="feFlood952" />
73 <feComposite
74 in="flood"
75 in2="SourceGraphic"
76 operator="in"
77 result="composite1"
78 id="feComposite954" />
79 <feGaussianBlur
80 in="composite1"
81 stdDeviation="1"
82 result="blur"
83 id="feGaussianBlur956" />
84 <feOffset
85 dx="0"
86 dy="1"
87 result="offset"
88 id="feOffset958" />
89 <feComposite
90 in="SourceGraphic"
91 in2="offset"
92 operator="over"
93 result="composite2"
94 id="feComposite960" />
95 </filter>
96 <clipPath
97 clipPathUnits="userSpaceOnUse"
98 id="clipPath873">
99 <g
100 transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
101 id="g875"
102 inkscape:label="Layer 1"
103 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
104 <path
105 style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
106 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"
107 id="path877"
108 inkscape:connector-curvature="0"
109 sodipodi:nodetypes="sssssssss" />
110 </g>
111 </clipPath>
112 <filter
113 inkscape:collect="always"
114 id="filter891"
115 inkscape:label="Badge Shadow">
116 <feGaussianBlur
117 inkscape:collect="always"
118 stdDeviation="0.71999962"
119 id="feGaussianBlur893" />
120 </filter>
121 </defs>
122 <sodipodi:namedview
123 id="base"
124 pagecolor="#ffffff"
125 bordercolor="#666666"
126 borderopacity="1.0"
127 inkscape:pageopacity="0.0"
128 inkscape:pageshadow="2"
129 inkscape:zoom="1.3995495"
130 inkscape:cx="18.514671"
131 inkscape:cy="49.018169"
132 inkscape:document-units="px"
133 inkscape:current-layer="layer1"
134 showgrid="true"
135 fit-margin-top="0"
136 fit-margin-left="0"
137 fit-margin-right="0"
138 fit-margin-bottom="0"
139 inkscape:window-width="1331"
140 inkscape:window-height="674"
141 inkscape:window-x="19"
142 inkscape:window-y="1"
143 inkscape:window-maximized="0"
144 showborder="true"
145 showguides="true"
146 inkscape:guide-bbox="true"
147 inkscape:showpageshadow="false">
148 <inkscape:grid
149 type="xygrid"
150 id="grid821" />
151 <sodipodi:guide
152 orientation="1,0"
153 position="16,48"
154 id="guide823" />
155 <sodipodi:guide
156 orientation="0,1"
157 position="64,80"
158 id="guide825" />
159 <sodipodi:guide
160 orientation="1,0"
161 position="80,40"
162 id="guide827" />
163 <sodipodi:guide
164 orientation="0,1"
165 position="64,16"
166 id="guide829" />
167 </sodipodi:namedview>
168 <metadata
169 id="metadata6522">
170 <rdf:RDF>
171 <cc:Work
172 rdf:about="">
173 <dc:format>image/svg+xml</dc:format>
174 <dc:type
175 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
176 <dc:title></dc:title>
177 </cc:Work>
178 </rdf:RDF>
179 </metadata>
180 <g
181 inkscape:label="BACKGROUND"
182 inkscape:groupmode="layer"
183 id="layer1"
184 transform="translate(268,-635.29076)"
185 style="display:inline">
186 <path
187 style="fill:#e6e6e6;fill-opacity:1;stroke:none;display:inline;filter:url(#filter1121)"
188 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"
189 id="path6455"
190 inkscape:connector-curvature="0"
191 sodipodi:nodetypes="sssssssss" />
192 <image
193 y="633.29077"
194 x="-270"
195 id="image3169"
196 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