Neutron support
Added configurations: * use_neutron If Neutron is enabled, management network id is passed as a parameter, when instances are being launched. Instance's internal and management IPs are equal and point to the first IP in a list of a specified management network. Model classes for Cluster and Cluster Template updated. Implements blueprint add-neutron-support Change-Id: If6e79327ab14bbc813175396cd7287c2a29149b0
This commit is contained in:
parent
843e563fc1
commit
89ea1a3515
@ -15,13 +15,17 @@
|
||||
# assign floating IPs to cluster nodes. Internal IPs will
|
||||
# be used for inter-cluster communication, while floating
|
||||
# ones will be used by Savanna to configure nodes. Also
|
||||
# floating IPs will be exposed in service URLs.
|
||||
# floating IPs will be exposed in service URLs. This option
|
||||
# is ignored when "use_neutron" is set to True (boolean value)
|
||||
#use_floating_ips=True
|
||||
|
||||
# The suffix of the node's FQDN. In nova-network that is
|
||||
# dhcp_domain config parameter (string value)
|
||||
#node_domain=novalocal
|
||||
|
||||
# Use Neutron or Nova Network (boolean value)
|
||||
#use_neutron=false
|
||||
|
||||
# List of plugins to be loaded. Savanna preserves the order of
|
||||
# the list when returning it. (list value)
|
||||
plugins=vanilla,hdp
|
||||
|
@ -11,6 +11,21 @@
|
||||
#port=8386
|
||||
|
||||
|
||||
# When set to false, Savanna uses only internal IP of VMs.
|
||||
# When set to true, Savanna expects OpenStack to auto-assign
|
||||
# floating IPs to cluster nodes. Internal IPs will be used for
|
||||
# inter-cluster communication, while floating ones will be
|
||||
# used by Savanna to configure nodes. Also floating IPs will
|
||||
# be exposed in service URLs. (boolean value)
|
||||
#use_floating_ips=true
|
||||
|
||||
# The suffix of the node's FQDN. In nova-network that is
|
||||
# dhcp_domain config parameter (string value)
|
||||
#node_domain=novalocal
|
||||
|
||||
# Use Neutron or Nova Network (boolean value)
|
||||
#use_neutron=false
|
||||
|
||||
#
|
||||
# Options defined in savanna.main
|
||||
#
|
||||
@ -177,7 +192,8 @@
|
||||
# floating IPs to cluster nodes. Internal IPs will be used for
|
||||
# inter-cluster communication, while floating ones will be
|
||||
# used by Savanna to configure nodes. Also floating IPs will
|
||||
# be exposed in service URLs. (boolean value)
|
||||
# be exposed in service URLs. This option is ignored when
|
||||
# "use_neutron" is set to True (boolean value)
|
||||
#use_floating_ips=true
|
||||
|
||||
# The suffix of the node's FQDN. In nova-network that is
|
||||
@ -256,4 +272,4 @@
|
||||
#pool_timeout=<None>
|
||||
|
||||
|
||||
# Total option count: 51
|
||||
# Total option count: 53
|
||||
|
@ -33,11 +33,15 @@ cluster_node_opts = [
|
||||
'assign floating IPs to cluster nodes. Internal IPs will '
|
||||
'be used for inter-cluster communication, while floating '
|
||||
'ones will be used by Savanna to configure nodes. Also '
|
||||
'floating IPs will be exposed in service URLs.'),
|
||||
'floating IPs will be exposed in service URLs. This '
|
||||
'option is ignored when "use_neutron" is set to True'),
|
||||
cfg.StrOpt('node_domain',
|
||||
default='novalocal',
|
||||
help="The suffix of the node's FQDN. In nova-network that is "
|
||||
"dhcp_domain config parameter")
|
||||
"dhcp_domain config parameter"),
|
||||
cfg.BoolOpt('use_neutron',
|
||||
default=False,
|
||||
help="Use Neutron or Nova Network")
|
||||
]
|
||||
|
||||
|
||||
|
@ -53,6 +53,7 @@ class Cluster(mb.SavannaBase):
|
||||
hadoop_version = sa.Column(sa.String(80), nullable=False)
|
||||
cluster_configs = sa.Column(st.JsonDictType())
|
||||
default_image_id = sa.Column(sa.String(36))
|
||||
neutron_management_network = sa.Column(sa.String(36))
|
||||
anti_affinity = sa.Column(st.JsonListType())
|
||||
private_key = sa.Column(sa.Text, default=crypto.generate_private_key())
|
||||
user_keypair_id = sa.Column(sa.String(80))
|
||||
@ -144,6 +145,7 @@ class ClusterTemplate(mb.SavannaBase):
|
||||
default_image_id = sa.Column(sa.String(36))
|
||||
anti_affinity = sa.Column(st.JsonListType())
|
||||
tenant_id = sa.Column(sa.String(36))
|
||||
neutron_management_network = sa.Column(sa.String(36))
|
||||
plugin_name = sa.Column(sa.String(80), nullable=False)
|
||||
hadoop_version = sa.Column(sa.String(80), nullable=False)
|
||||
node_groups = relationship('TemplatesRelation', cascade="all,delete",
|
||||
|
@ -14,6 +14,7 @@
|
||||
# limitations under the License.
|
||||
|
||||
from novaclient import exceptions as nova_exceptions
|
||||
from oslo.config import cfg
|
||||
|
||||
from savanna import conductor as c
|
||||
from savanna import context
|
||||
@ -27,6 +28,7 @@ from savanna.utils.openstack import nova
|
||||
|
||||
|
||||
conductor = c.API
|
||||
CONF = cfg.CONF
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@ -208,10 +210,20 @@ def _run_instance(cluster, node_group, idx, aa_groups, userdata):
|
||||
# create instances only at hosts w/ no instances w/ aa-enabled processes
|
||||
hints = {'different_host': list(set(aa_ids))} if aa_ids else None
|
||||
|
||||
nova_instance = nova.client().servers.create(
|
||||
name, node_group.get_image_id(), node_group.flavor_id,
|
||||
scheduler_hints=hints, userdata=userdata,
|
||||
key_name=cluster.user_keypair_id)
|
||||
if CONF.use_neutron:
|
||||
net_id = cluster.neutron_management_network
|
||||
nics = [{"net-id": net_id, "v4-fixed-ip": ""}]
|
||||
|
||||
nova_instance = nova.client().servers.create(
|
||||
name, node_group.get_image_id(), node_group.flavor_id,
|
||||
scheduler_hints=hints, userdata=userdata,
|
||||
key_name=cluster.user_keypair_id,
|
||||
nics=nics)
|
||||
else:
|
||||
nova_instance = nova.client().servers.create(
|
||||
name, node_group.get_image_id(), node_group.flavor_id,
|
||||
scheduler_hints=hints, userdata=userdata,
|
||||
key_name=cluster.user_keypair_id)
|
||||
|
||||
instance_id = conductor.instance_add(ctx, node_group,
|
||||
{"instance_id": nova_instance.id,
|
||||
|
@ -28,6 +28,31 @@ CONF = cfg.CONF
|
||||
|
||||
# NOTE(slukjanov): https://blueprints.launchpad.net/savanna?searchtext=ip
|
||||
def init_instances_ips(instance, server):
|
||||
if instance.internal_ip and instance.management_ip:
|
||||
return True
|
||||
|
||||
if CONF.use_neutron:
|
||||
return init_neutron_ips(instance, server)
|
||||
else:
|
||||
return init_nova_network_ips(instance, server)
|
||||
|
||||
|
||||
def init_neutron_ips(instance, server):
|
||||
ctx = context.ctx()
|
||||
|
||||
net_id = instance.node_group.cluster.neutron_management_network
|
||||
net_name = nova.client().networks.get(net_id).label
|
||||
|
||||
internal_ip = server.networks.get(net_name, [None])[0]
|
||||
management_ip = internal_ip
|
||||
|
||||
conductor.instance_update(ctx, instance, {"management_ip": management_ip,
|
||||
"internal_ip": internal_ip})
|
||||
|
||||
return internal_ip
|
||||
|
||||
|
||||
def init_nova_network_ips(instance, server):
|
||||
"""Extracts internal and management ips.
|
||||
|
||||
As internal ip will be used the first ip from the nova networks CIDRs.
|
||||
@ -36,9 +61,6 @@ def init_instances_ips(instance, server):
|
||||
"""
|
||||
ctx = context.ctx()
|
||||
|
||||
if instance.internal_ip and instance.management_ip:
|
||||
return True
|
||||
|
||||
management_ip = instance.management_ip
|
||||
internal_ip = instance.internal_ip
|
||||
|
||||
|
@ -88,6 +88,10 @@ CLUSTER_TEMPLATE_SCHEMA = {
|
||||
"description": {
|
||||
"type": "string",
|
||||
},
|
||||
"neutron_management_network": {
|
||||
"type": "string",
|
||||
"format": "uuid"
|
||||
},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": [
|
||||
|
Loading…
Reference in New Issue
Block a user