1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
##############################################################################
# Copyright (c) 2015 Dell Inc and others.
#
# 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 keystoneclient.auth.identity import v2
from keystoneclient import session
from novaclient import client
import os
import re
from collections import defaultdict
class create_zones:
def __init__(self):
print 'Creating Zones'
self._keystone_client = None
self._nova_client = None
def _get_keystone_client(self):
"""returns a keystone client instance"""
if self._keystone_client is None:
'''
self._keystone_client = keystoneclient.v2_0.client.Client(
auth_url=os.environ.get('OS_AUTH_URL'),
username=os.environ.get('OS_USERNAME'),
password=os.environ.get('OS_PASSWORD'),
tenant_name=os.environ.get('OS_TENANT_NAME'))
'''
auth = v2.Password(auth_url=os.environ.get('OS_AUTH_URL'),
username=os.environ.get('OS_USERNAME'),
password=os.environ.get('OS_PASSWORD'),
tenant_name=os.environ.get('OS_TENANT_NAME'))
sess = session.Session(auth=auth)
else:
return self._keystone_client
return sess
def _get_nova_client(self):
if self._nova_client is None:
keystone = self._get_keystone_client()
self._nova_client = client.Client('2', session=keystone)
return self._nova_client
@staticmethod
def check_aggregate(nova, agg_name):
list1 = nova.aggregates.list()
agg_name_exist = False
for x in list1:
if x.name == agg_name:
agg_name_exist = True
return agg_name_exist
@staticmethod
def get_aggregate_id(nova, agg_name):
list1 = nova.aggregates.list()
for x in list1:
if x.name == agg_name:
agg_id = x.id
return agg_id
@staticmethod
def check_host_added_to_aggregate(nova, agg_id, hostname):
host_added = False
list1 = nova.aggregates.get_details(agg_id)
nme = str(list1.hosts)
if hostname in nme:
host_added = True
return host_added
@staticmethod
def del_agg(nova, id, host):
nova.aggregates.remove_host(id, host)
nova.aggregates.delete(id)
@staticmethod
def get_compute_num(compute_name):
num = re.findall(r'\d+', compute_name)
return int(num[0]) - 1
def test(self):
nova = self._get_nova_client()
hyper_list = nova.hypervisors.list()
return hyper_list
def create_agg(self, d):
nova = self._get_nova_client()
hyper_list = nova.hypervisors.list()
host_a = []
zone_machine = defaultdict(list)
for x in range(len(hyper_list)):
host_a.append(hyper_list[x].service['host'])
host_a[x] = str(host_a[x])
host_a.sort()
for k in d:
zone_machine[k].append(' ')
for x in range(len(zone_machine)):
compute_index = self.get_compute_num(d[x])
if compute_index > len(hyper_list):
print '\n The specified compute node doesnt exist. using compute 1'
compute_index = 1
if not self.check_aggregate(nova, host_a[compute_index]):
agg_id_a = nova.aggregates.create(host_a[compute_index], d[x])
nova.aggregates.add_host(aggregate=agg_id_a, host=host_a[compute_index])
else:
id1 = self.get_aggregate_id(nova, host_a[compute_index])
self.del_agg(nova, id1, host_a[compute_index])
nova.aggregates.create(host_a[compute_index], d[x])
id1 = self.get_aggregate_id(nova, host_a[compute_index])
if not self.check_host_added_to_aggregate(
nova, id1, host_a[compute_index]):
nova.aggregates.add_host(aggregate=id1, host=host_a[compute_index])
|