initial commit
This commit is contained in:
commit
29d6d050ad
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
build
|
||||
.tox
|
||||
layers
|
||||
interfaces
|
||||
trusty
|
||||
.testrepository
|
||||
__pycache__
|
||||
.stestr
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
charm-tools
|
||||
simplejson
|
93
src/config.yaml
Normal file
93
src/config.yaml
Normal file
@ -0,0 +1,93 @@
|
||||
options:
|
||||
debug:
|
||||
type: boolean
|
||||
default: False
|
||||
description: Enable debug logging.
|
||||
verbose:
|
||||
type: boolean
|
||||
default: False
|
||||
description: Enable verbose logging.
|
||||
use-syslog:
|
||||
type: boolean
|
||||
default: False
|
||||
description: |
|
||||
Setting this to True will allow supporting services to log to syslog.
|
||||
openstack-origin:
|
||||
type: string
|
||||
default: distro
|
||||
description: |
|
||||
Repository from which to install. May be one of the following:
|
||||
distro (default), ppa:somecustom/ppa, a deb url sources entry,
|
||||
or a supported Ubuntu Cloud Archive e.g.
|
||||
.
|
||||
cloud:<series>-<openstack-release>
|
||||
cloud:<series>-<openstack-release>/updates
|
||||
cloud:<series>-<openstack-release>/staging
|
||||
cloud:<series>-<openstack-release>/proposed
|
||||
.
|
||||
See https://wiki.ubuntu.com/OpenStack/CloudArchive for info on which
|
||||
cloud archives are available and supported.
|
||||
.
|
||||
NOTE: updating this setting to a source that is known to provide
|
||||
a later version of OpenStack will trigger a software upgrade unless
|
||||
action-managed-upgrade is set to True.
|
||||
harden:
|
||||
type: string
|
||||
default:
|
||||
description: |
|
||||
Apply system hardening. Supports a space-delimited list of modules
|
||||
to run. Supported modules currently include os, ssh, apache and mysql.
|
||||
nova-alchemy-flags:
|
||||
type: string
|
||||
default:
|
||||
description: |
|
||||
Comma-separated list of key=value sqlalchemy related config flags to be
|
||||
set in nova.conf [database] section.
|
||||
network-manager:
|
||||
type: string
|
||||
default: FlatDHCPManager
|
||||
description: |
|
||||
Network manager for the cloud; supports the following options:
|
||||
.
|
||||
FlatDHCPManager (nova-network) (default)
|
||||
FlatManager (nova-network)
|
||||
Neutron (Full SDN solution)
|
||||
.
|
||||
When using the Neutron option you will most likely want to use
|
||||
the neutron-gateway charm to provide L3 routing and DHCP Services.
|
||||
config-flags:
|
||||
type: string
|
||||
default:
|
||||
description: |
|
||||
Comma-separated list of key=value config flags. These values will be
|
||||
placed in the nova.conf [DEFAULT] section.
|
||||
region:
|
||||
type: string
|
||||
default: RegionOne
|
||||
description: OpenStack Region
|
||||
# Monitoring config
|
||||
nagios_context:
|
||||
type: string
|
||||
default: "juju"
|
||||
description: |
|
||||
Used by the nrpe-external-master subordinate charm.
|
||||
A string that will be prepended to instance name to set the host name
|
||||
in nagios. So for instance the hostname would be something like:
|
||||
.
|
||||
juju-myservice-0
|
||||
.
|
||||
If you're running multiple environments with the same services in them
|
||||
this allows you to differentiate between them.
|
||||
nagios_servicegroups:
|
||||
type: string
|
||||
default: ""
|
||||
description: |
|
||||
A comma-separated list of nagios servicegroups. If left empty, the
|
||||
nagios_context will be used as the servicegroup.
|
||||
cell-name:
|
||||
type: string
|
||||
default:
|
||||
description: |
|
||||
Name of the compute cell this controller is associated with. If this is
|
||||
left unset or set to api then it is assumed that this controller will be
|
||||
the top level api and cell0 controller.
|
10
src/layer.yaml
Normal file
10
src/layer.yaml
Normal file
@ -0,0 +1,10 @@
|
||||
includes:
|
||||
- layer:openstack-api
|
||||
- interface:mysql-shared
|
||||
- interface:rabbitmq
|
||||
- interface:nova-compute
|
||||
- interface:nova-cell
|
||||
options:
|
||||
basic:
|
||||
use_venv: true
|
||||
include_system_packages: true
|
13
src/lib/charm/openstack/__init__.py
Normal file
13
src/lib/charm/openstack/__init__.py
Normal file
@ -0,0 +1,13 @@
|
||||
# Copyright 2016 Canonical Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
113
src/lib/charm/openstack/nova_cell_controller.py
Normal file
113
src/lib/charm/openstack/nova_cell_controller.py
Normal file
@ -0,0 +1,113 @@
|
||||
# Copyright 2016 Canonical Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# The nova_cell_controller handlers class
|
||||
|
||||
# bare functions are provided to the reactive handlers to perform the functions
|
||||
# needed on the class.
|
||||
from __future__ import absolute_import
|
||||
|
||||
import collections
|
||||
import subprocess
|
||||
|
||||
import charmhelpers.core.hookenv as hookenv
|
||||
|
||||
import charms_openstack.charm
|
||||
import charms_openstack.adapters
|
||||
import charms_openstack.ip as os_ip
|
||||
|
||||
PACKAGES = ['nova-conductor']
|
||||
NOVA_DIR = '/etc/nova/'
|
||||
NOVA_CONF = NOVA_DIR + "nova.conf"
|
||||
|
||||
OPENSTACK_RELEASE_KEY = 'nova-charm.openstack-release-version'
|
||||
|
||||
|
||||
# select the default release function
|
||||
charms_openstack.charm.use_defaults('charm.default-select-release')
|
||||
|
||||
|
||||
class NovaCellControllerCharm(charms_openstack.charm.HAOpenStackCharm):
|
||||
"""NovaCellControllerCharm provides the specialisation of the OpenStackCharm
|
||||
functionality to manage a nova_cell_controller unit.
|
||||
"""
|
||||
|
||||
release = 'mitaka'
|
||||
name = 'nova-cell-controller'
|
||||
packages = PACKAGES
|
||||
service_type = 'nova-cell-controller'
|
||||
default_service = 'nova-conductor'
|
||||
services = ['nova-conductor']
|
||||
|
||||
# Note that the hsm interface is optional - defined in config.yaml
|
||||
required_relations = ['shared-db', 'amqp']
|
||||
|
||||
restart_map = {
|
||||
NOVA_CONF: services,
|
||||
}
|
||||
|
||||
# Package for release version detection
|
||||
release_pkg = 'nova-common'
|
||||
|
||||
# Package codename map for nova-common
|
||||
package_codenames = {
|
||||
'nova-common': collections.OrderedDict([
|
||||
('13', 'mitaka'),
|
||||
('14', 'newton'),
|
||||
('15', 'ocata'),
|
||||
('16', 'pike'),
|
||||
('17', 'queens'),
|
||||
('18', 'rocky'),
|
||||
]),
|
||||
}
|
||||
|
||||
sync_cmd = ['nova-manage', 'db', 'sync' ,'--local_cell']
|
||||
|
||||
def get_amqp_credentials(self):
|
||||
"""Provide the default amqp username and vhost as a tuple.
|
||||
|
||||
:returns (username, host): two strings to send to the amqp provider.
|
||||
"""
|
||||
return ('nova', 'openstack')
|
||||
|
||||
def get_database_setup(self):
|
||||
"""Provide the default database credentials as a list of 3-tuples
|
||||
|
||||
returns a structure of:
|
||||
[
|
||||
{'database': <database>,
|
||||
'username': <username>,
|
||||
'hostname': <hostname of this unit>
|
||||
'prefix': <the optional prefix for the database>, },
|
||||
]
|
||||
|
||||
:returns [{'database': ...}, ...]: credentials for multiple databases
|
||||
"""
|
||||
return [{'username': 'nova', 'database': 'nova'}]
|
||||
|
||||
|
||||
def states_to_check(self, required_relations=None):
|
||||
"""Override the default states_to_check() for the assess_status
|
||||
functionality so that, if we have to have an HSM relation, then enforce
|
||||
it on the assess_status() call.
|
||||
|
||||
If param required_relations is not None then it overrides the
|
||||
instance/class variable self.required_relations.
|
||||
|
||||
:param required_relations: [list of state names]
|
||||
:returns: [states{} as per parent method]
|
||||
"""
|
||||
if required_relations is None:
|
||||
required_relations = self.required_relations
|
||||
return super(NovaCellControllerCharm, self).states_to_check(
|
||||
required_relations=required_relations)
|
45
src/metadata.yaml
Normal file
45
src/metadata.yaml
Normal file
@ -0,0 +1,45 @@
|
||||
name: nova-cell-controller
|
||||
summary: OpenStack Compute - Nova cloud controller for a cell.
|
||||
maintainer: OpenStack Charmers <openstack-charmers@lists.ubuntu.com>
|
||||
description: |
|
||||
OpenStack is a reliable cloud infrastructure. Its mission is to produce
|
||||
the ubiquitous cloud computing platform that will meet the needs of public
|
||||
and private cloud providers regardless of size, by being simple to implement
|
||||
and massively scalable.
|
||||
.
|
||||
OpenStack Compute, codenamed Nova, is a cloud computing fabric controller. In
|
||||
addition to its "native" API (the OpenStack API), it also supports the Amazon
|
||||
EC2 API.
|
||||
.
|
||||
This charm provides the cloud controller service for OpenStack Nova cell
|
||||
and includes nova-conductor service.
|
||||
tags:
|
||||
- openstack
|
||||
series:
|
||||
- xenial
|
||||
- bionic
|
||||
- artful
|
||||
- trusty
|
||||
extra-bindings:
|
||||
public:
|
||||
admin:
|
||||
internal:
|
||||
provides:
|
||||
nrpe-external-master:
|
||||
interface: nrpe-external-master
|
||||
scope: container
|
||||
cloud-controller:
|
||||
interface: nova
|
||||
requires:
|
||||
shared-db:
|
||||
interface: mysql-shared
|
||||
amqp:
|
||||
interface: rabbitmq
|
||||
cloud-compute:
|
||||
interface: nova-compute
|
||||
nova-cell-compute:
|
||||
interface: nova-cell
|
||||
peers:
|
||||
cluster:
|
||||
interface: nova-ha
|
||||
|
13
src/reactive/__init__.py
Normal file
13
src/reactive/__init__.py
Normal file
@ -0,0 +1,13 @@
|
||||
# Copyright 2016 Canonical Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
107
src/reactive/nova_cell_controller_handlers.py
Normal file
107
src/reactive/nova_cell_controller_handlers.py
Normal file
@ -0,0 +1,107 @@
|
||||
# Copyright 2018 Canonical Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
# this is just for the reactive handlers and calls into the charm.
|
||||
from __future__ import absolute_import
|
||||
|
||||
import charms.reactive as reactive
|
||||
import charmhelpers.core.hookenv as hookenv
|
||||
|
||||
import charms_openstack.charm as charm
|
||||
|
||||
from charms.reactive.relations import (
|
||||
endpoint_from_flag,
|
||||
)
|
||||
|
||||
from charms.reactive.flags import (
|
||||
is_flag_set,
|
||||
set_flag,
|
||||
clear_flag,
|
||||
)
|
||||
|
||||
# This charm's library contains all of the handler code associated with
|
||||
# nova_cell_controller -- we need to import it to get the definitions for the
|
||||
# charm.
|
||||
import charm.openstack.nova_cell_controller as nova_cell_controller # noqa
|
||||
|
||||
|
||||
# Use the charms.openstack defaults for common states and hooks
|
||||
charm.use_defaults(
|
||||
'charm.installed',
|
||||
'amqp.connected',
|
||||
'shared-db.connected',
|
||||
'config.changed',
|
||||
'update-status')
|
||||
|
||||
|
||||
# Note that because of the way reactive.when works, (which is to 'find' the
|
||||
# __code__ segment of the decorated function, it's very, very difficult to add
|
||||
# other kinds of decorators here. This rules out adding other things into the
|
||||
# charm args list. It is also CPython dependent.
|
||||
@reactive.when('shared-db.available')
|
||||
@reactive.when('amqp.available')
|
||||
def render_stuff(*args):
|
||||
"""Render the configuration for Nova cell controller when all the interfaces
|
||||
are available.
|
||||
|
||||
"""
|
||||
hookenv.log("about to call the render_configs with {}".format(args))
|
||||
with charm.provide_charm_instance() as nova_cell_controller_charm:
|
||||
nova_cell_controller_charm.render_with_interfaces(args)
|
||||
nova_cell_controller_charm.assess_status()
|
||||
set_flag('config.rendered')
|
||||
|
||||
|
||||
@reactive.when_not('shared-db.synced')
|
||||
@reactive.when('config.rendered')
|
||||
def db_setup(*args):
|
||||
with charm.provide_charm_instance() as cell_charm:
|
||||
cell_charm.db_sync()
|
||||
cell_charm.restart_all()
|
||||
set_flag('shared-db.synced')
|
||||
|
||||
|
||||
@reactive.when('endpoint.nova-cell-compute.changed')
|
||||
@reactive.when('endpoint.cloud-compute.joined')
|
||||
def send_compute_data():
|
||||
nc = endpoint_from_flag('endpoint.cloud-compute.joined')
|
||||
ncc_ep = endpoint_from_flag('endpoint.nova-cell-compute.changed')
|
||||
ncc_console_data = ncc_ep.get_console_data()
|
||||
ncc_network_data = ncc_ep.get_network_data()
|
||||
nc.set_network_data(
|
||||
ncc_network_data['quantum_url'],
|
||||
neutron_plugin=ncc_network_data['quantum_plugin'],
|
||||
network_manager=ncc_network_data['network_manager'],
|
||||
enable_security_groups=ncc_network_data['quantum_security_groups'])
|
||||
nc.set_console_data(
|
||||
serial_console_base_url=ncc_console_data['serial_console_base_url'],
|
||||
enable_serial_console=ncc_console_data['enable_serial_console'])
|
||||
nc.set_region(ncc_ep.get_region()['region'])
|
||||
nc.set_volume_data(ncc_ep.get_volume_data()['volume_service'])
|
||||
nc.set_ec2_data(ncc_ep.get_ec2_data()['ec2_host'])
|
||||
|
||||
@reactive.when('shared-db.available')
|
||||
@reactive.when('amqp.available')
|
||||
@reactive.when('endpoint.nova-cell-compute.joined')
|
||||
def send_cell_data():
|
||||
ncc_ep = endpoint_from_flag('endpoint.nova-cell-compute.joined')
|
||||
amqp_conv = endpoint_from_flag('amqp.available').conversation()
|
||||
# Push this calculation of service names down into the interfaces
|
||||
amqp_service_names = [u.split('/')[0] for u in amqp_conv.units if u]
|
||||
db_conv = endpoint_from_flag('shared-db.available').conversation()
|
||||
db_service_names = [u.split('/')[0] for u in db_conv.units if u]
|
||||
ncc_ep.send_cell_data(
|
||||
hookenv.config('cell-name'),
|
||||
amqp_service_names[0],
|
||||
db_service_names[0])
|
18
src/templates/mitaka/nova.conf
Normal file
18
src/templates/mitaka/nova.conf
Normal file
@ -0,0 +1,18 @@
|
||||
# mitaka
|
||||
###############################################################################
|
||||
# [ WARNING ]
|
||||
# Configuration file maintained by Juju. Local changes may be overwritten.
|
||||
###############################################################################
|
||||
[DEFAULT]
|
||||
verbose={{ options.verbose }}
|
||||
debug={{ options.debug }}
|
||||
logdir=/var/log/nova
|
||||
state_path=/var/lib/nova
|
||||
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf
|
||||
|
||||
{% include "parts/database" %}
|
||||
|
||||
[conductor]
|
||||
workers = {{ options.workers }}
|
||||
|
||||
{% include "parts/section-rabbitmq-oslo" %}
|
54
tox.ini
Normal file
54
tox.ini
Normal file
@ -0,0 +1,54 @@
|
||||
# Source charm: ./tox.ini
|
||||
# This file is managed centrally by release-tools and should not be modified
|
||||
# within individual charm repos.
|
||||
[tox]
|
||||
skipsdist = True
|
||||
envlist = pep8,py34,py35
|
||||
skip_missing_interpreters = True
|
||||
|
||||
[testenv]
|
||||
setenv = VIRTUAL_ENV={envdir}
|
||||
PYTHONHASHSEED=0
|
||||
TERM=linux
|
||||
LAYER_PATH={toxinidir}/layers
|
||||
JUJU_REPOSITORY={toxinidir}/build
|
||||
passenv = http_proxy https_proxy INTERFACE_PATH
|
||||
install_command =
|
||||
pip install {opts} {packages}
|
||||
deps =
|
||||
-r{toxinidir}/requirements.txt
|
||||
|
||||
[testenv:build]
|
||||
basepython = python2.7
|
||||
commands =
|
||||
charm-build --log-level DEBUG -o {toxinidir}/build src {posargs}
|
||||
|
||||
[testenv:py27]
|
||||
basepython = python2.7
|
||||
# Reactive source charms are Python3-only, but a py27 unit test target
|
||||
# is required by OpenStack Governance. Remove this shim as soon as
|
||||
# permitted. http://governance.openstack.org/reference/cti/python_cti.html
|
||||
whitelist_externals = true
|
||||
commands = true
|
||||
|
||||
[testenv:py34]
|
||||
basepython = python3.4
|
||||
deps = -r{toxinidir}/test-requirements.txt
|
||||
commands = ostestr {posargs}
|
||||
|
||||
[testenv:py35]
|
||||
basepython = python3.5
|
||||
deps = -r{toxinidir}/test-requirements.txt
|
||||
commands = ostestr {posargs}
|
||||
|
||||
[testenv:pep8]
|
||||
basepython = python3.5
|
||||
deps = -r{toxinidir}/test-requirements.txt
|
||||
commands = flake8 {posargs} src unit_tests
|
||||
|
||||
[testenv:venv]
|
||||
commands = {posargs}
|
||||
|
||||
[flake8]
|
||||
# E402 ignore necessary for path append before sys module import in actions
|
||||
ignore = E402
|
Loading…
Reference in New Issue
Block a user