Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
extend device template info in UX1Config model
Browse files Browse the repository at this point in the history
  • Loading branch information
sbasan committed Mar 27, 2024
1 parent 0522e7c commit 8005973
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 28 deletions.
15 changes: 8 additions & 7 deletions catalystwan/api/template_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from catalystwan.api.templates.device_template.device_template import (
DeviceSpecificValue,
DeviceTemplate,
DeviceTemplateWithTracking,
GeneralTemplate,
)
from catalystwan.api.templates.feature_template import FeatureTemplate
Expand Down Expand Up @@ -82,7 +81,9 @@ class TemplateInformation(BaseModel):
devices_attached: int = Field(serialization_alias="devicesAttached", validation_alias="devicesAttached")
description: str = Field(serialization_alias="templateDescription", validation_alias="templateDescription")
last_updated_on: dt.datetime = Field(serialization_alias="lastUpdatedOn", validation_alias="lastUpdatedOn")
resource_group: Optional[str] = Field(None, serialization_alias="resourceGroup", validation_alias="resourceGroup")
resource_group: Optional[str] = Field(
default=None, serialization_alias="resourceGroup", validation_alias="resourceGroup"
)


class FeatureTemplateInformation(TemplateInformation):
Expand All @@ -92,7 +93,7 @@ class FeatureTemplateInformation(TemplateInformation):
device_type: List[str] = Field(serialization_alias="deviceType", validation_alias="deviceType")
version: str = Field(serialization_alias="templateMinVersion", validation_alias="templateMinVersion")
template_definiton: Optional[str] = Field(
None, serialization_alias="templateDefinition", validation_alias="templateDefinition"
default=None, serialization_alias="templateDefinition", validation_alias="templateDefinition"
)


Expand All @@ -103,8 +104,8 @@ class DeviceTemplateInformation(TemplateInformation):
template_class: str = Field(serialization_alias="templateClass", validation_alias="templateClass")
config_type: str = Field(serialization_alias="configType", validation_alias="configType")
template_attached: int = Field(serialization_alias="templateAttached", validation_alias="templateAttached")
draft_mode: Optional[str] = Field(None, serialization_alias="draftMode", validation_alias="draftMode")
device_role: Optional[str] = Field(None, serialization_alias="deviceRole", validation_alias="deviceRole")
draft_mode: Optional[str] = Field(default=None, serialization_alias="draftMode", validation_alias="draftMode")
device_role: Optional[str] = Field(default=None, serialization_alias="deviceRole", validation_alias="deviceRole")


class TemplatesAPI:
Expand Down Expand Up @@ -748,7 +749,7 @@ def get_device_templates(self) -> DataSequence[DeviceTemplateInformation]:
templates = self.session.get(url=endpoint, params=params)
return templates.dataseq(DeviceTemplateInformation)

def get_device_template(self, template_id: str) -> DeviceTemplateWithTracking:
def get_device_template(self, template_id: str) -> DeviceTemplate:
endpoint = f"/dataservice/template/device/object/{template_id}"
response = self.session.get(endpoint)
return DeviceTemplateWithTracking(**response.json())
return DeviceTemplate(**response.json())
27 changes: 13 additions & 14 deletions catalystwan/api/templates/device_template/device_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import logging
from pathlib import Path
from typing import TYPE_CHECKING, Final, List
from typing import TYPE_CHECKING, ClassVar, List

from jinja2 import DebugUndefined, Environment, FileSystemLoader, meta # type: ignore
from pydantic import BaseModel, ConfigDict, Field, field_validator
Expand Down Expand Up @@ -42,13 +42,17 @@ class DeviceTemplate(BaseModel):
>>> session.api.templates.create(device_template)
"""

template_name: str = Field(alias="templateName")
template_description: str = Field(alias="templateDescription")
general_templates: List[GeneralTemplate] = Field(default=[], alias="generalTemplates")
device_role: str = Field(default="sdwan-edge", alias="deviceRole")
device_type: str = Field(alias="deviceType")
security_policy_id: str = Field(default="", alias="securityPolicyId")
policy_id: str = Field(default="", alias="policyId")
template_name: str = Field(serialization_alias="templateName", validation_alias="templateName")
template_description: str = Field(serialization_alias="templateDescription", validation_alias="templateDescription")
general_templates: List[GeneralTemplate] = Field(
default=[], serialization_alias="generalTemplates", validation_alias="generalTemplates"
)
device_role: str = Field(default="sdwan-edge", serialization_alias="deviceRole", validation_alias="deviceRole")
device_type: str = Field(serialization_alias="deviceType", validation_alias="deviceType")
security_policy_id: str = Field(
default="", serialization_alias="securityPolicyId", validation_alias="securityPolicyId"
)
policy_id: str = Field(default="", serialization_alias="policyId", validation_alias="policyId")

def get_flattened_general_templates(self) -> List[GeneralTemplate]:
"""
Expand Down Expand Up @@ -97,7 +101,7 @@ def parse_templates(cls, value):
output.append(template)
return output

payload_path: Final[Path] = Path(__file__).parent / "device_template_payload.json.j2"
payload_path: ClassVar[Path] = Path(__file__).parent / "device_template_payload.json.j2"

@classmethod
def get(self, name: str, session: ManagerSession) -> DeviceTemplate:
Expand All @@ -108,10 +112,5 @@ def get(self, name: str, session: ManagerSession) -> DeviceTemplate:
model_config = ConfigDict(populate_by_name=True, use_enum_values=True)


class DeviceTemplateWithTracking(DeviceTemplate):
id: str = Field(default="", alias="templateId")
devices_attached: int = Field(default=0, alias="devicesAttached")


class DeviceSpecificValue(BaseModel):
property: str
24 changes: 20 additions & 4 deletions catalystwan/models/configuration/config_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from pydantic import BaseModel, ConfigDict, Field, model_validator
from typing_extensions import Annotated

from catalystwan.api.template_api import FeatureTemplateInformation
from catalystwan.api.templates.device_template.device_template import DeviceTemplateWithTracking
from catalystwan.api.template_api import FeatureTemplateInformation, TemplateInformation
from catalystwan.api.templates.device_template.device_template import DeviceTemplate
from catalystwan.endpoints.configuration_group import ConfigGroupCreationPayload
from catalystwan.models.configuration.feature_profile.common import FeatureProfileCreationPayload, ProfileType
from catalystwan.models.configuration.feature_profile.sdwan.other import AnyOtherParcel
Expand All @@ -27,6 +27,23 @@
]


class DeviceTemplateWithInfo(DeviceTemplate):
model_config = ConfigDict(populate_by_name=True)
template_id: str = Field(serialization_alias="templateId", validation_alias="templateId")
factory_default: bool = Field(serialization_alias="factoryDefault", validation_alias="factoryDefault")
devices_attached: int = Field(serialization_alias="devicesAttached", validation_alias="devicesAttached")

@staticmethod
def from_merged(template: DeviceTemplate, info: TemplateInformation) -> "DeviceTemplateWithInfo":
info_dict = template.model_dump()
return DeviceTemplateWithInfo(
template_id=info.id,
factory_default=info.factory_default,
devices_attached=info.devices_attached,
**info_dict
)


class UX1Policies(BaseModel):
model_config = ConfigDict(populate_by_name=True)
centralized_policies: List[CentralizedPolicyInfo] = Field(
Expand All @@ -50,14 +67,13 @@ class UX1Templates(BaseModel):
feature_templates: List[FeatureTemplateInformation] = Field(
default=[], serialization_alias="featureTemplates", validation_alias="featureTemplates"
)
device_templates: List[DeviceTemplateWithTracking] = Field(
device_templates: List[DeviceTemplateWithInfo] = Field(
default=[], serialization_alias="deviceTemplates", validation_alias="deviceTemplates"
)


class UX1Config(BaseModel):
# All UX1 Configuration items - Mega Model
model_config = ConfigDict(populate_by_name=True)
policies: UX1Policies = UX1Policies()
templates: UX1Templates = UX1Templates()

Expand Down
6 changes: 3 additions & 3 deletions catalystwan/workflows/config_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from catalystwan.api.policy_api import POLICY_LIST_ENDPOINTS_MAP
from catalystwan.endpoints.configuration_group import ConfigGroupCreationPayload
from catalystwan.models.configuration.config_migration import (
DeviceTemplateWithInfo,
TransformedConfigGroup,
TransformedFeatureProfile,
TransformedParcel,
Expand Down Expand Up @@ -213,9 +214,8 @@ def collect_ux1_config(session: ManagerSession, progress: Callable[[str, int, in
device_templates_information = template_api.get_device_templates()
for i, device_template_information in enumerate(device_templates_information):
device_template = template_api.get_device_template(device_template_information.id)
device_template.id = device_template_information.id
device_template.devices_attached = device_template_information.devices_attached
ux1.templates.device_templates.append(device_template)
device_template_with_info = DeviceTemplateWithInfo.from_merged(device_template, device_template_information)
ux1.templates.device_templates.append(device_template_with_info)
progress("Collecting Device Templates", i + 1, len(device_templates_information))

return ux1
Expand Down

0 comments on commit 8005973

Please sign in to comment.