add common config and parse it to prepare deploy 75/24475/36
authorYao Lu <lu.yao135@zte.com.cn>
Thu, 17 Nov 2016 08:02:52 +0000 (16:02 +0800)
committerYao Lu <lu.yao135@zte.com.cn>
Sat, 19 Nov 2016 09:36:40 +0000 (09:36 +0000)
Change-Id: I864082b885a4c7117f0b546da602e9580e8ccf46
Signed-off-by: Yao Lu <lu.yao135@zte.com.cn>
ci/deploy/deploy.sh
deploy/config/vm_environment/zte-virtual1/deploy.yml [new file with mode: 0644]
deploy/config/vm_environment/zte-virtual1/network.yml [new file with mode: 0644]
deploy/get_conf.py [new file with mode: 0755]
deploy/tempest.py [new file with mode: 0755]

index 29c63cd..11865b4 100755 (executable)
@@ -2,7 +2,7 @@
 ##############################################################################
 # Copyright (c) 2016 ZTE Coreporation and others.
 # hu.zhijiang@zte.com.cn
-# sun.jing22@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
 ######exit before finish test#######
 exit 0
 
-##########TODO after test#########################
-DAISYDIR=$WORKSPACE
-json_file=$DAISYDIR/deploy/config/vm_environment/zte-virtual/template.json
-source ~/daisyrc_admin
-daisy discover-host-add 192.168.122.152 ossdbg1
-daisy discover-host
+##########TODO after test##########
+DHA=$1
+NETWORK=$2
+tempest_path=$WORKSPACE/deploy
 
-cnt=30
-while [ $cnt -ge 0 ]; do
-    host_id=`daisy host-list | awk -F "|" '{print $2}'| grep -o "[^ ]\+\( \+[^ ]\+\)*" `
-    if [ -z "$host_id" ]; then
-        echo "host have not discoverd , loop again  ... "
-        cnt=$[$cnt-1]
-        sleep 30
-    else
-        echo "host list checkout successful... "
-    break
-    fi
-done
-daisy host-list
+echo "====== clean && install daisy==========="
+.$WORKSPACE/opnfv.bin  clean
+rc=$?
+if [ $rc -ne 0 ]; then
+    echo "daisy clean failed"
+    exit 1
+else
+    echo "daisy clean successfully"
+fi
+.$WORKSPACE/opnfv.bin  install
+rc=$?
+if [ $rc -ne 0 ]; then
+    echo "daisy install failed"
+    exit 1
+else
+    echo "daisy install successfully"
+fi
 
-echo "======prepare install os(centos) & kolla(openstack) ==========="
-daisy import-json-to-template $json_file
-daisy import-template-to-db template testdaisy
-daisy template-to-host testdaisy DaisyNode $host_id
+source ~/daisyrc_admin
+
+echo "======prepare install openstack==========="
+python $tempest_path/tempest.py --dha $DHA --network $NETWORK
 
 echo "======daisy install kolla(openstack)==========="
 cluster_id=`daisy cluster-list | awk -F "|" '{print $2}' | sed -n '4p'`
 daisy install $cluster_id
-
 echo "check installing proess..."
 var=1
 while [ $var -eq 1 ]; do
diff --git a/deploy/config/vm_environment/zte-virtual1/deploy.yml b/deploy/config/vm_environment/zte-virtual1/deploy.yml
new file mode 100644 (file)
index 0000000..5390ecf
--- /dev/null
@@ -0,0 +1,20 @@
+hosts:
+- name: 'Node5'
+  roles:
+  - 'CONTROLLER_LB'
+  - 'COMPUTER'
+  ip: '192.168.122.152'
+  password: 'ossdbg1'
+  interface:
+  - 'ens3':
+    - name: 'MANAGEMENT'
+      ip: '192.168.122.152'
+    - name: 'PUBLICAPI'
+      ip:
+    - name: 'physnet1'
+      ip:
+    - name: 'STORAGE'
+      ip:
+    'ens8':
+    - name: 'EXTERNAL'
+      ip:
diff --git a/deploy/config/vm_environment/zte-virtual1/network.yml b/deploy/config/vm_environment/zte-virtual1/network.yml
new file mode 100644 (file)
index 0000000..50fca1b
--- /dev/null
@@ -0,0 +1,50 @@
+##############################################################################
+# Copyright (c) 2016 ZTE Coreporation and others.
+# hu.zhijiang@zte.com.cn
+# sun.jing22@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
+##############################################################################
+
+network-config-metadata:
+  title: 'zte-virtual1 network config'
+  version: '0.1'
+  created: 'Mon Oct 31 2016'
+  comment:
+networks:
+- cidr: '192.168.122.0/24'
+  gateway: '192.168.122.1'
+  ip_ranges:
+  - 'start': '192.168.122.1'
+    'end': '192.168.122.254'
+  name: 'MANAGEMENT'
+- cidr: '192.168.122.0/24'
+  gateway: '192.168.122.1'
+  ip_ranges:
+  - start: '192.168.122.1'
+    end: '192.168.122.254'
+  name: 'STORAGE'
+- cidr: '192.168.2.0/24'
+  gateway: '192.168.2.1'
+  ip_ranges:
+  - 'start': '192.168.2.1'
+    'end': '192.168.2.254'
+  'name': 'EXTERNAL'
+- cidr: '192.168.122.0/24'
+  gateway: '192.168.122.1'
+  ip_ranges:
+  - 'start': '192.168.122.1'
+    'end': '192.168.122.254'
+  name: 'PUBLICAPI'
+- cidr: '192.168.122.0/24'
+  gateway: '192.168.122.1'
+  ip_ranges:
+  - 'start': '192.168.122.1'
+    'end': '192.168.122.254'
+  name: 'physnet1'
+
+internal_vip: '192.168.122.144'
+
+public_vip: '192.168.122.144'
diff --git a/deploy/get_conf.py b/deploy/get_conf.py
new file mode 100755 (executable)
index 0000000..37cacb5
--- /dev/null
@@ -0,0 +1,123 @@
+#!/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
+##############################################################################
+import yaml
+
+
+def init(file):
+    with open(file) as fd:
+        return yaml.load(fd)
+
+
+def networkdecorator(func):
+    def wrapter(s, seq):
+        network_list = s.get('networks', [])
+        result = {}
+        for network in network_list:
+            s = func(s, seq, network)
+            if not s:
+                continue
+            result.update(s)
+        if len(result) == 0:
+            return ""
+        else:
+            return result
+    return wrapter
+
+
+def hostdecorator(func):
+    def wrapter(s, seq):
+        host_list = s.get('hosts', [])
+        result = {}
+        for host in host_list:
+            s = func(s, seq, host)
+            if not s:
+                continue
+            result.update(s)
+        if len(result) == 0:
+            return ""
+        else:
+            return result
+    return wrapter
+
+
+def decorator(func):
+    def wrapter(s, seq):
+        host_list = s.get('hosts', [])
+        result = []
+        for host in host_list:
+            s = func(s, seq, host)
+            if not s:
+                continue
+            result.append(s)
+        if len(result) == 0:
+            return ""
+        else:
+            return result
+    return wrapter
+
+
+@networkdecorator
+def network(s, seq, network=None):
+    net_plane = network.get('name', '')
+    network.pop('name')
+    map = {}
+    map[net_plane] = network
+    return map
+
+
+@hostdecorator
+def interface(s, seq, host=None):
+    hostname = host.get('name', '')
+    interface = host.get('interface', '')[0]
+    map = {}
+    map[hostname] = interface
+    return map
+
+
+@hostdecorator
+def role(s, seq, host=None):
+    hostname = host.get('name', '')
+    role = host.get('roles', '')
+    map = {}
+    map[hostname] = role
+    return map
+
+
+@decorator
+def host(s, seq, host=None):
+    hostip = host.get('ip', [])
+    passwd = host.get('password', [])
+    map = {}
+    map = {'ip': hostip, 'passwd': passwd}
+    return map
+
+
+def network_config_parse(s, dha_file):
+    network_map = network(s, ',')
+    vip = s.get('internal_vip')
+    return network_map, vip
+
+
+def dha_config_parse(s, dha_file):
+    host_interface_map = interface(s, ',')
+    host_role_map = role(s, ',')
+    host_ip_passwd_map = host(s, ',')
+    return host_interface_map, host_role_map, host_ip_passwd_map
+
+
+def config(dha_file, network_file):
+    data = init(dha_file)
+    host_interface_map, host_role_map, host_ip_passwd_map = \
+        dha_config_parse(data, dha_file)
+    data = init(network_file)
+    network_map, vip = network_config_parse(data, network_file)
+    return host_interface_map, host_role_map, \
+        host_ip_passwd_map, network_map, vip
diff --git a/deploy/tempest.py b/deploy/tempest.py
new file mode 100755 (executable)
index 0000000..011f1e5
--- /dev/null
@@ -0,0 +1,164 @@
+#!/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()