blob: 61425f35a4e4ca0ef967ce5d941d12a4fd1c8595 [file] [log] [blame]
# OSM devops/charms - Ansible charm inside OSM devops
#
# Copyright 2017-2018 Universidad Carlos III de Madrid
# Copyright 2018 Altran
#
# 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 charmhelpers.core.hookenv import (
action_get,
action_fail,
action_set,
config,
status_set,
)
from charms.reactive import (
remove_state as remove_flag,
set_state as set_flag,
when,
)
import charms.sshproxy
from subprocess import (
Popen,
CalledProcessError,
PIPE,
)
#from charms.ansible import apply_playbook
import os, fnmatch
import subprocess
cfg = config()
# Sets the status of the charm to show in OSM: configured
@when('config.changed')
def config_changed():
set_flag('ansible-charm.configured')
status_set('active', 'ready!')
return
# Edits ansible config files and executes ansible-playbook
@when('ansible-charm.configured')
@when('actions.ansible-playbook')
def ansible_playbook():
try:
# Retrieve the ssh parameter
cfg = config()
# edit ansible hosts file with the VNF parameters
h = open("/etc/ansible/hosts", "wt")
h.write("[test]\n")
h1 = "{} ansible_connection=ssh ansible_ssh_user={} ansible_ssh_pass={} ansible_python_interpreter=/usr/bin/python3\n".format(cfg['ssh-hostname'],cfg['ssh-username'],cfg['ssh-password'])
h.write(h1)
h.close()
# edit ansible config to enable ssh connection with th VNF
c = open("/etc/ansible/ansible.cfg", "wt")
c.write("[defaults]\n")
c.write("host_key_checking = False\n")
c.close()
# execute the ansible playbook
path = find('playbook.yaml','/var/lib/juju/agents/')
call = ['ansible-playbook', path]
subprocess.check_call(call)
except Exception as e:
action_fail('command failed: {}, errors: {}'.format(e, e.output))
remove_flag('actions.ansible-playbook')
return
finally:
remove_flag('actions.ansible-playbook')
# Function to find the playbook path
def find(pattern, path):
result = ''
for root, dirs, files in os.walk(path):
for name in files:
if fnmatch.fnmatch(name, pattern):
result = os.path.join(root, name)
return result