Skip to content

Commit

Permalink
Closes-Bug: #1566558 - SM support for External Openstack Provision
Browse files Browse the repository at this point in the history
This check-in allows Server Manager to support External Openstack.
The SM can provision a node with only Openstack role and also a node with all other nodes.
These nodes can then communicate with the external openstack if they are configured correctly.

The config for both Openstack node and Cfgm node is given in the bug id.

Change-Id: I27a6c3cae121281f6996da38cef062c18dd3fcef
  • Loading branch information
nitishkrishna committed May 2, 2016
1 parent b8e09aa commit 12cb580
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 16 deletions.
91 changes: 83 additions & 8 deletions src/server_mgr_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,53 @@ def validate_smgr_delete(self, validation_data, request, data = None):
ret_data["force"] = force
return ret_data

def validate_non_openstack_cluster(self, cluster_id):
cluster = self._serverDb.get_cluster(
{"id" : cluster_id},
detail=True)[0]
cluster_params = eval(cluster['parameters'])
if 'provision' in cluster_params and 'openstack' in cluster_params['provision']:
cluster_openstack_prov_params = cluster_params['provision']
cluster_openstack_params = cluster_openstack_prov_params['openstack']
else:
msg = "Cluster with only Openstack role is supported only with new cluster params format with Openstack section\n"
self.log_and_raise_exception(msg)
configured_external_keystone_ip = cluster_openstack_params.get("keystone_ip", None)
configured_nova_params = cluster_openstack_params.get("nova", None)
if configured_nova_params:
configured_nova_rabbit_servers = configured_nova_params.get("rabbit_hosts", None)
else:
configured_nova_rabbit_servers = None
if configured_external_keystone_ip and configured_nova_rabbit_servers:
pass
else:
msg = "In a Cluster with no Openstack role, you need to configure both openstack::keystone_ip and openstack::nova::rabbit_hosts to point to an external Openstack\n"
self.log_and_raise_exception(msg)

def validate_openstack_only_cluster(self, cluster_id):
cluster = self._serverDb.get_cluster(
{"id" : cluster_id},
detail=True)[0]
cluster_params = eval(cluster['parameters'])
if 'provision' in cluster_params and 'openstack' in cluster_params['provision']:
cluster_openstack_prov_params = cluster_params['provision']
cluster_openstack_params = cluster_openstack_prov_params['openstack']
else:
msg = "Cluster with only Openstack role is supported only with new cluster params format with Openstack section\n"
self.log_and_raise_exception(msg)

openstack_manage_amqp_check = cluster_openstack_params.get("openstack_manage_amqp", None)
configured_nova_params = cluster_openstack_params.get("nova", None)
if configured_nova_params:
configured_nova_neutron_ip = configured_nova_params.get("neutron_ip_to_use", None)
else:
configured_nova_neutron_ip = None
if configured_nova_neutron_ip and openstack_manage_amqp_check:
pass
else:
msg = "In a Cluster with only Openstack role defined, you need to configure both openstack::openstack_manage_amqp = true and openstck::nova::neutron_ip_to_use pointing to a Cfgm node\n"
self.log_and_raise_exception(msg)

def _validate_roles(self, cluster_id):
# get list of all servers in this cluster
servers = self._serverDb.get_server(
Expand Down Expand Up @@ -842,7 +889,13 @@ def _validate_roles(self, cluster_id):
cluster_unique_roles = set(cluster_role_list)

missing_roles = roles_set.difference(cluster_unique_roles)
if len(missing_roles):
if len(missing_roles) == 1 and next(iter(missing_roles)) == "openstack":
# Check for other mandatory params if Openstack is not configured
self.validate_non_openstack_cluster(cluster_id)
elif len(missing_roles) > 1 and len(cluster_unique_roles) == 1 and next(iter(cluster_unique_roles)) == "openstack":
# Check for other mandatory params if only Openstack role in cluster
self.validate_openstack_only_cluster(cluster_id)
elif len(missing_roles):
msg = "Mandatory roles \"%s\" are not present" % \
", ".join(str(e) for e in missing_roles)
self.log_and_raise_exception(msg)
Expand Down Expand Up @@ -3681,21 +3734,32 @@ def storage_get_control_network_mask(
role_ips_dict[key] = [x.get("ip_address", "") for x in value]
cluster_params = cluster.get('parameters', {})
server_params = server.get('parameters', {})
cluster_openstack_prov_params = (
cluster_params.get("provision", {})).get("openstack", {})
configured_external_keystone_ip = cluster_openstack_prov_params.get("keystone_ip", None)
openstack_ip = ''
self_ip = server.get("ip_address", "")
if self_ip in role_ips_dict['openstack']:
if configured_external_keystone_ip:
openstack_ip = configured_external_keystone_ip
elif self_ip in role_ips_dict['openstack']:
openstack_ip = self_ip
else:
elif 'openstack' in role_ips_dict:
openstack_ip = role_ips_dict['openstack'][0]

else:
msg = "Openstack role not defined for cluster AND External Openstack not configured in cluster parameters.\n " \
"The cluster needs to point to at least one Openstack node.\n"
self.log_and_raise_exception(msg)
subnet_mask = server.get("subnet_mask", "")
if not subnet_mask:
subnet_mask = cluster_params.get("subnet_mask", "255.255.255.0")

subnet_address = ""
intf_control = {}
subnet_address = str(IPNetwork(
openstack_ip + "/" + subnet_mask).network)

intf_control = {}
if openstack_ip == configured_external_keystone_ip:
return '"' + str(IPNetwork(subnet_address).network) + '/' + str(IPNetwork(subnet_address).prefixlen) + '"'
if (self.get_control_net(cluster_servers))[openstack_ip]:
intf_control = eval((self.get_control_net(cluster_servers))[openstack_ip])

Expand Down Expand Up @@ -3795,6 +3859,7 @@ def build_calculated_cluster_params(
# Build mysql_allowed_hosts list
contrail_ha_params = cluster_contrail_prov_params.get("ha", {})
openstack_ha_params = cluster_openstack_prov_params.get("ha", {})
configured_external_keystone_ip = cluster_openstack_prov_params.get("keystone_ip", None)
mysql_allowed_hosts = []
internal_vip = openstack_ha_params.get("internal_vip", None)
if internal_vip:
Expand Down Expand Up @@ -3880,10 +3945,19 @@ def build_calculated_cluster_params(
# Build openstack parameters for openstack modules
self_ip = server.get("ip_address", "")
openstack_ips = [x["ip_address"] for x in cluster_servers if "openstack" in eval(x.get('roles', '[]'))]
if self_ip in openstack_ips:
if configured_external_keystone_ip:
openstack_ip = configured_external_keystone_ip
external_openstack_ip_list = []
external_openstack_ip_list.append(openstack_ip)
openstack_params["openstack_ip_list"] = external_openstack_ip_list
elif self_ip in openstack_ips:
openstack_ip = self_ip
else:
elif len(openstack_ips):
openstack_ip = openstack_ips[0]
else:
msg = "Openstack role not defined for cluster AND External Openstack not configured in cluster parameters.\n" \
" The cluster needs to point to at least one Openstack node.\n"
self.log_and_raise_exception(msg)
subnet_mask = server.get("subnet_mask", "")
if not subnet_mask:
subnet_mask = cluster_params.get("subnet_mask", "255.255.255.0")
Expand Down Expand Up @@ -3957,7 +4031,8 @@ def build_calculated_server_params(
server_control_gateway = self.get_control_gateway(server)
contrail_params['host_ip'] = server_control_ip
role_id = [x.get("id", "") for x in role_servers['openstack']]
contrail_params['sync_db'] = (server['id'] == role_id[0])
if len(role_id):
contrail_params['sync_db'] = (server['id'] == role_id[0])
contrail_params['host_roles'] = [ x for x in eval(server['roles']) ]
if (server_control_ip and
(server_control_ip != server['ip_address'])):
Expand Down
38 changes: 30 additions & 8 deletions src/server_mgr_puppet.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,34 @@ def storage_get_control_network_mask(self, provision_params,
cluster_params = cluster.get('parameters', {})
server_params = server.get('parameters', {})
#openstack_ip = cluster_params.get("internal_vip", None)
cluster_openstack_prov_params = (
cluster_params.get("provision", {})).get("openstack", {})
configured_external_keystone_ip = cluster_openstack_prov_params.get("keystone_ip", None)
openstack_ip = ''
self_ip = server.get("ip_address", "")
if openstack_ip is None or openstack_ip == '':
if self_ip in role_ips_dict['openstack']:
openstack_ip = self_ip
else:
openstack_ip = role_ips_dict['openstack'][0]
if configured_external_keystone_ip:
openstack_ip = configured_external_keystone_ip
elif self_ip in role_ips_dict['openstack']:
openstack_ip = self_ip
elif 'openstack' in role_ips_dict:
openstack_ip = role_ips_dict['openstack'][0]
else:
msg = "Openstack role not defined for cluster AND External Openstack not configured in cluster parameters.\n " \
"The cluster needs to point to at least one Openstack node.\n"
self._smgr_log.log(self._smgr_log.ERROR, msg)
raise ServerMgrException(msg, ERR_OPR_ERROR)

subnet_mask = server.get("subnet_mask", "")
if not subnet_mask:
subnet_mask = cluster_params.get("subnet_mask", "255.255.255.0")

subnet_address = ""
intf_control = {}
subnet_address = str(IPNetwork(
openstack_ip + "/" + subnet_mask).network)

if openstack_ip == configured_external_keystone_ip:
return '"' + str(IPNetwork(subnet_address).network) + '/' + str(IPNetwork(subnet_address).prefixlen) + '"'

self._smgr_log.log(self._smgr_log.DEBUG, "control-net : %s" % str( provision_params['control_net']))
if provision_params['control_net'] [openstack_ip]:
intf_control = eval(provision_params['control_net'] [openstack_ip])
Expand Down Expand Up @@ -687,10 +700,19 @@ def build_openstack_hiera_file(
self_ip = server.get("ip_address", "")

openstack_ips = [x["ip_address"] for x in cluster_servers if "openstack" in eval(x.get('roles', '[]'))]
if self_ip in openstack_ips:
cluster_openstack_prov_params = (cluster_params.get("provision", {})).get("openstack", {})
configured_external_keystone_ip = cluster_openstack_prov_params.get("keystone_ip", None)
if configured_external_keystone_ip:
openstack_ip = configured_external_keystone_ip
elif self_ip in openstack_ips:
openstack_ip = self_ip
elif len(openstack_ips):
openstack_ip = openstack_ips[0]
else:
openstack_ip = openstack_ips[0]
msg = "Openstack role not defined for cluster AND External Openstack not configured in cluster parameters.\n " \
"The cluster needs to point to at least one Openstack node.\n"
self._smgr_log.log(self._smgr_log.ERROR, msg)
raise ServerMgrException(msg, ERR_OPR_ERROR)

subnet_mask = server.get("subnet_mask", "")
if not subnet_mask:
Expand Down

0 comments on commit 12cb580

Please sign in to comment.