Merge remote-tracking branch 'gnuoy/master'
This commit is contained in:
commit
17aa1c62fb
|
@ -78,7 +78,7 @@ class RabbitMQRelationAdapter(OpenStackRelationAdapter):
|
|||
|
||||
class DatabaseRelationAdapter(OpenStackRelationAdapter):
|
||||
"""
|
||||
Adapter for the RabbitMQRequires relation interface.
|
||||
Adapter for the Database relation interface.
|
||||
"""
|
||||
|
||||
interface_type = "database"
|
||||
|
@ -98,14 +98,21 @@ class DatabaseRelationAdapter(OpenStackRelationAdapter):
|
|||
def type(self):
|
||||
return 'mysql'
|
||||
|
||||
@property
|
||||
def uri(self):
|
||||
uri = 'mysql://{}:{}@{}/{}'.format(
|
||||
self.username,
|
||||
self.password,
|
||||
self.host,
|
||||
self.database,
|
||||
)
|
||||
def get_uri(self, prefix=None):
|
||||
if prefix:
|
||||
uri = 'mysql://{}:{}@{}/{}'.format(
|
||||
self.relation.username(prefix=prefix),
|
||||
self.relation.password(prefix=prefix),
|
||||
self.host,
|
||||
self.relation.database(prefix=prefix),
|
||||
)
|
||||
else:
|
||||
uri = 'mysql://{}:{}@{}/{}'.format(
|
||||
self.username,
|
||||
self.password,
|
||||
self.host,
|
||||
self.database,
|
||||
)
|
||||
if self.ssl_ca:
|
||||
uri = '{}?ssl_ca={}'.format(uri, self.ssl_ca)
|
||||
if self.ssl_cert:
|
||||
|
@ -114,6 +121,12 @@ class DatabaseRelationAdapter(OpenStackRelationAdapter):
|
|||
return uri
|
||||
|
||||
|
||||
@property
|
||||
def uri(self):
|
||||
return self.get_uri()
|
||||
|
||||
|
||||
|
||||
class ConfigurationAdapter(object):
|
||||
"""
|
||||
Configuration Adapter which provides python based access
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
"""Classes to support writing re-usable charms in the reactive framework"""
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
from charmhelpers.contrib.openstack.utils import (
|
||||
configure_installation_source,
|
||||
)
|
||||
from charmhelpers.core.host import path_hash, service_restart
|
||||
from charmhelpers.core.hookenv import config, status_set
|
||||
from charmhelpers.fetch import (
|
||||
apt_install,
|
||||
|
@ -11,6 +14,11 @@ from charmhelpers.fetch import (
|
|||
)
|
||||
|
||||
from charm.openstack.ip import PUBLIC, INTERNAL, ADMIN, canonical_url
|
||||
from contextlib import contextmanager
|
||||
from collections import OrderedDict
|
||||
from charmhelpers.contrib.openstack.templating import get_loader
|
||||
from charmhelpers.core.templating import render
|
||||
from charmhelpers.core.hookenv import leader_get, leader_set
|
||||
|
||||
|
||||
class OpenStackCharm(object):
|
||||
|
@ -34,8 +42,17 @@ class OpenStackCharm(object):
|
|||
default_service = None
|
||||
"""Default service for the charm"""
|
||||
|
||||
def __init__(self):
|
||||
restart_map = {}
|
||||
sync_cmd = []
|
||||
services = []
|
||||
adapters_class = None
|
||||
|
||||
def __init__(self, interfaces=None):
|
||||
self.config = config()
|
||||
# XXX It's not always liberty!
|
||||
self.release = 'liberty'
|
||||
if interfaces and self.adapters_class:
|
||||
self.adapter_instance = self.adapters_class(interfaces)
|
||||
|
||||
def install(self):
|
||||
"""
|
||||
|
@ -84,6 +101,42 @@ class OpenStackCharm(object):
|
|||
self.api_port(self.default_service,
|
||||
INTERNAL))
|
||||
|
||||
@contextmanager
|
||||
def restart_on_change(self):
|
||||
checksums = {path: path_hash(path) for path in self.restart_map}
|
||||
yield
|
||||
restarts = []
|
||||
for path in self.restart_map:
|
||||
if path_hash(path) != checksums[path]:
|
||||
restarts += self.restart_map[path]
|
||||
services_list = list(OrderedDict.fromkeys(restarts))
|
||||
for service_name in services_list:
|
||||
service_restart(service_name)
|
||||
|
||||
def render_all_configs(self):
|
||||
self.render_configs(self.adapters, self.restart_map.keys())
|
||||
|
||||
def render_configs(self, configs):
|
||||
with self.restart_on_change():
|
||||
for conf in configs:
|
||||
render(source=os.path.basename(conf),
|
||||
template_loader=get_loader('templates/', self.release),
|
||||
target=conf,
|
||||
context=self.adapter_instance)
|
||||
|
||||
def restart_all(self):
|
||||
for svc in self.services:
|
||||
service_restart(svc)
|
||||
|
||||
def db_sync(self):
|
||||
sync_done = leader_get(attribute='db-sync-done')
|
||||
if not sync_done:
|
||||
subprocess.check_call(self.sync_cmd)
|
||||
leader_set({'db-sync-done': True})
|
||||
# Restart services immediatly after db sync as
|
||||
# render_domain_config needs a working system
|
||||
self.restart_all()
|
||||
|
||||
|
||||
class OpenStackCharmFactory(object):
|
||||
|
||||
|
@ -99,12 +152,12 @@ class OpenStackCharmFactory(object):
|
|||
"""
|
||||
|
||||
@classmethod
|
||||
def charm(cls, release=None):
|
||||
def charm(cls, release=None, interfaces=None):
|
||||
"""
|
||||
Get an instance of the right charm for the
|
||||
configured OpenStack series
|
||||
"""
|
||||
if release and release in cls.releases:
|
||||
return cls.releases[release]()
|
||||
return cls.releases[release](interfaces=interfaces)
|
||||
else:
|
||||
return cls.releases[cls.first_release]()
|
||||
return cls.releases[cls.first_release](interfaces=interfaces)
|
||||
|
|
Loading…
Reference in New Issue