Skip to content

Commit

Permalink
Provisioning knobs for some kubenernets config.
Browse files Browse the repository at this point in the history
This commit is to support config knobs for the following:

1. Cluster network config
2. Public fip pool config
3. Pod subnet
4. Service subnet

Change-Id: Ia39bd8ff2e6934c38581a95492f4b11eeb87c5c1
Closes-Bug: #1687370 #1690714 #1690968
  • Loading branch information
dineshb-jnpr committed May 17, 2017
1 parent 30b831c commit 5c80d35
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 38 deletions.
6 changes: 2 additions & 4 deletions src/container/kube-manager/kube_manager/common/args.py
Expand Up @@ -62,9 +62,7 @@ def parse_args(args_str=None):
'admin_user' : '',
'admin_password' : '',
'admin_tenant' : '',
'public_network_project':'default-project',
'public_network':'__public__',
'public_fip_pool':'__fip_pool_public__',
'public_fip_pool': '{}',
}

k8s_opts = {
Expand All @@ -78,7 +76,7 @@ def parse_args(args_str=None):
'kubernetes_cluster_owner': 'k8s',
'kubernetes_cluster_domain' : 'default-domain',
'cluster_name': None,
'cluster_project' : None,
'cluster_project' : "{}",
'cluster_network' : None,
}

Expand Down
97 changes: 79 additions & 18 deletions src/container/kube-manager/kube_manager/common/utils.py
Expand Up @@ -8,6 +8,21 @@

from ast import literal_eval

def get_dict_from_dict_string(dict_string, dict_string_kind):
"""Given a dictionary string of a kind, return its dictionary object.
"""
if not dict_string:
err_msg = dict_string_kind + " dict string is not specified/invalid"
raise Exception(err_msg)

result_dict = literal_eval(dict_string)
if not result_dict:
err_msg = dict_string_kind + " dict string [%s] is invalid." %\
(dict_string)
raise Exception(err_msg)

return result_dict

class CustomNetwork(object):
"""Defines the keywords and format of a custom network specification.
"""
Expand All @@ -21,20 +36,6 @@ def NetworkFQName(cls):
"""
return [cls.domain_name_key, cls.project_name_key, cls.vn_name_key]

def get_vn_dict_from_vn_dict_string(vn_dict_string):
"""Given a dictionary string representing VN, return a dictionary object.
"""
if not vn_dict_string:
err_msg = "Virtual network dict string is not specified/invalid"
raise Exception(err_msg)

vn = literal_eval(vn_dict_string)
if not vn:
err_msg = "Virtual network dict string is invalid."
raise Exception(err_msg)

return vn

def get_vn_fq_name_from_dict_string(vn_dict_string):
"""Given a dictionary string representing VN, return the VN's FQ-name.
Expand All @@ -44,7 +45,7 @@ def get_vn_fq_name_from_dict_string(vn_dict_string):
fq_name_key = CustomNetwork.NetworkFQName()
vn_fq_name = []

vn = get_vn_dict_from_vn_dict_string(vn_dict_string)
vn = get_dict_from_dict_string(vn_dict_string, "virtual_network")
for key in fq_name_key:
value = vn.get(key, None)
if value:
Expand All @@ -59,7 +60,7 @@ def get_vn_fq_name_from_dict_string(vn_dict_string):
def get_domain_name_from_vn_dict_string(vn_dict_string):
"""Given a dict-string representing VN FQ-name, return the VN's domain.
"""
vn = get_vn_dict_from_vn_dict_string(vn_dict_string)
vn = get_dict_from_dict_string(vn_dict_string, "virtual_network")
domain_name = vn.get(CustomNetwork.domain_name_key, None)
if not domain_name:
err_msg = "Domain name not found in virtual network dict string(%s)."%\
Expand All @@ -70,7 +71,7 @@ def get_domain_name_from_vn_dict_string(vn_dict_string):
def get_project_name_from_vn_dict_string(vn_dict_string):
"""Given a dict-string representing VN FQ-name, return the VN's project.
"""
vn = get_vn_dict_from_vn_dict_string(vn_dict_string)
vn = get_dict_from_dict_string(vn_dict_string, "virtual_network")
project_name = vn.get(CustomNetwork.project_name_key, None)
if not project_name:
err_msg = "Project not found in virtual network dict string(%s)." %\
Expand All @@ -81,11 +82,71 @@ def get_project_name_from_vn_dict_string(vn_dict_string):
def get_vn_name_from_vn_dict_string(vn_dict_string):
"""Given a dict-string representing VN FQ-name, return the name of VN.
"""
vn = get_vn_dict_from_vn_dict_string(vn_dict_string)
vn = get_dict_from_dict_string(vn_dict_string, "virtual_network")
vn_name = vn.get(CustomNetwork.vn_name_key, None)
if not vn_name:
err_msg = "VN name not found in virtual network dict string(%s)." %\
(vn_dict_string)
raise Exception(err_msg)
return vn_name

class FipPoolFQName(object):
"""Defines the keywords and format of a Fip-Pool FQName specification.
"""
domain_name_key = 'domain'
project_name_key = 'project'
vn_name_key = 'network'
fip_pool_name_key = 'name'

@classmethod
def fip_pool_fq_name_key(cls):
"""Get a fq-network name key specification.
"""
return [cls.domain_name_key, cls.project_name_key, cls.vn_name_key,
cls.fip_pool_name_key]

def get_fip_pool_fq_name_from_dict_string(fip_pool_dict_string):
"""Given a dictionary string representing a fip-pool, return its FQ-name.
If enough information is not available to construct the FQ-name, an
exception is retured.
"""
fip_pool_fq_name = []
fq_name_key = FipPoolFQName.fip_pool_fq_name_key()
fip_pool = get_dict_from_dict_string(fip_pool_dict_string, "fip_pool")
for key in fq_name_key:
value = fip_pool.get(key, None)
if value:
fip_pool_fq_name.append(value)
else:
err_msg = "[%s] not specified in fip-pool dict string [%s]. "\
"Unable to construct fip-pool name." %\
(key, fip_pool_dict_string)
raise Exception(err_msg)
return fip_pool_fq_name

class ProjectFQName(object):
"""Defines the keywords and format of a Project FQName specification.
"""
domain_name_key = 'domain'
name = 'project'

@classmethod
def project_fq_name_key(cls):
"""Get a fq-network name key specification.
"""
return [cls.domain_name_key, cls.project_name_key]

def get_domain_name_from_project_dict_string(proj_dict_string):
"""Given a dict-string representing project FQ-name,return its domain.
"""
proj = get_dict_from_dict_string(proj_dict_string, "project")
domain_name = proj.get(ProjectFQName.domain_name_key, None)
return domain_name

def get_project_name_from_project_dict_string(proj_dict_string):
"""Given a dict-string representing project FQ-name, return its name.
"""
proj = get_dict_from_dict_string(proj_dict_string, "project")
project_name = proj.get(ProjectFQName.name, None)
return project_name
11 changes: 7 additions & 4 deletions src/container/kube-manager/kube_manager/vnc/vnc_ingress.py
Expand Up @@ -19,6 +19,7 @@
from kube_manager.vnc.loadbalancer import ServiceLbMemberManager
from vnc_kubernetes_config import VncKubernetesConfig as vnc_kube_config
from vnc_common import VncCommon
from kube_manager.common.utils import get_fip_pool_fq_name_from_dict_string

from cStringIO import StringIO
from cfgm_common.utils import cgitb_hook
Expand Down Expand Up @@ -83,10 +84,12 @@ def _get_pod_ipam_subnet_uuid(self, vn_obj):
def _get_public_fip_pool(self):
if self._fip_pool_obj:
return self._fip_pool_obj
fip_pool_fq_name = [vnc_kube_config.cluster_domain(),
self._args.public_network_project,
self._args.public_network,
self._args.public_fip_pool]

if not vnc_kube_config.is_public_fip_pool_configured():
return None

fip_pool_fq_name = get_fip_pool_fq_name_from_dict_string(
self._args.public_fip_pool)
try:
fip_pool_obj = self._vnc_lib. \
floating_ip_pool_read(fq_name=fip_pool_fq_name)
Expand Down
Expand Up @@ -2,9 +2,11 @@
# Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
#
from kube_manager.common.utils import (get_vn_fq_name_from_dict_string,
get_domain_name_from_vn_dict_string,
get_project_name_from_vn_dict_string,
get_vn_name_from_vn_dict_string)
get_domain_name_from_vn_dict_string,
get_project_name_from_vn_dict_string,
get_vn_name_from_vn_dict_string,
get_domain_name_from_project_dict_string,
get_project_name_from_project_dict_string)

class VncKubernetesConfig(object):
"""VNC kubernetes common config.
Expand Down Expand Up @@ -61,11 +63,28 @@ def cluster_owner(cls):
def cluster_name(cls):
return cls.args().cluster_name

@classmethod
def is_cluster_project_configured(cls):
args = cls.args()
if args.cluster_project and args.cluster_project != '{}':
return True
return False

@classmethod
def is_public_fip_pool_configured(cls):
args = cls.args()
if args.public_fip_pool and args.public_fip_pool != '{}':
return True
return False

@classmethod
def get_configured_domain_name(cls):
args = cls.args()
if args.cluster_network:
return get_domain_name_from_vn_dict_string(args.cluster_network)
if cls.is_cluster_project_configured():
return get_domain_name_from_project_dict_string(
args.cluster_project)
return None

@classmethod
Expand All @@ -80,8 +99,9 @@ def get_configured_project_name(cls):
args = cls.args()
if args.cluster_network:
return get_project_name_from_vn_dict_string(args.cluster_network)
if args.cluster_project:
return args.cluster_project
if cls.is_cluster_project_configured():
return get_project_name_from_project_dict_string(
args.cluster_project)
return None

@classmethod
Expand Down
Expand Up @@ -25,6 +25,7 @@ def __init__(self, network_policy_mgr):
self._ns_sg = {}
self._label_cache = vnc_kube_config.label_cache()
self._logger = vnc_kube_config.logger()
self._queue = vnc_kube_config.queue()

def _get_namespace(self, ns_name):
"""
Expand Down
16 changes: 9 additions & 7 deletions src/container/kube-manager/kube_manager/vnc/vnc_service.py
Expand Up @@ -14,6 +14,7 @@
import link_local_manager as ll_mgr
from vnc_kubernetes_config import VncKubernetesConfig as vnc_kube_config
from vnc_common import VncCommon
from kube_manager.common.utils import get_fip_pool_fq_name_from_dict_string

class VncService(VncCommon):

Expand Down Expand Up @@ -87,10 +88,12 @@ def _get_cluster_network(self):
def _get_public_fip_pool(self):
if self._fip_pool_obj:
return self._fip_pool_obj
fip_pool_fq_name = [vnc_kube_config.cluster_domain(),
self._args.public_network_project,
self._args.public_network,
self._args.public_fip_pool]

if not vnc_kube_config.is_public_fip_pool_configured():
return None

fip_pool_fq_name = get_fip_pool_fq_name_from_dict_string(
self._args.public_fip_pool)
try:
fip_pool_obj = self._vnc_lib.floating_ip_pool_read(fq_name=fip_pool_fq_name)
except NoIdError:
Expand Down Expand Up @@ -256,9 +259,8 @@ def _allocate_floating_ip(self, service_id, external_ip=None):

fip_pool = self._get_public_fip_pool()
if fip_pool is None:
self.logger.warning("public_fip_pool [%s, %s] doesn't exists" %
(self._args.public_network,
self._args.public_fip_pool))
self.logger.warning("public_fip_pool [%s] doesn't exists" %
(self._args.public_fip_pool))
return None

fip_obj = FloatingIp(lb.name + "-externalIP", fip_pool)
Expand Down

0 comments on commit 5c80d35

Please sign in to comment.