3d4e5d0af6
Moved roles to the parent directory so that different adapters don't have to have duplicated roles in their respective paths. patch2: fix some code to follow new pep8 standards. Change-Id: I748c1730be8045c1cb83f91eaa9f0f551cd20a6f
306 lines
9.3 KiB
Python
Executable File
306 lines
9.3 KiB
Python
Executable File
#!/usr/bin/python
|
|
#
|
|
# Copyright 2014 Huawei Technologies Co. Ltd
|
|
#
|
|
# 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.
|
|
|
|
"""Example code to deploy a cluster by compass client api."""
|
|
import os
|
|
import re
|
|
import requests
|
|
import sys
|
|
import time
|
|
|
|
from compass.apiclient.restful import Client
|
|
|
|
|
|
COMPASS_SERVER_URL = 'http://127.0.0.1/api'
|
|
SWITCH_IP = '10.145.81.220'
|
|
SWITCH_SNMP_VERSION = 'v2c'
|
|
SWITCH_SNMP_COMMUNITY = 'public'
|
|
# MACHINES_TO_ADD = ['00:11:20:30:40:01']
|
|
CLUSTER_NAME = 'cluster2'
|
|
HOST_NAME_PREFIX = 'host'
|
|
SERVER_USERNAME = 'root'
|
|
SERVER_PASSWORD = 'root'
|
|
SERVICE_USERNAME = 'service'
|
|
SERVICE_PASSWORD = 'service'
|
|
CONSOLE_USERNAME = 'console'
|
|
CONSOLE_PASSWORD = 'console'
|
|
HA_VIP = ''
|
|
# NAMESERVERS = '192.168.10.6'
|
|
SEARCH_PATH = 'ods.com'
|
|
# GATEWAY = '192.168.10.6'
|
|
# PROXY = 'http://192.168.10.6:3128'
|
|
# NTP_SERVER = '192.168.10.6'
|
|
MANAGEMENT_IP_START = '192.168.10.130'
|
|
MANAGEMENT_IP_END = '192.168.10.254'
|
|
MANAGEMENT_IP_GATEWAY = '192.168.10.1'
|
|
MANAGEMENT_NETMASK = '255.255.255.0'
|
|
MANAGEMENT_NIC = 'eth0'
|
|
MANAGEMENT_PROMISC = 0
|
|
TENANT_IP_START = '192.168.10.100'
|
|
TENANT_IP_END = '192.168.10.255'
|
|
TENANT_IP_GATEWAY = '192.168.10.1'
|
|
TENANT_NETMASK = '255.255.255.0'
|
|
TENANT_NIC = 'eth0'
|
|
TENANT_PROMISC = 0
|
|
PUBLIC_IP_START = '12.234.32.100'
|
|
PUBLIC_IP_END = '12.234.32.255'
|
|
PUBLIC_IP_GATEWAY = '12.234.32.1'
|
|
PUBLIC_NETMASK = '255.255.255.0'
|
|
PUBLIC_NIC = 'eth1'
|
|
PUBLIC_PROMISC = 1
|
|
STORAGE_IP_START = '172.16.100.100'
|
|
STORAGE_IP_END = '172.16.100.255'
|
|
STORAGE_NETMASK = '255.255.255.0'
|
|
STORAGE_IP_GATEWAY = '172.16.100.1'
|
|
STORAGE_NIC = 'eth0'
|
|
STORAGE_PROMISC = 0
|
|
HOME_PERCENTAGE = 5
|
|
TMP_PERCENTAGE = 5
|
|
VAR_PERCENTAGE = 10
|
|
# ROLES_LIST = [['os-dashboard']]
|
|
|
|
PRESET_VALUES = {
|
|
'NAMESERVERS': '192.168.10.1',
|
|
'NTP_SERVER': '192.168.10.1',
|
|
'GATEWAY': '192.168.10.1',
|
|
'PROXY': 'http://192.168.10.1:3128',
|
|
'ROLES_LIST': 'os-dashboard',
|
|
'MACHINES_TO_ADD': '00:11:20:30:40:01',
|
|
'BUILD_TIMEOUT': 60
|
|
}
|
|
for v in PRESET_VALUES:
|
|
if v in os.environ.keys():
|
|
PRESET_VALUES[v] = os.environ.get(v)
|
|
print (v + PRESET_VALUES[v] + " is set by env variables")
|
|
else:
|
|
print (PRESET_VALUES[v])
|
|
|
|
# get apiclient object.
|
|
client = Client(COMPASS_SERVER_URL)
|
|
|
|
|
|
# get all switches.
|
|
status, resp = client.get_switches()
|
|
print 'get all switches status: %s resp: %s' % (status, resp)
|
|
|
|
# add a switch.
|
|
status, resp = client.add_switch(
|
|
SWITCH_IP, version=SWITCH_SNMP_VERSION,
|
|
community=SWITCH_SNMP_COMMUNITY)
|
|
|
|
print 'add a switch status: %s resp: %s' % (status, resp)
|
|
|
|
if status < 400:
|
|
switch = resp['switch']
|
|
else:
|
|
status, resp = client.get_switches()
|
|
print 'get all switches status: %s resp: %s' % (status, resp)
|
|
switch = None
|
|
for switch in resp['switches']:
|
|
if switch['ip'] == SWITCH_IP:
|
|
break
|
|
|
|
switch_id = switch['id']
|
|
switch_ip = switch['ip']
|
|
|
|
|
|
# if the switch is not in under_monitoring, wait for the poll switch task
|
|
# update the swich information and change the switch state.
|
|
while switch['state'] != 'under_monitoring':
|
|
print 'waiting for the switch into under_monitoring'
|
|
status, resp = client.get_switch(switch_id)
|
|
print 'get switch %s status: %s, resp: %s' % (switch_id, status, resp)
|
|
switch = resp['switch']
|
|
time.sleep(10)
|
|
|
|
|
|
# get machines connected to the switch.
|
|
status, resp = client.get_machines(switch_id=switch_id)
|
|
print 'get all machines under switch %s status: %s, resp: %s' % (
|
|
switch_id, status, resp)
|
|
machines = {}
|
|
MACHINES_TO_ADD = PRESET_VALUES['MACHINES_TO_ADD'].split()
|
|
for machine in resp['machines']:
|
|
mac = machine['mac']
|
|
if mac in MACHINES_TO_ADD:
|
|
machines[machine['id']] = mac
|
|
|
|
print 'machine to add: %s' % machines
|
|
|
|
if set(machines.values()) != set(MACHINES_TO_ADD):
|
|
print 'only found macs %s while expected are %s' % (
|
|
machines.values(), MACHINES_TO_ADD)
|
|
sys.exit(1)
|
|
|
|
|
|
# get adapters.
|
|
status, resp = client.get_adapters()
|
|
print 'get all adapters status: %s, resp: %s' % (status, resp)
|
|
adapter_ids = []
|
|
for adapter in resp['adapters']:
|
|
adapter_ids.append(adapter['id'])
|
|
|
|
adapter_id = adapter_ids[0]
|
|
print 'adpater for deploying a cluster: %s' % adapter_id
|
|
|
|
|
|
# add a cluster.
|
|
status, resp = client.add_cluster(
|
|
cluster_name=CLUSTER_NAME, adapter_id=adapter_id)
|
|
print 'add cluster %s status: %s, resp: %s' % (CLUSTER_NAME, status, resp)
|
|
cluster = resp['cluster']
|
|
cluster_id = cluster['id']
|
|
|
|
# add hosts to the cluster.
|
|
status, resp = client.add_hosts(
|
|
cluster_id=cluster_id,
|
|
machine_ids=machines.keys())
|
|
print 'add hosts to cluster %s status: %s, resp: %s' % (
|
|
cluster_id, status, resp)
|
|
host_ids = []
|
|
for host in resp['cluster_hosts']:
|
|
host_ids.append(host['id'])
|
|
|
|
print 'added hosts: %s' % host_ids
|
|
|
|
|
|
# set cluster security
|
|
status, resp = client.set_security(
|
|
cluster_id, server_username=SERVER_USERNAME,
|
|
server_password=SERVER_PASSWORD,
|
|
service_username=SERVICE_USERNAME,
|
|
service_password=SERVICE_PASSWORD,
|
|
console_username=CONSOLE_USERNAME,
|
|
console_password=CONSOLE_PASSWORD)
|
|
print 'set security config to cluster %s status: %s, resp: %s' % (
|
|
cluster_id, status, resp)
|
|
|
|
|
|
# set cluster networking
|
|
status, resp = client.set_networking(
|
|
cluster_id,
|
|
nameservers=PRESET_VALUES["NAMESERVERS"],
|
|
search_path=SEARCH_PATH,
|
|
gateway=PRESET_VALUES["GATEWAY"],
|
|
proxy=PRESET_VALUES["PROXY"],
|
|
ntp_server=PRESET_VALUES["NTP_SERVER"],
|
|
ha_vip=HA_VIP,
|
|
management_ip_start=MANAGEMENT_IP_START,
|
|
management_ip_end=MANAGEMENT_IP_END,
|
|
management_netmask=MANAGEMENT_NETMASK,
|
|
management_nic=MANAGEMENT_NIC,
|
|
management_gateway=MANAGEMENT_IP_GATEWAY,
|
|
management_promisc=MANAGEMENT_PROMISC,
|
|
tenant_ip_start=TENANT_IP_START,
|
|
tenant_ip_end=TENANT_IP_END,
|
|
tenant_netmask=TENANT_NETMASK,
|
|
tenant_nic=TENANT_NIC,
|
|
tenant_gateway=TENANT_IP_GATEWAY,
|
|
tenant_promisc=TENANT_PROMISC,
|
|
public_ip_start=PUBLIC_IP_START,
|
|
public_ip_end=PUBLIC_IP_END,
|
|
public_netmask=PUBLIC_NETMASK,
|
|
public_nic=PUBLIC_NIC,
|
|
public_gateway=PUBLIC_IP_GATEWAY,
|
|
public_promisc=PUBLIC_PROMISC,
|
|
storage_ip_start=STORAGE_IP_START,
|
|
storage_ip_end=STORAGE_IP_END,
|
|
storage_netmask=STORAGE_NETMASK,
|
|
storage_nic=STORAGE_NIC,
|
|
storage_gateway=STORAGE_IP_GATEWAY,
|
|
storage_promisc=STORAGE_PROMISC)
|
|
print 'set networking config to cluster %s status: %s, resp: %s' % (
|
|
cluster_id, status, resp)
|
|
|
|
|
|
# set partiton of each host in cluster
|
|
status, resp = client.set_partition(
|
|
cluster_id,
|
|
home_percentage=HOME_PERCENTAGE,
|
|
tmp_percentage=TMP_PERCENTAGE,
|
|
var_percentage=VAR_PERCENTAGE)
|
|
print 'set partition config to cluster %s status: %s, resp: %s' % (
|
|
cluster_id, status, resp)
|
|
|
|
|
|
# set each host config in cluster.
|
|
ROLES_LIST = [PRESET_VALUES['ROLES_LIST'].split()]
|
|
for host_id in host_ids:
|
|
if ROLES_LIST:
|
|
roles = ROLES_LIST.pop(0)
|
|
else:
|
|
roles = []
|
|
status, resp = client.update_host_config(
|
|
host_id, hostname='%s%s' % (HOST_NAME_PREFIX, host_id),
|
|
roles=roles)
|
|
print 'set roles to host %s status: %s, resp: %s' % (
|
|
host_id, status, resp)
|
|
|
|
|
|
# deploy cluster.
|
|
status, resp = client.deploy_hosts(cluster_id)
|
|
print 'deploy cluster %s status: %s, resp: %s' % (cluster_id, status, resp)
|
|
|
|
|
|
# get intalling progress.
|
|
BUILD_TIMEOUT = float(PRESET_VALUES['BUILD_TIMEOUT'])
|
|
timeout = time.time() + BUILD_TIMEOUT * 60
|
|
while True:
|
|
status, resp = client.get_cluster_installing_progress(cluster_id)
|
|
print 'get cluster %s installing progress status: %s, resp: %s' % (
|
|
cluster_id, status, resp)
|
|
progress = resp['progress']
|
|
if (
|
|
progress['state'] not in ['UNINITIALIZED', 'INSTALLING'] or
|
|
progress['percentage'] >= 1.0
|
|
):
|
|
break
|
|
if (
|
|
time.time() > timeout
|
|
):
|
|
raise Exception("Timeout! The system is not ready in time.")
|
|
|
|
for host_id in host_ids:
|
|
status, resp = client.get_host_installing_progress(host_id)
|
|
print 'get host %s installing progress status: %s, resp: %s' % (
|
|
host_id, status, resp)
|
|
|
|
time.sleep(60)
|
|
|
|
|
|
status, resp = client.get_dashboard_links(cluster_id)
|
|
print 'get cluster %s dashboardlinks status: %s, resp: %s' % (
|
|
cluster_id, status, resp)
|
|
dashboardlinks = resp['dashboardlinks']
|
|
if not dashboardlinks.keys():
|
|
raise Exception("Dashboard link is not found!")
|
|
for x in dashboardlinks.keys():
|
|
if x in ("os-dashboard", "os-controller"):
|
|
dashboardurl = dashboardlinks.get(x)
|
|
if dashboardurl is None:
|
|
raise Exception("No dashboard link is found")
|
|
r = requests.get(dashboardurl, verify=False)
|
|
r.raise_for_status()
|
|
match = re.search(
|
|
r'(?m)(http://\d+\.\d+\.\d+\.\d+:5000/v2\.0)', r.text)
|
|
if match:
|
|
print 'dashboard login page can be downloaded'
|
|
break
|
|
print (
|
|
'dashboard login page failed to be downloaded\n'
|
|
'the context is:\n%s\n') % r.text
|
|
raise Exception("os-dashboard is not properly installed!")
|