#!/usr/bin/python ############################################################################## # Copyright (c) 2016 ZTE Coreporation and others. # hu.zhijiang@zte.com.cn # lu.yao135@zte.com.cn # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## from oslo_config import cfg import sys from daisyclient.v1 import client as daisy_client import get_conf import traceback import time import subprocess daisy_version = 1.0 daisy_endpoint = "http://127.0.0.1:19292" client = daisy_client.Client(version=daisy_version, endpoint=daisy_endpoint) cluster_name = "clustertest" _CLI_OPTS = [ cfg.StrOpt('dha', help='The dha file path'), cfg.StrOpt('network', help='The network file path'), ] # ------------------------------------------------------------------------------------------ def parse(conf, args): conf.register_cli_opts(_CLI_OPTS) conf(args=args) def print_bar(msg): print ("--------------------------------------------") print (msg) print ("--------------------------------------------") def foo(): try: print("get config...") conf = cfg.ConfigOpts() parse(conf, sys.argv[1:]) host_interface_map, host_role_map, \ host_ip_passwd_map, network_map, vip = \ get_conf.config(conf['dha'], conf['network']) print("clean deploy host...") clean_deploy_host(host_ip_passwd_map) print("discover host...") discover_host(host_ip_passwd_map) print("add cluster...") cluster_meta = {'name': cluster_name, 'description': ''} clusters_info = client.clusters.add(**cluster_meta) cluster_id = clusters_info.id print("cluster_id=%s." % cluster_id) print("update network...") update_network(cluster_id, network_map) print("update hosts interface...") hosts_info = get_hosts() add_hosts_interface(cluster_id, hosts_info, host_interface_map, host_role_map, vip) except Exception: print("Deploy failed!!!.%s." % traceback.format_exc()) else: print_bar("Everything is done!") def clean_deploy_host(host_ip_passwd_map): for host_ip_passwd in host_ip_passwd_map: command = 'sshpass -p %s ssh %s -o UserKnownHostsFile=/dev/null \ -oStrictHostKeyChecking=no \ "/home/daisy/forDel/tools/cleanup-containers"' % \ (host_ip_passwd['passwd'], host_ip_passwd['ip']) subprocess.call(command, shell=True, stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT) command = 'sshpass -p %s ssh %s -o UserKnownHostsFile=/dev/null \ -oStrictHostKeyChecking=no \ "/home/daisy/forDel/tools/cleanup-images"' % \ (host_ip_passwd['passwd'], host_ip_passwd['ip']) subprocess.call(command, shell=True, stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT) def discover_host(host_ip_passwd_map): for host_ip_passwd in host_ip_passwd_map: client.hosts.add_discover_host(**host_ip_passwd) client.hosts.discover_host() while True: hosts_info = get_hosts() if len(hosts_info) == len(host_ip_passwd_map): print('discover hosts success!') break else: time.sleep(10) def update_network(cluster_id, network_map): network_meta = {'filters': {'cluster_id': cluster_id}} network_info_gernerator = client.networks.list(**network_meta) network_info_list = [net for net in network_info_gernerator] for net in network_info_list: network_id = net.id network_name = net.name if network_map.get(network_name): network_meta = network_map[network_name] client.networks.update(network_id, **network_meta) def get_hosts(): hosts_list_generator = client.hosts.list() hosts_list = [host for host in hosts_list_generator] hosts_info = [] for host in hosts_list: host_info = client.hosts.get(host.id) hosts_info.append(host_info) return hosts_info def add_hosts_interface(cluster_id, hosts_info, host_interface_map, host_role_map, vip): for host in hosts_info: host = host.to_dict() host['cluster'] = cluster_id host_name = host['name'] for interface in host['interfaces']: interface_name = interface['name'] interface['assigned_networks'] = \ host_interface_map[host_name][interface_name] client.hosts.update(host['id'], **host) print("update role...") add_host_role(cluster_id, host['id'], host['name'], host_role_map, vip) def add_host_role(cluster_id, host_id, host_name, host_role_map, vip): role_meta = {'filters': {'cluster_id': cluster_id}} role_list_generator = client.roles.list(**role_meta) role_list = [role for role in role_list_generator] lb_role_id = [role.id for role in role_list if role.name == "CONTROLLER_LB"][0] computer_role_id = [role.id for role in role_list if role.name == "COMPUTER"][0] if "CONTROLLER_LB" in host_role_map[host_name]: role_lb_update_meta = {'nodes': [host_id], 'cluster_id': cluster_id, 'vip': vip} client.roles.update(lb_role_id, **role_lb_update_meta) if "COMPUTER" in host_role_map[host_name]: role_computer_update_meta = {'nodes': [host_id], 'cluster_id': cluster_id} client.roles.update(computer_role_id, **role_computer_update_meta) if __name__ == "__main__": foo()