Skip to content

Minor Fixes to kubernetes generator #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
4 changes: 2 additions & 2 deletions kubernetes/autoscaling.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def body(self):

class PodDisruptionBudget(KubernetesResource):
kind: str = "PodDisruptionBudget"
api_version: str = "policy/v1beta1"
api_version: str = "policy/v1"

def body(self):
super().body()
Expand Down Expand Up @@ -77,7 +77,7 @@ def body(self):

class HorizontalPodAutoscaler(KubernetesResource):
kind: str = "HorizontalPodAutoscaler"
api_version: str = "autoscaling.k8s.io/v2beta2"
api_version: str = "autoscaling.k8s.io/v2"

def body(self):
super().body()
Expand Down
6 changes: 3 additions & 3 deletions kubernetes/certmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class CertManagerIssuer(KubernetesResource):
def body(self):
config = self.config
super().body()
self.root.spec = config.get("spec")
self.root.spec = config.spec


@kgenlib.register_generator(path="certmanager.cluster_issuer")
Expand All @@ -24,7 +24,7 @@ class CertManagerClusterIssuer(KubernetesResource):
def body(self):
config = self.config
super().body()
self.root.spec = config.get("spec")
self.root.spec = config.spec


@kgenlib.register_generator(path="certmanager.certificate")
Expand All @@ -35,4 +35,4 @@ class CertManagerCertificate(KubernetesResource):
def body(self):
config = self.config
super().body()
self.root.spec = config.get("spec")
self.root.spec = config.spec
7 changes: 6 additions & 1 deletion kubernetes/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,10 @@ class VPAConfigSpec(kgenlib.BaseModel):
update_mode: str = "Auto"
resource_policy: Dict[str, List[Dict]] = {}

class HPAConfigSpec(kgenlib.BaseModel):
min_replicas: Optional[int] = None
max_replicas: Optional[int] = None
metrics: List[Dict[str, Any]] = []

class ServiceMonitororConfigSpec(kgenlib.BaseModel):
endpoints: list = []
Expand All @@ -382,14 +386,15 @@ class WorkloadConfigSpec(KubernetesResourceSpec, ContainerSpec):
application: Optional[str] = None
auto_pdb: bool = False
backend_config: dict = {}
frontend_config: dict = {}
cluster_role: Optional[Dict] = None
containers: dict = {}
deployment_progress_deadline_seconds: int | None = None
dns_policy: Optional[DNSPolicy] = None
grace_period: int = 30
host_network: Optional[bool] = None
host_pid: Optional[bool] = None
hpa: dict = {}
hpa: Optional[HPAConfigSpec] = None
image_pull_secrets: list = []
init_containers: Optional[Dict[str, Union[InitContainerSpec, None]]] = {}
istio_policy: dict = {}
Expand Down
42 changes: 40 additions & 2 deletions kubernetes/gke.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

logger = logging.getLogger(__name__)

from .common import KubernetesResource
from .common import KubernetesResource, kgenlib
from typing import Any


class BackendConfig(KubernetesResource):
Expand All @@ -11,4 +12,41 @@ class BackendConfig(KubernetesResource):

def body(self):
super().body()
self.root.spec = self.config.backend_config
spec = self.spec
self.root.spec = spec


@kgenlib.register_generator(path="generators.kubernetes.backend_config")
class BackendConfigGenerator(kgenlib.BaseStore):
name: str
config: Any

def body(self):
name = self.name
config = self.config
spec = self.config.spec
backend_config = BackendConfig(name=name, config=config, spec=spec)
self.add(backend_config)


class FrontendConfig(KubernetesResource):
kind: str = "FrontendConfig"
api_version: str = "networking.gke.io/v1beta1"

def body(self):
super().body()
spec = self.spec
self.root.spec = spec


@kgenlib.register_generator(path="generators.kubernetes.frontend_config")
class FrontendConfigGenerator(kgenlib.BaseStore):
name: str
config: Any

def body(self):
name = self.name
config = self.config
spec = self.config.spec
frontend_config = FrontendConfig(name=name, config=config, spec=spec)
self.add(frontend_config)
9 changes: 5 additions & 4 deletions kubernetes/networking.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ def body(self):
config = self.config

if config.default_backend:
self.root.spec.backend.service.name = config.default_backend.get("name")
self.root.spec.backend.service.port = config.default_backend.get("port", 80)
self.root.spec.defaultBackend.service.name = config.default_backend.get("name")
self.root.spec.defaultBackend.service.port = config.default_backend.get("port", 80)
if config.paths:
host = config.host
paths = config.paths
Expand All @@ -47,7 +47,7 @@ def body(self):

class GoogleManagedCertificate(KubernetesResource):
kind: str = "ManagedCertificate"
api_version: str = "networking.gke.io/v1beta1"
api_version: str = "networking.gke.io/v1"

def body(self):
super().body()
Expand Down Expand Up @@ -410,6 +410,7 @@ def body(self):
)
self.add(
GoogleManagedCertificate(
name=certificate_name, config={"domains": domains}
name=certificate_name, namespace=self.config.namespace,
config={"domains": domains}
)
)
4 changes: 4 additions & 0 deletions kubernetes/rbac.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ def body(self):
else:
self.name = config.name or self.name
super().body()
# Force the name again after super().body()
# This is needed for when we are setting service_account.name.
# Wihthout this, only labels.name is set correctly
self.root.metadata.name = self.name
if self.spec:
self.add_annotations(self.spec.annotations)

Expand Down
19 changes: 12 additions & 7 deletions kubernetes/workloads.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
WorkloadTypes,
kgenlib,
)
from .gke import BackendConfig
from .gke import BackendConfig, FrontendConfig
from .istio import IstioPolicy
from .networking import NetworkPolicy, Service
from .prometheus import PrometheusRule, ServiceMonitor
Expand Down Expand Up @@ -117,7 +117,7 @@ def body(self):
affinity = self.root.spec.template.spec.affinity
if config.prefer_pods_in_node_with_expression and not config.node_selector:
affinity.nodeAffinity.setdefault(
"preferredDuringSchedulingIgnoredDuringExecutio", []
"preferredDuringSchedulingIgnoredDuringExecution", []
)
affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution.append(
{
Expand All @@ -137,7 +137,7 @@ def body(self):
"podAffinityTerm": {
"labelSelector": {
"matchExpressions": [
{"key": "app", "operator": "In", "values": [name]}
{"key": "name", "operator": "In", "values": [name]}
]
},
"topologyKey": "kubernetes.io/hostname",
Expand All @@ -155,7 +155,7 @@ def body(self):
"podAffinityTerm": {
"labelSelector": {
"matchExpressions": [
{"key": "app", "operator": "In", "values": [name]}
{"key": "name", "operator": "In", "values": [name]}
]
},
"topologyKey": "topology.kubernetes.io/zone",
Expand Down Expand Up @@ -338,7 +338,7 @@ class Container(BaseModel):
@staticmethod
def find_key_in_config(key, configs):
for name, config in configs.items():
if key in config.data.keys():
if key in config.data or key in config.string_data:
return name
raise (
BaseException(
Expand Down Expand Up @@ -504,6 +504,7 @@ def body(self):
apply_patches=[
"generators.manifest.default_config",
'applications."{application}".component_defaults',
'generators.manifest.resource_defaults.{type}'
],
)
class Components(kgenlib.BaseStore):
Expand All @@ -521,13 +522,15 @@ def _add_component(
if config_attr and getattr(self.config, config_attr):
spec = spec or getattr(self.config, config_attr, {})
name = name or self.name

component = component_class(
name=name, config=self.config, spec=spec, workload=workload, **kwargs
)
self.add(component)
logger.debug(f"Added component {component.root.metadata} for {self.name}.")
return component


def _generate_and_add_multiple_objects(
self, generating_class, config_attr, workload
):
Expand Down Expand Up @@ -630,14 +633,16 @@ def body(self):
self._add_component(
ClusterRoleBinding, "cluster_role", role=role, sa=sa
)
self._add_component(BackendConfig, "backend_config", spec=self.config.backend_config)
self._add_component(FrontendConfig, "frontend_config", spec=self.config.frontend_config)

self._add_component(BackendConfig, "backend_config")

# Handling a special case where pdb_min_available or auto_pdb is set, but config.type isn't "job"
if self.config.type != "job" and (
self.config.pdb_min_available or self.config.auto_pdb
):
self._add_component(PodDisruptionBudget, workload=workload)
config_attr = "pdb_min_available" if self.config.pdb_min_available else "auto_pdb"
self._add_component(PodDisruptionBudget, config_attr, workload=workload)

self.add(workload)

Expand Down