summaryrefslogtreecommitdiffstats
path: root/lib/python/apex/network_environment.py
blob: c6483d12267168b7c72bb832f2cc3d11ea6882e5 (plain)
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

@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.high
##############################################################################
# Copyright (c) 2016 Tim Rozet (trozet@redhat.com) 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
##############################################################################

import yaml
import re
from .common import constants

PORTS = '/ports'
# Resources defined by <resource name>: <prefix>
EXTERNAL_RESOURCES = {'OS::TripleO::Network::External': None,
                      'OS::TripleO::Network::Ports::ExternalVipPort': PORTS,
                      'OS::TripleO::Controller::Ports::ExternalPort': PORTS,
                      'OS::TripleO::Compute::Ports::ExternalPort': PORTS}
TENANT_RESOURCES = {'OS::TripleO::Network::Tenant': None,
                    'OS::TripleO::Controller::Ports::TenantPort': PORTS,
                    'OS::TripleO::Compute::Ports::TenantPort': PORTS}
STORAGE_RESOURCES = {'OS::TripleO::Network::Storage': None,
                     'OS::TripleO::Network::Ports::StorageVipPort': PORTS,
                     'OS::TripleO::Controller::Ports::StoragePort': PORTS,
                     'OS::TripleO::Compute::Ports::StoragePort': PORTS}
API_RESOURCES = {'OS::TripleO::Network::InternalApi': None,
                 'OS::TripleO::Network::Ports::InternalApiVipPort': PORTS,
                 'OS::TripleO::Controller::Ports::InternalApiPort': PORTS,
                 'OS::TripleO::Compute::Ports::InternalApiPort': PORTS}

# A list of flags that will be set to true when IPv6 is enabled
IPV6_FLAGS = ["NovaIPv6", "MongoDbIPv6", "CorosyncIPv6", "CephIPv6",
              "RabbitIPv6", "MemcachedIPv6"]


class NetworkEnvironment:
    """
    This class creates a Network Environment to be used in TripleO Heat
    Templates.

    The class builds upon an existing network-environment file and modifies
    based on a NetworkSettings object.
    """
    def __init__(self, net_settings, filename):
        with open(filename, 'r') as net_env_fh:
            self.netenv_obj = yaml.load(net_env_fh)
            self._update_net_environment(net_settings)

    def _update_net_environment(self, settings_obj):
        """
        Updates Network Environment according to Network Settings
        :param: network settings object
        :return:  None
        """
        if not settings_obj:
            raise NetworkEnvException("Network Settings does not exist")

        net_settings = settings_obj.get_network_settings()
        enabled_networks = settings_obj.get_enabled_networks()
        param_def = 'parameter_defaults'
        reg = 'resource_registry'
        for key, prefix in TENANT_RESOURCES.items():
            if prefix is None:
                prefix = ''
            m = re.split('%s/\w+\.yaml' % prefix, self.netenv_obj[reg][key])
            if m is not None:
                tht_dir = m[0]
                break
        if not tht_dir:
            raise NetworkEnvException('Unable to parse THT Directory')
        admin_cidr = net_settings[constants.ADMIN_NETWORK]['cidr']
        admin_prefix = str(admin_cidr.prefixlen)
        self.netenv_obj[param_def]['ControlPlaneSubnetCidr'] = admin_prefix
        self.netenv_obj[param_def]['ControlPlaneDefaultRoute'] = \
            net_settings[constants.ADMIN_NETWORK]['provisioner_ip']
        public_cidr = net_settings[constants.PUBLIC_NETWORK]['cidr']
        self.netenv_obj[param_def]['ExternalNetCidr'] = str(public_cidr)
        public_range = net_settings[constants.PUBLIC_NETWORK][
                                         'usable_ip_range'].split(',')
        self.netenv_obj[param_def]['ExternalAllocationPools'] = \
            [{'start':
              public_range[0],
              'end': public_range[1]
              }]
        self.netenv_obj[param_def]['ExternalInterfaceDefaultRoute'] = \
            net_settings[constants.PUBLIC_NETWORK]['gateway']
        self.netenv_obj[param_def]['EC2MetadataIp'] = \
            net_settings[constants.ADMIN_NETWORK]['provisioner_ip']
        self.netenv_obj[param_def]['DnsServers'] = net_settings['dns_servers']

        if public_cidr.version == 6:
            postfix = '/external_v6.yaml'
        else:
            postfix = '/external.yaml'

        for key, prefix in EXTERNAL_RESOURCES.items():
            if prefix is None:
                prefix = ''
            self.netenv_obj[reg][key] = tht_dir + prefix + postfix


        if constants.PRIVATE_NETWORK in enabled_networks:
            priv_range = net_settings[constants.PRIVATE_NETWORK][
                'usable_ip_range'].split(',')
            self.netenv_obj[param_def]['TenantAllocationPools'] = \
                [{'start':
                  priv_range[0],
                  'end': priv_range[1]
                  }]
            priv_cidr = net_settings[constants.PRIVATE_NETWORK]['cidr']
            self.netenv_obj[param_def]['TenantNetCidr'] = str(priv_cidr)
            if priv_cidr.version == 6:
                postfix = '/tenant_v6.yaml'
            else:
                postfix = '/tenant.yaml'
        else:
            postfix = '/noop.yaml'

        for key, prefix in TENANT_RESOURCES.items():
            if prefix is None:
                prefix = ''
            self.netenv_obj[reg][key] = tht_dir + prefix + postfix

        if constants.STORAGE_NETWORK in enabled_networks:
            storage_range = net_settings[constants.STORAGE_NETWORK][
                'usable_ip_range'].split(',')
            self.netenv_obj[param_def]['StorageAllocationPools'] = \
                [{'start':
                  storage_range[0],
                  'end':
                  storage_range[1]
                  }]
            storage_cidr = net_settings[constants.STORAGE_NETWORK]['cidr']
            self.netenv_obj[param_def]['StorageNetCidr'] = str(storage_cidr)
            if storage_cidr.version == 6:
                postfix = '/storage_v6.yaml'
            else:
                postfix = '/storage.yaml'
        else:
            postfix = '/noop.yaml'

        for key, prefix in STORAGE_RESOURCES.items():
            if prefix is None:
                prefix = ''
            self.netenv_obj[reg][key] = tht_dir + prefix + postfix

        if constants.API_NETWORK in enabled_networks:
            api_range = net_settings[constants.API_NETWORK][
                'usable_ip_range'].split(',')
            self.netenv_obj[param_def]['InternalApiAllocationPools'] = \
                [{'start':
                      api_range[0],
                  'end':
                      api_range[1]
                  }]
            api_cidr = net_settings[constants.API_NETWORK]['cidr']
            self.netenv_obj[param_def]['InternalApiNetCidr'] = str(api_cidr)
            if api_cidr.version == 6:
                postfix = '/internal_api_v6.yaml'
            else:
                postfix = '/internal_api.yaml'


        else:
            postfix = '/noop.yaml'

        for key, prefix in API_RESOURCES.items():
            if prefix is None:
                prefix = ''
            self.netenv_obj[reg][key] = tht_dir + prefix + postfix

        # Set IPv6 related flags to True. Not that we do not set those to False
        # when IPv4 is configured, we'll use the default or whatever the user
        # may have set.
        if settings_obj.get_ip_addr_family() == 6:
            for flag in IPV6_FLAGS:
                self.netenv_obj[param_def][flag] = True

    def get_netenv_settings(self):
        """
        Getter for netenv settings
        :return: Dictionary of network environment settings
        """
        return self.netenv_obj


class NetworkEnvException(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
            return self.value