CMR scenario #1
This page refers to Cross model relations. See that page for background information.
In this example, we build a simple CMR infrastructure in step by step fashion, explaining each step along the way. A method of verifying the deployment is provided at the end.
This scenario describes a MediaWiki deployment, based within the same controller; used by the admin user, and consumed by multiple models.
The controller is called 'aws-cmr' and the model name is 'cmr-model'.
Deploy the application
Deploy the application in the usual way. Extra resources have been requested via constraints, since this shared MySQL should be capable of servicing several remote applications.
juju deploy mysql --constraints "cores=4 mem=16G root-disk=1T"
The output to juju status --relations
will eventually look similar to:
Model Controller Cloud/Region Version SLA Timestamp cmr-model aws-cmr aws/us-east-1 2.4-beta4 unsupported 21:38:59Z App Version Status Scale Charm Store Rev OS Notes mysql 5.7.22 active 1 mysql jujucharms 58 ubuntu Unit Workload Agent Machine Public address Ports Message mysql/0* active idle 0 107.22.17.48 3306/tcp Ready Machine State DNS Inst id Series AZ Message 0 started 107.22.17.48 i-05dc6ef01fd41735b xenial us-east-1a running Relation provider Requirer Interface Type Message mysql:cluster mysql:cluster mysql-ha peer
Now make the mysql application, and only that application, available to other
models by referring to interface 'mysql:db' with the juju offer
command:
juju offer mysql:db
Note: See Managing relations for how to determine the interface used in the juju offer
command.
The output will include the shared application's endpoint:
Application "mysql" endpoints [db] available at "admin/cmr-model.mysql"
Where the offer URL is admin/cmr-model.mysql
.
All available offer endpoints (per model) can be listed like so:
juju find-offers
In this example, the output is:
Store URL Access Interfaces aws-cmr admin/cmr-model.mysql admin mysql:db
Add a first consumer model and application
Add a consumer model and application. The application in this example will
require a MySQL database and the objective is that it will use the one in the
shared (CMR) model. The application we've chosen here is WordPress and we'll
refer to the MySQL offer URL in the juju add-relation
command:
juju add-model wordpress-model juju deploy wordpress juju expose wordpress juju add-relation wordpress:db admin/cmr-model.mysql
The last command has made use of a cross model relation.
The output to juju status
for this model will eventually settle down to look
very much like:
Model Controller Cloud/Region Version SLA Timestamp wordpress-model aws-cmr aws/us-east-1 2.4-beta4 unsupported 17:55:45Z SAAS Status Store URL mysql active aws-cmr admin/cmr-model.mysql App Version Status Scale Charm Store Rev OS Notes wordpress active 1 wordpress jujucharms 5 ubuntu exposed Unit Workload Agent Machine Public address Ports Message wordpress/0* active idle 0 54.166.154.178 80/tcp Machine State DNS Inst id Series AZ Message 0 started 54.166.154.178 i-0f73b697d5aaef377 trusty us-east-1a running Relation provider Requirer Interface Type Message mysql:db wordpress:db mysql regular wordpress:loadbalancer wordpress:loadbalancer reversenginx peer
Notice how the remote MySQL application shows up as a SAAS object. Its corresponding relation is also described:
Relation provider Requirer Interface Type Message mysql:db wordpress:db mysql regular
Applying the juju status
command to the CMR model we see that the offer is
now connected:
juju status -m cmr-model
Output:
. . . Offer Application Charm Rev Connected Endpoint Interface Role mysql mysql mysql 58 1/1 db mysql provider
Add a second consumer model and application
Add a second consumer model and MySQL-based application. The application we've chosen now is MediaWiki.
juju add-model mediawiki-model juju deploy mediawiki juju expose mediawiki juju add-relation mediawiki:db admin/cmr-model.mysql
The output to juju status --relations
for this model will eventually become:
Model Controller Cloud/Region Version SLA Timestamp mediawiki-model aws-cmr aws/us-east-1 2.4-beta4 unsupported 18:07:38Z SAAS Status Store URL mysql active aws-cmr admin/cmr-model.mysql App Version Status Scale Charm Store Rev OS Notes mediawiki 1.19.14 active 1 mediawiki jujucharms 19 ubuntu exposed Unit Workload Agent Machine Public address Ports Message mediawiki/0* active idle 0 54.224.9.240 80/tcp Ready Machine State DNS Inst id Series AZ Message 0 started 54.224.9.240 i-0905beabb62c21ee9 trusty us-east-1a running Relation provider Requirer Interface Type Message mysql:db mediawiki:db mysql regular
The new juju status
output for model 'cmr-model' is not surprising. There are
now two connections to the original offer:
. . . Offer Application Charm Rev Connected Endpoint Interface Role mysql mysql mysql 58 2/2 db mysql provider
We can also inquire into currently shared endpoints within the 'cmr-model':
juju offers -m cmr-model
Offer User Relation id Status Endpoint Interface Role Ingress subnets mysql admin 1 joined db mysql provider 54.166.154.178/32 admin 2 joined db mysql provider 54.224.9.240/32
Verification
Verify that the remote application has responded to the two cross model relations by creating/preparing the necessary resources. In this example, we log in to the mysql unit via SSH, connect to MySQL, and list its databases:
juju ssh -m cmr-model mysql/0 mysql -u root --password=$(sudo cat /var/lib/mysql/mysql.passwd) mysql> show databases;
The output should look similar to:
+-----------------------------------------+ | Database | +-----------------------------------------+ | information_schema | | mysql | | performance_schema | | remote-9414c94f21db456d822045bb216c3b33 | | remote-9cc8d09e87674e3487442a64751eb386 | | sys | +-----------------------------------------+ 6 rows in set (0.00 sec)
From the output we can see evidence of two databases that got created, one for each consumer application. Cool.