c4674360ef
Change-Id: Ieb82235bd6b436b6716992c1b45698b083d03d86 remove pre-existing chef files before uploading new chef files. having legacy stale chef roles/cookbooks/databags in the knife source directory will result in possible failure of dependency check, so gurantee we have the latest code in that directory. clean installation logs when refresh database. Change-Id: I6609e90e51d8ca3560f1848f2de62e148f0c5b49
468 lines
14 KiB
Python
Executable File
468 lines
14 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 sys
|
|
import time
|
|
|
|
# from compass.apiclient.restful import Client
|
|
from restful import Client
|
|
|
|
COMPASS_SERVER_URL = 'http://localhost/api'
|
|
COMPASS_LOGIN_EMAIL = 'admin@huawei.com'
|
|
COMPASS_LOGIN_PASSWORD = 'admin'
|
|
SWITCH_IP = '172.29.8.40'
|
|
SWITCH_SNMP_VERSION = '2c'
|
|
SWITCH_SNMP_COMMUNITY = 'public'
|
|
CLUSTER_NAME = 'test_cluster'
|
|
HOST_NAME_PREFIX = 'host'
|
|
SERVICE_USERNAME = 'service'
|
|
SERVICE_PASSWORD = 'service'
|
|
CONSOLE_USERNAME = 'console'
|
|
CONSOLE_PASSWORD = 'console'
|
|
HA_VIP = ''
|
|
|
|
MANAGEMENT_IP_START = '10.145.88.130'
|
|
MANAGEMENT_IP_END = '10.145.88.254'
|
|
MANAGEMENT_IP_GATEWAY = '10.145.88.1'
|
|
MANAGEMENT_NETMASK = '255.255.255.0'
|
|
MANAGEMENT_NIC = 'eth0'
|
|
MANAGEMENT_PROMISC = 0
|
|
TENANT_IP_START = '192.168.10.130'
|
|
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.130'
|
|
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.130'
|
|
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
|
|
HOST_OS = 'CentOS-6.5-x86_64'
|
|
|
|
|
|
PRESET_VALUES = {
|
|
'LANGUAGE': 'EN',
|
|
'TIMEZONE': 'GMT',
|
|
'HTTPS_PROXY': 'http://10.145.89.100:3128',
|
|
'NO_PROXY': ['127.0.0.1'],
|
|
'DOMAIN': 'ods.com',
|
|
'NAMESERVERS': ['10.145.89.100'],
|
|
'NTP_SERVER': '10.145.89.100',
|
|
'GATEWAY': '10.145.88.1',
|
|
'PROXY': 'http://10.145.89.100:3128',
|
|
'OS_NAME_PATTERN': 'CentOS.*',
|
|
'DISTRIBUTED_SYSTEM_NAME_PATTERN': 'openstack.*',
|
|
'FLAVOR_PATTERN': 'allinone.*',
|
|
'ROLES_LIST': ['allinone-compute'],
|
|
'MACHINES_TO_ADD': ['00:0c:29:a7:ea:4b'],
|
|
'BUILD_TIMEOUT': 60,
|
|
'SEARCH_PATH': ['ods.com'],
|
|
'SERVER_USERNAME': 'root',
|
|
'SERVER_PASSWORD': 'root'
|
|
}
|
|
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])
|
|
|
|
# instantiate a client
|
|
client = Client(COMPASS_SERVER_URL)
|
|
|
|
# login
|
|
status, response = client.login(COMPASS_LOGIN_EMAIL, COMPASS_LOGIN_PASSWORD)
|
|
print '============================================================'
|
|
print 'login status: %s response: %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
# list all switches
|
|
status, response = client.list_switches()
|
|
print '============================================================='
|
|
print 'get all switches status: %s response: %s' % (status, response)
|
|
|
|
# add a switch
|
|
status, response = client.add_switch(
|
|
SWITCH_IP,
|
|
SWITCH_SNMP_VERSION,
|
|
SWITCH_SNMP_COMMUNITY
|
|
)
|
|
print '============================================'
|
|
print 'adding a switch..status: %s, response: %s' % (status, response)
|
|
|
|
# if switch already exists, get one from all switches
|
|
switch = None
|
|
if status < 400:
|
|
switch = response
|
|
else:
|
|
status, response = client.list_switches()
|
|
print '========================================='
|
|
print 'list switches status %s response %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
for switch_ in response:
|
|
if switch_['ip'] == SWITCH_IP:
|
|
switch = switch_
|
|
break
|
|
|
|
switch_id = switch['id']
|
|
switch_ip = switch['ip']
|
|
print '======================'
|
|
print 'switch has been set as %s' % switch_ip
|
|
|
|
# wait till switch state becomes under_monitoring
|
|
while switch['state'] != 'under_monitoring':
|
|
print 'waiting for state to become under_monitoring'
|
|
client.poll_switch(switch_id)
|
|
status, resp = client.get_switch(switch_id)
|
|
print '====================================='
|
|
print 'poll switch status %s response %s' % (status, resp)
|
|
switch = resp
|
|
print 'switch is in state: %s' % switch['state']
|
|
time.sleep(5)
|
|
|
|
print '========================================='
|
|
print 'switch state now is %s' % (switch['state'])
|
|
|
|
# create a machine list
|
|
machine_macs = {}
|
|
machines = {}
|
|
for machine in PRESET_VALUES['MACHINES_TO_ADD']:
|
|
status, response = client.list_machines(mac=machine)
|
|
print '============================================'
|
|
print 'list machines status %s response %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
if status == 200 and response != []:
|
|
machine_id = response[0]['id']
|
|
machine_macs[machine_id] = response[0]['mac']
|
|
machines = response
|
|
|
|
print '================================='
|
|
print 'found machines are : %s' % machines
|
|
|
|
machines_to_add = PRESET_VALUES['MACHINES_TO_ADD']
|
|
if set(machine_macs.values()) != set(machines_to_add):
|
|
print 'only found macs %s while expected are %s' % (
|
|
machine_macs.values(), machines_to_add)
|
|
sys.exit(1)
|
|
|
|
# list all adapters
|
|
status, response = client.list_adapters()
|
|
print '==============================='
|
|
print 'all adapters are: %s' % response
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
adapters = response
|
|
adapter_id = None
|
|
os_id = None
|
|
flavor_id = None
|
|
adapter_pattern = re.compile(PRESET_VALUES['DISTRIBUTED_SYSTEM_NAME_PATTERN'])
|
|
os_pattern = re.compile(PRESET_VALUES['OS_NAME_PATTERN'])
|
|
flavor_pattern = re.compile(PRESET_VALUES['FLAVOR_PATTERN'])
|
|
for adapter in adapters:
|
|
if (
|
|
'distributed_system_name' in adapter and
|
|
adapter_pattern.match(adapter['distributed_system_name'])
|
|
):
|
|
adapter_id = adapter['id']
|
|
for supported_os in adapter['supported_oses']:
|
|
if os_pattern.match(supported_os['name']):
|
|
os_id = supported_os['id']
|
|
break
|
|
for flavor in adapter['flavors']:
|
|
if flavor_pattern.match(flavor['name']):
|
|
flavor_id = flavor['id']
|
|
|
|
if adapter_id and os_id and flavor_id:
|
|
break
|
|
|
|
print '======================================================='
|
|
print 'using adapter %s os %s flavor %s to deploy cluster' % (
|
|
adapter_id, os_id, flavor_id
|
|
)
|
|
|
|
# add a cluster
|
|
status, response = client.add_cluster(
|
|
CLUSTER_NAME,
|
|
adapter_id,
|
|
os_id,
|
|
flavor_id
|
|
)
|
|
print '==============================================================='
|
|
print 'add cluster %s status %s: %s' % (CLUSTER_NAME, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, response = client.list_clusters(name=CLUSTER_NAME)
|
|
print '================================================================'
|
|
print 'list clusters %s status %s: %s' % (CLUSTER_NAME, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
cluster = response[0]
|
|
cluster_id = cluster['id']
|
|
|
|
print '=================='
|
|
print 'cluster is %s' % cluster
|
|
|
|
# Add hosts to the cluster
|
|
machines_dict = {}
|
|
machine_id_list = []
|
|
for machine in machines:
|
|
id_mapping = {}
|
|
id_mapping['machine_id'] = machine['id']
|
|
machine_id_list.append(id_mapping)
|
|
|
|
machines_dict['machines'] = machine_id_list
|
|
|
|
status, response = client.add_hosts_to_cluster(
|
|
cluster_id, machines_dict
|
|
)
|
|
print '==================================='
|
|
print 'add hosts %s to cluster status %s response %s' % (
|
|
machines_dict, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
# Add two subnets
|
|
subnet_1 = '10.145.89.0/24'
|
|
subnet_2 = '192.168.100.0/24'
|
|
|
|
status, response = client.add_subnet(subnet_1)
|
|
print '=================='
|
|
print 'add subnet %s status %s: %s' % (subnet_1, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, response = client.add_subnet(subnet_2)
|
|
print '=================='
|
|
print 'add subnet %s status %s: %s' % (subnet_2, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, subnet1 = client.list_subnets(subnet=subnet_1)
|
|
print '==========================================================='
|
|
print 'list subnet %s status %s: %s' % (subnet_1, status, subnet1)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, subnet2 = client.list_subnets(subnet=subnet_2)
|
|
print '==========================================================='
|
|
print 'list subnet %s status %s: %s' % (subnet_2, status, subnet2)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
subnet1_id = subnet1[0]['id']
|
|
subnet2_id = subnet2[0]['id']
|
|
print '========================'
|
|
print 'subnet1 has id: %s, subnet is %s' % (subnet1_id, subnet1)
|
|
print 'subnet2 has id: %s, subnet is %s' % (subnet2_id, subnet2)
|
|
|
|
# Add host network
|
|
status, response = client.list_cluster_hosts(cluster_id)
|
|
print '================================================'
|
|
print 'list cluster hosts status %s: %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
host = response[0]
|
|
host_id = host['id']
|
|
print '=================='
|
|
print 'host is: %s' % host
|
|
|
|
status, response = client.add_host_network(
|
|
host_id,
|
|
'eth0',
|
|
'10.145.89.200',
|
|
subnet1_id,
|
|
is_mgmt=True
|
|
)
|
|
print '======================='
|
|
print 'add eth0 network status %s: %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, response = client.add_host_network(
|
|
host_id,
|
|
'eth1',
|
|
'192.168.100.200',
|
|
subnet2_id,
|
|
is_promiscuous=True
|
|
)
|
|
print '======================='
|
|
print 'add eth1 network status %s: %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
# Update os config to cluster
|
|
cluster_os_config = {
|
|
'general': {
|
|
'language': PRESET_VALUES['LANGUAGE'],
|
|
'timezone': PRESET_VALUES['TIMEZONE'],
|
|
'http_proxy': PRESET_VALUES['PROXY'],
|
|
'https_proxy': PRESET_VALUES['HTTPS_PROXY'],
|
|
'no_proxy': PRESET_VALUES['NO_PROXY'],
|
|
'ntp_server': PRESET_VALUES['NTP_SERVER'],
|
|
'dns_servers': PRESET_VALUES['NAMESERVERS'],
|
|
'domain': PRESET_VALUES['DOMAIN'],
|
|
'search_path': PRESET_VALUES['SEARCH_PATH'],
|
|
'default_gateway': PRESET_VALUES['GATEWAY']
|
|
},
|
|
'server_credentials': {
|
|
'username': PRESET_VALUES['SERVER_USERNAME'],
|
|
'password': PRESET_VALUES['SERVER_PASSWORD']
|
|
},
|
|
'partition': {
|
|
'/var': {
|
|
'percentage': VAR_PERCENTAGE,
|
|
},
|
|
'/home': {
|
|
'percentage': HOME_PERCENTAGE,
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
cluster_package_config = {
|
|
'security': {
|
|
'service_credentials': {
|
|
'image': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'compute': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'dashboard': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'identity': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'metering': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'rabbitmq': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'volume': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
},
|
|
'mysql': {
|
|
'username': SERVICE_USERNAME,
|
|
'password': SERVICE_PASSWORD
|
|
}
|
|
},
|
|
'console_credentials': {
|
|
'admin': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'compute': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'dashboard': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'image': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'metering': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'network': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'object-store': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
},
|
|
'volume': {
|
|
'username': CONSOLE_USERNAME,
|
|
'password': CONSOLE_PASSWORD
|
|
}
|
|
}
|
|
},
|
|
'network_mapping': {
|
|
'management': MANAGEMENT_NIC,
|
|
'tenant': TENANT_NIC,
|
|
'storage': STORAGE_NIC,
|
|
'public': PUBLIC_NIC
|
|
}
|
|
}
|
|
|
|
status, response = client.update_cluster_config(
|
|
cluster_id,
|
|
cluster_os_config,
|
|
cluster_package_config
|
|
)
|
|
|
|
print '======================================='
|
|
print 'cluster %s update status %s: %s' % (
|
|
cluster_id, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, response = client.update_cluster_host(
|
|
cluster_id, host_id, roles=PRESET_VALUES['ROLES_LIST'])
|
|
print '================================================='
|
|
print 'update cluster host %s/%s status %s: %s' % (
|
|
cluster_id, host_id, status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
# Review and deploy
|
|
status, response = client.review_cluster(
|
|
cluster_id, review={'hosts': [host_id]})
|
|
print '======================================='
|
|
print 'reviewing cluster status %s: %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|
|
|
|
status, response = client.deploy_cluster(
|
|
cluster_id, deploy={'hosts': [host_id]})
|
|
print '======================================='
|
|
print 'deploy cluster status %s: %s' % (status, response)
|
|
if status >= 400:
|
|
sys.exit(1)
|