From 75b97e76c375920f5fcaee35114b37287c641c7d Mon Sep 17 00:00:00 2001 From: Liam Young Date: Fri, 20 May 2016 08:28:56 +0000 Subject: [PATCH] Initial commit of interface --- __init__.py | 0 interfaces.yaml | 3 +++ peers.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 __init__.py create mode 100644 interfaces.yaml create mode 100644 peers.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/interfaces.yaml b/interfaces.yaml new file mode 100644 index 0000000..afbbed6 --- /dev/null +++ b/interfaces.yaml @@ -0,0 +1,3 @@ +name: openstack-ha +summary: Interface for peer relation +maintainer: OpenStack Charmers diff --git a/peers.py b/peers.py new file mode 100644 index 0000000..8780e48 --- /dev/null +++ b/peers.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# 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. + +from charms.reactive import RelationBase +from charms.reactive import hook +from charms.reactive import scopes + +class OpenstackHAPeers(RelationBase): + scope = scopes.UNIT + + @hook('{peers:openstack-ha}-relation-joined') + def joined(self): + conv = self.conversation() + conv.set_state('{relation_name}.joined') + + @hook('{peers:openstack-ha}-relation-changed') + def changed(self): + conv = self.conversation() + conv.set_state('{relation_name}.connected') + if self.data_complete(conv): + conv.set_state('{relation_name}.available') + + def ip_map(self, address_key='private-address'): + nodes = [] + for conv in self.conversations(): + host_name = conv.scope.replace('/', '-') + nodes.append((host_name, conv.get_remote(address_key))) + + return nodes + + @hook('{peers:openstack-ha}-relation-{broken,departed}') + def departed_or_broken(self): + conv = self.conversation() + conv.remove_state('{relation_name}.connected') + if not self.data_complete(conv): + conv.remove_state('{relation_name}.available') + + def data_complete(self, conv): + """ + Get the connection string, if available, or None. + """ + data = { + 'private_address': conv.get_remote('private-address'), + } + if all(data.values()): + return True + return False