Skip to content

Commit

Permalink
LITE-27893 Add validation step fro PPR upload
Browse files Browse the repository at this point in the history
  • Loading branch information
jonatrios committed Jul 14, 2023
1 parent 1e29f60 commit a63e072
Show file tree
Hide file tree
Showing 11 changed files with 931 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM cloudblueconnect/connect-extension-runner:28.4
FROM cloudblueconnect/connect-extension-runner:28.5

COPY pyproject.toml /install_temp/.
COPY poetry.* /install_temp/.
Expand Down
360 changes: 360 additions & 0 deletions connect_ext_ppr/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,360 @@
# Common schemas
# Categories
CATEGORIES_SCHEMA = {
"type": "array",
"allOf": [
{"contains": {"const": "Name_EN"}},
{"contains": {"const": "Description_EN"}},
],
"items": {
"anyOf": [
{
"pattern": "^(Description|Name)_[a-zA-Z]+$",
},
{
"enum": [
"Name_EN",
"Description_EN",
"ExpandCategory",
"DisplayInCCP",
"ParentCategory",
],
},
],
},
"uniqueItems": True,
}
# Policies
POLICIES_SCHEMA = {
"type": "array",
"items": {
"type": "string",
"enum": [
"ServicePlan",
"Period",
"PeriodType",
"Trial",
"Action",
"ActionPeriod",
"ActionPeriodTimezone",
"ApplicableTo",
],
},
"allOf": [
{"contains": {"const": "ServicePlan"}},
{"contains": {"const": "Period"}},
{"contains": {"const": "PeriodType"}},
{"contains": {"const": "Trial"}},
{"contains": {"const": "Action"}},
{"contains": {"const": "ActionPeriod"}},
{"contains": {"const": "ActionPeriodTimezone"}},
{"contains": {"const": "ApplicableTo"}},
],
"additionalItems": False,
}

# Per Sheet Schema
RESOURCES_SCHEMA = {
"Resources": {
"type": "array",
"items": {
"type": "string",
"enum": [
"Name_EN",
"Description_EN",
"ResourceCategory",
"MPN",
"UOM",
"Measurable",
],
},
"allOf": [
{"contains": {"const": "Name_EN"}},
{"contains": {"const": "Description_EN"}},
{"contains": {"const": "ResourceCategory"}},
{"contains": {"const": "MPN"}},
{"contains": {"const": "UOM"}},
{"contains": {"const": "Measurable"}},
],
"additionalItems": False,
},
}
SERVICE_PLANS_SCHEMA = {
"ServicePlans": {
"type": "array",
"allOf": [
{"contains": {"const": "Name_EN"}},
{"contains": {"const": "Description_EN"}},
{"contains": {"const": "PlanCategory"}},
{"contains": {"const": "ServiceTerms"}},
{"contains": {"const": "BillingPeriodDuration"}},
{"contains": {"const": "BillingPeriodType"}},
{"contains": {"const": "PricePeriod"}},
{"contains": {"const": "RecurringType"}},
],
"items": {
"anyOf": [
{
"pattern": "^((Description|Name|OpUnit)_(?:[a-zA-Z]+(?:\\s+[a-zA-Z]+)*)"
"|(ResellerGroupName|UpgradePath|SalesCategory)_\\d+)$",
},
{
"enum": [
"OldName_1",
"Name_EN",
"Description_EN",
"PlanCategory",
"ServiceTerms",
"BillingPeriodDuration",
"BillingPeriodType",
"AlignBillingOrderWithStatementDay",
"NewDayOfStatement",
"AlignSalesOrderWithStatementDay",
"AllowScheduledChanges",
"BillingPeriodAlignment",
"CotermingPossibilities",
"ExpirationDateAlignedWithEndOfMonth",
"ExpirationDateAlignedWithSubscription",
"FirstBillingPeriodForFree",
"PricePeriod",
"RecurringType",
"AutoRenew",
"RenewOrderInterval",
"AutoRenewPlan",
"AutoRenewPeriod",
"AutoRenewPeriodType",
"BillingAlignmentResellerRedefineAllowed",
"WelcomeNotificationTemplate",
"ExpirationNotificationTemplate",
"ProcessByRatingEngine",
"SubscriptionStartDateAfterUpgrade",
"Published",
"VendorTimezone",
"MPN",
],
},
],
},
"uniqueItems": True,
},
}
PLAN_SWITCH_PATHS_SCHEMA = {
"PlanSwitchPaths": {
"type": "array",
"items": {
"type": "string",
"enum": [
"FromPlan",
"ToPlan",
"ImmediateSwitchAllowed",
"SubsStartDateAfterSwitch",
"SubsPeriodChange",
"UpsizeAllowed",
"DownsizeAllowed",
"PartialSwitchAllowed",
"RemoveSwitchPath",
],
},
"allOf": [
{"contains": {"const": "FromPlan"}},
{"contains": {"const": "ToPlan"}},
{"contains": {"const": "ImmediateSwitchAllowed"}},
{"contains": {"const": "SubsPeriodChange"}},
{"contains": {"const": "UpsizeAllowed"}},
{"contains": {"const": "DownsizeAllowed"}},
],
"additionalItems": False,
},
}
PLAN_PERIODS_SCHEMA = {
"PlanPeriods": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ServicePlan",
"Period",
"PeriodType",
"Trial",
"FullRefundPeriod",
"AfterRefundPeriod",
"CancellationType",
"CancellationFeeValue",
"MPN",
],
},
"allOf": [
{"contains": {"const": "ServicePlan"}},
{"contains": {"const": "Period"}},
{"contains": {"const": "PeriodType"}},
],
"additionalItems": False,
},
}
RESOURCES_RATES_SCHEMA = {
"ResourceRates": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ServicePlan",
"Resource",
"IncUnits",
"MinUnits",
"MaxUnits",
"Measurable",
"ShowInCP",
"ShowInStore",
"ShowZeroRecurringFeeInOrder",
"ShowZeroSetupFeeInOrder",
"ShowZeroOveruseFeeInOrder",
"SetupFeePerUnit",
"RecurringFeePerUnit",
"MPN",
],
},
"allOf": [
{"contains": {"const": "ServicePlan"}},
{"contains": {"const": "Resource"}},
{"contains": {"const": "MinUnits"}},
{"contains": {"const": "MaxUnits"}},
],
"additionalItems": False,
},
}
SALES_CATEGORIES_SCHEMA = {
"SalesCategories": {**CATEGORIES_SCHEMA},
}
RESOURCE_CATEGORIES_SCHEMA = {
"ResourceCategories": {**CATEGORIES_SCHEMA},
}
DOWNSIZE_POLICIES_SCHEMA = {
"DownsizePolicies": {**POLICIES_SCHEMA},
}
CANCELATION_POLICIES_SCHEMA = {
"CancelationPolicies": {**POLICIES_SCHEMA},
}
NOTIFICATION_TEMPLATES_SCHEMA = {
"NotificationTemplates": {
"type": "array",
"items": {
"type": "string",
"enum": [
"TemplateName",
"Language",
"MessageType",
"MessageCategory",
"Subject",
"ToAddr",
"ToName",
"BccAddr",
"FromAddr",
"FromName",
"PDFFileName",
"Active",
"Condition",
"VisibleToReseller",
"Security",
"HTML",
"PlainText",
],
},
"allOf": [
{"contains": {"const": "TemplateName"}},
{"contains": {"const": "Language"}},
{"contains": {"const": "MessageCategory"}},
{"contains": {"const": "Subject"}},
{"contains": {"const": "ToAddr"}},
{"contains": {"const": "ToName"}},
{"contains": {"const": "FromAddr"}},
{"contains": {"const": "FromName"}},
{"contains": {"const": "HTML"}},
{"contains": {"const": "PlainText"}},
],
"additionalItems": False,
},
}
RESOURCE_DEPENDENCIES_SCHEMA = {
"ResourceDependencies": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ChildResource",
"ParentResource",
"DependenceKind",
"DependenceMultiplier",
"MPN",
],
},
"allOf": [
{"contains": {"const": "ChildResource"}},
{"contains": {"const": "ParentResource"}},
{"contains": {"const": "DependenceKind"}},
],
"additionalItems": False,
},
}
UPGRADE_RESOURCE_MAPPING_SCHEMA = {
"UpgradeResourceMapping": {
"type": "array",
"items": {
"type": "string",
"pattern": "^(FromResource|ToResource_\\d+)$",
},
"uniqueItems": True,
},
}
TERMS_CONDITIONS_SCHEMA = {
"TermsConditions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"Name",
"Acceptance",
"Active",
"Content",
],
},
"allOf": [
{"contains": {"const": "Name"}},
{"contains": {"const": "Content"}},
],
"additionalItems": False,
},
}
OP_UNIT_SERVICE_PLANS_SHCEMA = {
"OpUnitServicePlans": {
"type": "array",
"items": {
"type": "string",
"pattern": "^(OpUnit|ServicePlanName|TermsConditions_\\d+"
"|Published|ResellerGroupName_\\d+|MPN)$",
},
"uniqueItems": True,
},
}
REQUIRED_SHEETS = {
"required": ["Resources", "ServicePlans", "PlanPeriods", "ResourceRates"],
}
PPR_SCHEMA = {
"type": "object",
"properties": {
**RESOURCES_SCHEMA,
**SERVICE_PLANS_SCHEMA,
**PLAN_SWITCH_PATHS_SCHEMA,
**PLAN_PERIODS_SCHEMA,
**RESOURCES_RATES_SCHEMA,
**SALES_CATEGORIES_SCHEMA,
**RESOURCE_CATEGORIES_SCHEMA,
**DOWNSIZE_POLICIES_SCHEMA,
**CANCELATION_POLICIES_SCHEMA,
**NOTIFICATION_TEMPLATES_SCHEMA,
**RESOURCE_DEPENDENCIES_SCHEMA,
**UPGRADE_RESOURCE_MAPPING_SCHEMA,
**TERMS_CONDITIONS_SCHEMA,
**OP_UNIT_SERVICE_PLANS_SHCEMA,
},
**REQUIRED_SHEETS,
}
20 changes: 20 additions & 0 deletions connect_ext_ppr/service.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
from typing import Any, Dict

import jsonschema
from connect.client import ClientError

from connect_ext_ppr.db import get_db_ctx_manager
from connect_ext_ppr.models.deployment import Deployment
from connect_ext_ppr.utils import _parse_json_schema_error
from connect_ext_ppr.constants import PPR_SCHEMA


def add_deployments(installation, listings, config, logger):
Expand Down Expand Up @@ -40,3 +47,16 @@ def add_deployments(installation, listings, config, logger):
db.expire_all()
dep_ids = ', '.join([d.id for d in deployments])
logger.info(f"The following Deployments have been created: {dep_ids}.")


def validate_ppr_schema(dict_file: Dict[str, Any]):
try:
jsonschema.validate(dict_file, PPR_SCHEMA)
except jsonschema.ValidationError as ex:
error = ClientError(
message=ex.message,
status_code=400,
error_code='VAL_000',
errors=_parse_json_schema_error(ex),
)
raise error
Loading

0 comments on commit a63e072

Please sign in to comment.