~ibmcharmers/charms/trusty/ibm-glance-spectrumscale/trunk

« back to all changes in this revision

Viewing changes to hooks/config-changed

  • Committer: Suchitra Venugopal
  • Date: 2017-01-27 11:21:55 UTC
  • Revision ID: suchvenu@in.ibm.com-20170127112155-crrgnwmavhqnu93n
IBM Glance SpectrumScale charm

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
 
#
3
 
# Copyright 2016 Canonical Ltd
4
 
#
5
 
# Licensed under the Apache License, Version 2.0 (the "License");
6
 
# you may not use this file except in compliance with the License.
7
 
# You may obtain a copy of the License at
8
 
#
9
 
#  http://www.apache.org/licenses/LICENSE-2.0
10
 
#
11
 
# Unless required by applicable law or agreed to in writing, software
12
 
# distributed under the License is distributed on an "AS IS" BASIS,
13
 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 
# See the License for the specific language governing permissions and
15
 
# limitations under the License.
16
 
 
17
 
import os
18
 
import sys
19
 
import json
20
 
import os.path
21
 
 
22
 
from cinder_contexts import SpectrumScaleSubordinateContext
23
 
 
24
 
from subprocess import (
25
 
    call,
26
 
    check_call,
27
 
)
28
 
 
29
 
from charmhelpers.core.hookenv import (
30
 
    Hooks,
31
 
    UnregisteredHookError,
32
 
    config,
33
 
    service_name,
34
 
    relation_set,
35
 
    relation_get,
36
 
    relation_ids,
37
 
    status_set,
38
 
    log,
39
 
    unit_get,
40
 
)
41
 
from charmhelpers.core.host import (
42
 
    service_restart,
43
 
)
44
 
from charmhelpers.contrib.openstack.utils import (
45
 
    os_application_version_set,
46
 
)
47
 
 
48
 
from shlex import split
49
 
import socket
50
 
 
51
 
VERSION_PACKAGE = 'cinder-common'
52
 
hooks = Hooks()
53
 
 
54
 
private_ip_address = unit_get('private-address')
55
 
 
56
 
 
57
 
# Block of code for adding hostname details in /etc/hosts file.
58
 
def setadd_hostname(hostname, ip_address):
59
 
    try:
60
 
        socket.gethostbyname(hostname)
61
 
    except:
62
 
        log("IBM CINDER SPECTRUM SCALE : Hostname not resolving, \
63
 
            adding to /etc/hosts")
64
 
    with open("/etc/hosts", "a") as hostfile:
65
 
        hostfile.write("%s %s\n" % (ip_address, hostname))
66
 
        hostfile.close()
67
 
 
68
 
 
69
 
# Block of code to update the client ip values in a file
70
 
def update_iplist(publicip):
71
 
    ipfilename = './client_ips.txt'
72
 
    ipexists = False
73
 
    if os.path.isfile(ipfilename):
74
 
        ipfile = open(ipfilename, "r")
75
 
        for line in ipfile:
76
 
            if publicip in line:
77
 
                ipexists = True
78
 
        ipfile.close()
79
 
    if ipexists is False:
80
 
        # add the ip to the file
81
 
        with open(ipfilename, "a") as ipfile:
82
 
            ipfile.write("%s\n" % publicip)
83
 
            ipfile.close()
84
 
 
85
 
 
86
 
# Block of code to update the etc/hosts files with the client ip and hostname
87
 
def update_etchosts_file(privateip, clienthost):
88
 
    # Check whether the manager host details are added in /etc/hosts file,
89
 
    # if it does not exist, then add it
90
 
    log("IBM CINDER SPECTRUM SCALE : Editing the etc hosts file")
91
 
    filepath = "/etc/hosts"
92
 
    exists = False
93
 
    searchtext = str(privateip)+" "+str(clienthost)
94
 
    searchfile = open(filepath, "r")
95
 
    for line in searchfile:
96
 
        if searchtext in line:
97
 
            exists = True
98
 
    searchfile.close()
99
 
    if exists is False:
100
 
        setadd_hostname(clienthost, privateip)
101
 
 
102
 
 
103
 
# Block of code to remove the entry from etc/hosts file when relation is broken
104
 
def deletefrom_etchosts_file(privateip, clienthost):
105
 
    filepath = "/etc/hosts"
106
 
    searchtext = str(privateip)+" "+str(clienthost)
107
 
    searchfile = open(filepath, "r+")
108
 
    lines = searchfile.readlines()
109
 
    searchfile.seek(0)
110
 
    for line in lines:
111
 
        if str(line.strip()) != str(searchtext):
112
 
            searchfile.write(line)
113
 
    searchfile.truncate()
114
 
    searchfile.close()
115
 
 
116
 
 
117
 
def get_spectrumscale_request():
118
 
 
119
 
    mount_point_base = config('gpfs_mount_point_base')
120
 
    log("IBM CINDER SPECTRUM SCALE : Mount point val %s" % mount_point_base)
121
 
    if str(mount_point_base) == 'None' and str(mount_point_base) != '':
122
 
        status_set('blocked', 'IBM Cinder-SpectrumScale: \
123
 
                Please specify GPFS Mount point')
124
 
        return 0
125
 
 
126
 
    volumedriver = config('volume-driver')
127
 
    sparse_volumes = config('gpfs_sparse_volumes')
128
 
    storage_pool = config('gpfs_storage_pool')
129
 
    gpfslogin = config('gpfs_user_login')
130
 
    private_key = config('gpfs_private_key')
131
 
    sshport = config('gpfs_ssh_port')
132
 
    gpfs_images_dir = config('gpfs_images_dir')
133
 
    gpfs_images_share_mode = config('gpfs_images_share_mode')
134
 
    data = {"volume-driver": volumedriver,
135
 
            "gpfs_mount_point_base": mount_point_base,
136
 
            "gpfs_sparse_volumes": sparse_volumes,
137
 
            "gpfs_storage_pool": storage_pool,
138
 
            "gpfs-login": gpfslogin,
139
 
            "gpfs_private_key": private_key,
140
 
            "gpfs-ssh-port": sshport,
141
 
            "gpfs_images_dir": gpfs_images_dir,
142
 
            "gpfs_images_share_mode": gpfs_images_share_mode,
143
 
            }
144
 
    return data
145
 
 
146
 
 
147
 
# Send  the SSH key, private ip and hostname to the client  charm to be
148
 
# updated in etc/hosts file
149
 
@hooks.hook('spectrumscale-relation-joined')
150
 
def spectrumscale_joined():
151
 
    if not os.path.isfile("/root/.ssh/id_rsa"):
152
 
        call(split('ssh-keygen -q -N "" -f /root/.ssh/id_rsa'))
153
 
        # Ensure permissions are good
154
 
        check_call(['chmod', '0600', '/root/.ssh/id_rsa.pub'])
155
 
        check_call(['chmod', '0600', '/root/.ssh/id_rsa'])
156
 
        call(split('cp /root/.ssh/id_rsa /var/lib/cinder'))
157
 
        call(split('chown cinder:cinder /var/lib/cinder/id_rsa'))
158
 
 
159
 
    with open("/root/.ssh/id_rsa.pub", "r") as idfile:
160
 
        pubkey = idfile.read()
161
 
        idfile.close()
162
 
        hostname = socket.gethostname()
163
 
        relation_set(key=pubkey)
164
 
        relation_set(cinderdriver_private_ip_address=private_ip_address)
165
 
        relation_set(cinderdriver_hostname=hostname)
166
 
        log("IBM CINDER SPECTRUM SCALE : Sending the values to Scale charm")
167
 
        log("Pub key=%s" % pubkey)
168
 
        log("Private ip=%s" % private_ip_address)
169
 
        log("Hostname=%s" % hostname)
170
 
        status_set('maintenance', 'IBM Cinder-SpectrumScale: \
171
 
                Sending Public key to SpectrumScale client')
172
 
 
173
 
 
174
 
@hooks.hook('spectrumscale-relation-changed')
175
 
def spectrumscale_changed():
176
 
    publicip = relation_get('client_public_ip')
177
 
    privateip = relation_get('client_private_ip')
178
 
    clienthost = relation_get('client_hostname')
179
 
    log("IBM CINDER SPECTRUM SCALE : Received the values from Scale client")
180
 
    log("privateip = %s" % privateip)
181
 
    log("clienthost =%s" % clienthost)
182
 
    log("publicip = %s" % publicip)
183
 
 
184
 
    if str(publicip) == 'None' or str(privateip) == 'None' or \
185
 
            str(clienthost) == 'None':
186
 
        return
187
 
 
188
 
    update_iplist(publicip)
189
 
    update_etchosts_file(privateip, clienthost)
190
 
 
191
 
    data = get_spectrumscale_request()
192
 
    if str(data) == '0':
193
 
        return
194
 
 
195
 
    for rid in relation_ids('storage-backend'):
196
 
        storage_backend(rid, publicip, data)
197
 
    status_set('maintenance', 'IBM Cinder-SpectrumScale: Cinder.conf updated')
198
 
    # Restart the cinder volume service
199
 
    service_restart('cinder-volume')
200
 
    status_set('active', 'IBM Cinder-SpectrumScale: Ready')
201
 
 
202
 
 
203
 
@hooks.hook('spectrumscale-relation-departed')
204
 
def spectrumscale_departed():
205
 
    publicip = relation_get('client_public_ip')
206
 
    privateip = relation_get('client_private_ip')
207
 
    clienthost = relation_get('client_hostname')
208
 
 
209
 
    log("IBM CINDER SPECTRUM SCALE : Departing relation with :")
210
 
    log("privateip = %s" % privateip)
211
 
    log("clinethost =%s" % clienthost)
212
 
    log("publicip = %s" % publicip)
213
 
 
214
 
    # check the ip in the clinetip file and remove the entry there.
215
 
    ipfilename = './client_ips.txt'
216
 
    ipfile = open(ipfilename, "r+")
217
 
    lines = ipfile.readlines()
218
 
    ipfile.seek(0)
219
 
    for line in lines:
220
 
        if str(line.strip()) != str(publicip):
221
 
            ipfile.write(line)
222
 
    ipfile.truncate()
223
 
    ipfile.close()
224
 
 
225
 
    deletefrom_etchosts_file(privateip, clienthost)
226
 
 
227
 
    data = get_spectrumscale_request()
228
 
    if str(data) == '0':
229
 
        return
230
 
 
231
 
    for rid in relation_ids('storage-backend'):
232
 
        storage_backend(rid, publicip, data)
233
 
    status_set('maintenance', 'IBM Cinder-SpectrumScale: Cinder.conf updated')
234
 
    # Restart the cinder volume service
235
 
    service_restart('cinder-volume')
236
 
    status_set('active', 'IBM Cinder-SpectrumScale: Ready')
237
 
 
238
 
 
239
 
@hooks.hook('config-changed')
240
 
def write_and_restart():
241
 
    status_set('maintenance', 'IBM Cinder-SpectrumScale: Updating config vals')
242
 
    spectrumscaledata = get_spectrumscale_request()
243
 
 
244
 
    if str(spectrumscaledata) == '0':
245
 
        return
246
 
 
247
 
    # Take the public ip from the file
248
 
    ipfilename = './client_ips.txt'
249
 
    if not os.path.isfile(ipfilename):
250
 
        log("File doesn't exist")
251
 
        return
252
 
    else:
253
 
        ipfile = open(ipfilename, "r")
254
 
        line = ipfile.readlines()
255
 
        ipfile.close()
256
 
 
257
 
    ip = line[:1]
258
 
    for rid in relation_ids('storage-backend'):
259
 
        storage_backend(rid, publicip=ip, data=spectrumscaledata)
260
 
    status_set('maintenance', 'IBM Cinder-SpectrumScale: Config vals updated')
261
 
    # Restart the cinder volume service
262
 
    service_restart('cinder-volume')
263
 
    status_set('active', 'IBM Cinder-SpectrumScale: Ready')
264
 
 
265
 
 
266
 
@hooks.hook('storage-backend-relation-joined')
267
 
def storage_backend(rel_id=None, publicip=None, data=None):
268
 
    if str(publicip) == 'None':
269
 
        log("Data not yet availabale, returning")
270
 
        return
271
 
 
272
 
    relation_set(
273
 
        relation_id=rel_id,
274
 
        backend_name=service_name(),
275
 
        subordinate_configuration=json.dumps
276
 
        (SpectrumScaleSubordinateContext()(data)), stateless=True,)
277
 
 
278
 
 
279
 
@hooks.hook('storage-backend-relation-changed')
280
 
def storage_backend_changed():
281
 
    # NOTE(jamespage) recall storage_backend as this only ever
282
 
    # changes post initial creation if the cinder charm is upgraded to a new
283
 
    # version of openstack.a
284
 
    spectrumscaledata = get_spectrumscale_request()
285
 
    if str(spectrumscaledata) == '0':
286
 
        return
287
 
    storage_backend(data=spectrumscaledata)
288
 
 
289
 
 
290
 
@hooks.hook('upgrade-charm')
291
 
def upgrade_charm():
292
 
    spectrumscaledata = get_spectrumscale_request()
293
 
    if str(spectrumscaledata) == '0':
294
 
        return
295
 
    for rid in relation_ids('storage-backend'):
296
 
        storage_backend(rel_id=rid, data=spectrumscaledata)
297
 
 
298
 
 
299
 
if __name__ == '__main__':
300
 
    try:
301
 
        hooks.execute(sys.argv)
302
 
    except UnregisteredHookError as e:
303
 
        log('Unknown hook {} - skipping.'.format(e))
304
 
    os_application_version_set(VERSION_PACKAGE)