~joeborg/charms/trusty/contrail-configuration/rbac-switch

« back to all changes in this revision

Viewing changes to hooks/contrail_configuration_hooks.py

  • Committer: Robert Ayres
  • Date: 2015-04-24 14:27:43 UTC
  • Revision ID: robert.ayres@canonical.com-20150424142743-3mnfmmgs50sdqysh
Add floating pool functionality

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
import sys
4
4
 
5
5
import json
 
6
import yaml
6
7
 
7
8
from charmhelpers.contrib.openstack.utils import configure_installation_source
8
9
 
33
34
from contrail_configuration_utils import (
34
35
    api_port,
35
36
    check_url,
 
37
    contrail_floating_ip_create,
 
38
    contrail_floating_ip_deactivate,
 
39
    contrail_floating_ip_delete,
 
40
    contrail_floating_ip_use,
36
41
    fix_permissions,
37
42
    provision_metadata,
38
43
    units,
126
131
 
127
132
@hooks.hook("config-changed")
128
133
def config_changed():
129
 
    pass
 
134
    configure_floating_ip_pools()
130
135
 
131
136
def config_get(key):
132
137
    try:
134
139
    except KeyError:
135
140
        return None
136
141
 
 
142
def configure_floating_ip_pools():
 
143
    if config.changed("floating-ip-pools"):
 
144
        floating_pools = config.get("floating-ip-pools")
 
145
        pools = { (pool["project"],
 
146
                   pool["network"],
 
147
                   pool["pool-name"]): set(pool["target-projects"])
 
148
                  for pool in yaml.safe_load(floating_pools) } \
 
149
                if floating_pools else {}
 
150
        previous_floating_pools = config.previous("floating-ip-pools")
 
151
        previous_pools = {}
 
152
        if previous_floating_pools:
 
153
            for pool in yaml.safe_load(previous_floating_pools):
 
154
                projects = pool["target-projects"]
 
155
                name = (pool["project"], pool["network"], pool["pool-name"])
 
156
                if name in pools:
 
157
                    previous_pools[name] = set(projects)
 
158
                else:
 
159
                    floating_ip_pool_delete(name, projects)
 
160
        for name, projects in pools.iteritems():
 
161
            if name not in previous_pools:
 
162
                floating_ip_pool_create(name, projects)
 
163
            else:
 
164
                floating_ip_pool_update(name, projects, previous_pools[name])
 
165
 
 
166
    # ensures config.changed works correctly with unset values
 
167
    if config.get("floating-ip-pools") is None:
 
168
        config["floating-ip-pools"] = None
 
169
 
137
170
@hooks.hook("contrail-api-relation-joined")
138
171
def contrail_api_joined():
139
172
    if config_get("contrail-api-configured"):
168
201
    write_ifmap_config()
169
202
    service_restart("ifmap-server")
170
203
 
 
204
def floating_ip_pool_create(name, projects):
 
205
    fq_network = "default-domain:" + ":".join(name[:2])
 
206
    contrail_floating_ip_create(fq_network, name[2])
 
207
 
 
208
    fq_pool_name = "default-domain:" + ":".join(name)
 
209
    for project in projects:
 
210
        fq_project = "default-domain:" + project
 
211
        contrail_floating_ip_use(fq_project, fq_pool_name)
 
212
 
 
213
def floating_ip_pool_delete(name, projects):
 
214
    fq_pool_name = "default-domain:" + ":".join(name)
 
215
    for project in projects:
 
216
        fq_project = "default-domain:" + project
 
217
        contrail_floating_ip_deactivate(fq_project, fq_pool_name)
 
218
 
 
219
    fq_network = "default-domain:" + ":".join(name[:2])
 
220
    contrail_floating_ip_delete(fq_network, name[2])
 
221
 
 
222
def floating_ip_pool_update(name, projects, previous_projects):
 
223
    fq_pool_name = "default-domain:" + ":".join(name)
 
224
    for project in (previous_projects - projects):
 
225
        fq_project = "default-domain:" + project
 
226
        contrail_floating_ip_deactivate(fq_project, fq_pool_name)
 
227
    for project in (projects - previous_projects):
 
228
        fq_project = "default-domain:" + project
 
229
        contrail_floating_ip_use(fq_project, fq_pool_name)
 
230
 
171
231
@hooks.hook("identity-admin-relation-changed")
172
232
def identity_admin_changed():
173
233
    if not relation_get("service_hostname"):