compass-core/compass/apiclient/example.py
zhaoxinyu c4674360ef add regtest script and conf
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
2014-09-17 11:46:07 -07:00

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)