yellow team mailing list archive
-
yellow team
-
Mailing list archive
-
Message #01932
lp:~frankban/charms/precise/juju-gui/bug-1086788-jitsu-deploy-to into lp:~juju-gui/charms/precise/juju-gui/trunk
Francesco Banconi has proposed merging lp:~frankban/charms/precise/juju-gui/bug-1086788-jitsu-deploy-to into lp:~juju-gui/charms/precise/juju-gui/trunk.
Requested reviews:
Juju GUI Hackers (juju-gui)
Related bugs:
Bug #1086788 in juju-gui: "charm should support/test jitsu deploy-to"
https://bugs.launchpad.net/juju-gui/+bug/1086788
For more details, see:
https://code.launchpad.net/~frankban/charms/precise/juju-gui/bug-1086788-jitsu-deploy-to/+merge/139526
Add support for jitsu deploy-to.
The charm already worked well when deployed in the bootstrap node using
the 'jitsu deploy-to' command. This branch adds a test for this behavior.
Other changes:
Slightly simplified how the staging option is retrieved in the start hook.
Fixed tests by changing the juju-gui upstart configuration file. Before
this change it was not possible for upstart to correctly stop the juju-gui
service, because upstart itself was not able to keep track of the PID.
Fixed the install hook: it was not idempotent (and the tests were broken
for this reason too).
https://codereview.appspot.com/6929057/
--
https://code.launchpad.net/~frankban/charms/precise/juju-gui/bug-1086788-jitsu-deploy-to/+merge/139526
Your team Juju GUI Hackers is requested to review the proposed merge of lp:~frankban/charms/precise/juju-gui/bug-1086788-jitsu-deploy-to into lp:~juju-gui/charms/precise/juju-gui/trunk.
=== modified file 'config/juju-gui.conf.template'
--- config/juju-gui.conf.template 2012-12-06 16:03:59 +0000
+++ config/juju-gui.conf.template 2012-12-12 17:45:38 +0000
@@ -1,7 +1,24 @@
description "Juju GUI"
author "Canonical"
+# Original author: George Shammas <georgyo@xxxxxxxxx>.
+# See http://wiki.nginx.org/Upstart.
-start on runlevel [2345]
+start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]
-exec service nginx start
+env DAEMON=/usr/sbin/nginx
+env PID=/var/run/nginx.pid
+
+expect fork
+respawn
+respawn limit 10 5
+
+pre-start script
+ # Test configuration, exit if errors are found.
+ $DAEMON -t
+ if [ $? -ne 0 ]
+ then exit $?
+ fi
+end script
+
+exec $DAEMON
=== modified file 'hooks/install'
--- hooks/install 2012-12-10 17:22:24 +0000
+++ hooks/install 2012-12-12 17:45:38 +0000
@@ -1,7 +1,7 @@
#!/usr/bin/env python2
# -*- python -*-
-import os.path
+import os
from subprocess import (
CalledProcessError,
check_call,
@@ -53,11 +53,16 @@
log('Output from "make" sent to', name)
run('make', stdout=fd, stderr=fd)
log('Setting up nginx.')
- cmd_log(run('rm', '/etc/nginx/sites-enabled/default'))
- cmd_log(run('touch', '/etc/nginx/sites-available/juju-gui'))
- cmd_log(run('chown', 'ubuntu:', '/etc/nginx/sites-available/juju-gui'))
- cmd_log(run('ln', '-s', '/etc/nginx/sites-available/juju-gui',
- '/etc/nginx/sites-enabled/juju-gui'))
+ nginx_default_site = '/etc/nginx/sites-enabled/default'
+ juju_gui_site = '/etc/nginx/sites-available/juju-gui'
+ if os.path.exists(nginx_default_site):
+ os.remove(nginx_default_site)
+ if not os.path.exists(juju_gui_site):
+ cmd_log(run('touch', juju_gui_site))
+ cmd_log(run('chown', 'ubuntu:', juju_gui_site))
+ cmd_log(
+ run('ln', '-s', juju_gui_site,
+ '/etc/nginx/sites-enabled/juju-gui'))
def main():
=== modified file 'hooks/start'
--- hooks/start 2012-12-10 17:22:24 +0000
+++ hooks/start 2012-12-12 17:45:38 +0000
@@ -108,9 +108,9 @@
def main():
config = get_config()
juju_api_port = config['juju-api-port']
- start_gui(juju_api_port, config['juju-gui-console-enabled'],
- config.get('staging'))
- if config.get('staging'):
+ staging = config.get('staging')
+ start_gui(juju_api_port, config['juju-gui-console-enabled'], staging)
+ if staging:
start_improv(juju_api_port, config['staging-environment'])
else:
start_agent(juju_api_port)
=== modified file 'tests/deploy.test'
--- tests/deploy.test 2012-12-10 17:22:24 +0000
+++ tests/deploy.test 2012-12-12 17:45:38 +0000
@@ -31,7 +31,7 @@
raise err
-class DeployTest(unittest.TestCase):
+class DeployTestMixin(object):
def setUp(self):
self.charm = 'juju-gui'
@@ -51,23 +51,6 @@
for service in services:
ssh(target, 'sudo', 'service', service, 'stop')
- def deploy(self, config_path=None):
- """Deploy and expose the Juju GUI charm. Return the service host name.
-
- Also wait until the service is started.
- If *config_path* is provided, it will be used when deploying the charm.
- """
- args = ['deploy', 'local:{0}'.format(self.charm)]
- if config_path is not None:
- args.extend(['--config', config_path])
- juju(*args)
- juju('expose', self.charm)
- jitsu(
- 'watch', '--failfast', self.charm,
- '--state', 'started', '--open-port', self.port)
- address = jitsu('get-service-info', self.charm, 'public-address')
- return address.strip().split(':')[1]
-
def check_services(self, hostname, ws_port=8080):
"""Check the services are listening on their tcp ports."""
url = 'http://{0}:{1}'.format(hostname, self.port)
@@ -81,6 +64,26 @@
open_url(ws_url)
self.assertEqual(400, context_manager.exception.getcode())
+
+class DeployTest(DeployTestMixin, unittest.TestCase):
+
+ def deploy(self, config_path=None):
+ """Deploy and expose the Juju GUI charm. Return the service host name.
+
+ Also wait until the service is started.
+ If *config_path* is provided, it will be used when deploying the charm.
+ """
+ args = ['deploy', 'local:{0}'.format(self.charm)]
+ if config_path is not None:
+ args.extend(['--config', config_path])
+ juju(*args)
+ juju('expose', self.charm)
+ jitsu(
+ 'watch', '--failfast', self.charm,
+ '--state', 'started', '--open-port', self.port)
+ address = jitsu('get-service-info', self.charm, 'public-address')
+ return address.strip().split(':')[1]
+
def test_api_agent(self):
# Ensure the Juju GUI and API agent services are correctly set up.
hostname = self.deploy()
@@ -91,13 +94,13 @@
def test_customized_api_port(self):
# It is possible to customize the port used by the websocket server.
- config = {self.charm: {'juju-api-port': 80}}
+ config = {self.charm: {'juju-api-port': 8081}}
config_file = make_charm_config_file(config)
hostname = self.deploy(config_path=config_file.name)
# XXX 2012-11-29 frankban bug=872264: see *stop_services* above.
self.addCleanup(
self.stop_services, hostname, ['juju-api-agent', 'juju-gui'])
- self.check_services(hostname, ws_port=80)
+ self.check_services(hostname, ws_port=8081)
def test_staging(self):
# Ensure the Juju GUI and improv services are correctly set up.
@@ -111,5 +114,32 @@
self.check_services(hostname)
+class DeployToTest(DeployTestMixin, unittest.TestCase):
+
+ def deploy_to(self):
+ """Deploy the Juju GUI charm in the Juju bootstrap node.
+
+ Expose it and return the service host name.
+ Also wait until the service is started.
+ """
+ # The id of the bootstrap node is 0 (the first node started by Juju).
+ jitsu('deploy-to', '0', 'local:{0}'.format(self.charm))
+ juju('expose', self.charm)
+ jitsu(
+ 'watch', '--failfast', self.charm,
+ '--state', 'started', '--open-port', self.port)
+ address = jitsu('get-service-info', self.charm, 'public-address')
+ return address.strip().split(':')[1]
+
+ def test_api_agent(self):
+ # Ensure the Juju GUI and API agent services are correctly set up in
+ # the Juju bootstrap node.
+ hostname = self.deploy_to()
+ # XXX 2012-11-29 frankban bug=872264: see *stop_services* above.
+ self.addCleanup(
+ self.stop_services, hostname, ['juju-api-agent', 'juju-gui'])
+ self.check_services(hostname)
+
+
if __name__ == '__main__':
unittest.main(verbosity=2)
=== modified file 'tests/test_utils.py'
--- tests/test_utils.py 2012-12-07 21:16:55 +0000
+++ tests/test_utils.py 2012-12-12 17:45:38 +0000
@@ -47,6 +47,7 @@
expected = self.template_contents % context
self.assertEqual(expected, self.destination_file.read())
+
class CmdLogTest(unittest.TestCase):
def setUp(self):
# Patch the charmhelpers 'command', which powers get_config. The
Follow ups