New SDN Charm¶
Before writing the charm the charm author needs to have a clear idea of what applications the charm is going to need to relate to, what files and services the charm is going to manage and possibly what files or services do other charms manage that need updating.
In the example below we will assume that a new charm, VirtualTokenRing, is needed to install a component on compute nodes and to inject some configuration into nova.conf.
Prerequisites¶
This will change once the OpenStack templates are on pypi
mkdir sdn-charm
cd ~/sdn-charm
git clone git@github.com:openstack-charmers/charm-templates-openstack.git
cd charm_templates_openstack
sudo ./setup.py install
Create Charm¶
Charm tools provides a utility for building an initial charm from a template. During the charm generation charm tools asks a few questions about the charm.
cd ~/sdn-charm
charm-create -t openstack-neutron-plugin virtual-token-ring
INFO: Generating charm for virtual-token-ring in ./virtual-token-ring
INFO: No virtual-token-ring in apt cache; creating an empty charm instead.
What is the earliest OpenStack release this charm is compatible with? liberty
What packages should this charm install (space separated list)?
Build Charm¶
The charm now needs to be built to pull down all the interfaces and layers the charm depends on and rolled into the built charm which can be deployed.
cd ~/sdn-charm/virtual-token-ring
charm build -o build src
Deploy Charm¶
cd build
juju deploy cs:xenial/nova-compute
juju deploy ~/sdn-charm/virtual-token-ring/build/builds/virtual-token-ring
juju add-relation nova-compute virtual-token-ring
juju status
will now show both charms deployed. The nova-compute
status
will show some missing relations but that’s not an issue for this demonstration.
Updating nova.conf¶
During the initial install of this SDN charm, the standard charms.openstack default installer will install the packages specified in the class CharmName.packages, but it will not do any other configuration. In order to update nova.conf in the nova-compute principal charm, this virtual-token-ring subordinate charm will need to access the neutron plugin interface, which will allow it to send configuration information to the nova-computer principal charm for inclusion in nova.conf on the co-located machine.
Return to the virtual-token-ring directory and edit src/reactive/virtual_token_ring_handlers.py. Add any config that needs setting in nova.conf.
@reactive.when('neutron-plugin.connected')
def configure_neutron_plugin(neutron_plugin):
neutron_plugin.configure_plugin(
plugin='ovs',
config={
"nova-compute": {
"/etc/nova/nova.conf": {
"sections": {
'DEFAULT': [
('random_option', 'true'),
],
}
}
}
})
This tells the charm to send that configuration to the principle where the neutron-plugin.connected event has been raised. Then repeat the Build Charm steps.
Deploy Update¶
The freshly built charm which contains the update now needs to be deployed to the environment.
juju upgrade-charm --path ~/sdn-charm/virtual-token-ring/build/builds/virtual-token-ring virtual-token-ring
Check Update¶
juju run --unit nova-compute/0 "grep random_option /etc/nova/nova.conf"
random_option = true