14ad281057
Change-Id: I366052e23d72dd94229513d6a0992338d0d44638
464 lines
14 KiB
Python
Executable File
464 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.*',
|
|
'ADAPTER_NAME': 'openstack_icehouse',
|
|
'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_name = PRESET_VALUES['ADPATER_NAME']
|
|
os_pattern = re.compile(PRESET_VALUES['OS_NAME_PATTERN'])
|
|
flavor_pattern = re.compile(PRESET_VALUES['FLAVOR_PATTERN'])
|
|
for adapter in adapters:
|
|
if adapter_name == adapter['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)
|