Skip to content

Commit

Permalink
Merge pull request #59 from cloudblue/feature/LITE-28079-Create-New-D…
Browse files Browse the repository at this point in the history
…eployment-Requests

LITE-28079: Create New Deployment Request
  • Loading branch information
d3rky authored Aug 1, 2023
2 parents 2d89919 + bbaf0c6 commit f8c4def
Show file tree
Hide file tree
Showing 17 changed files with 940 additions and 5,542 deletions.
27 changes: 27 additions & 0 deletions connect_ext_ppr/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,33 @@ def set_next_verbose(self, instance, related_id_field):
instance.id = '{0}-{1}'.format(_instance_id, '{0:03d}'.format(new_suffix))
return self.add(instance)

def set_all_next_verbose(self, instances, related_id_field):
first_item = instances[0]
instance_class = first_item.__class__
new_suffix = 0
related_id_value = getattr(first_item, related_id_field)

if (
self.query(self.query(instance_class).filter(
instance_class.__dict__[related_id_field] == related_id_value).exists(),
).scalar()
):

last_obj = self.query(instance_class).order_by(
instance_class.id.desc(),
).first()
_instance_id, suffix = last_obj.id.rsplit('-', 1)
new_suffix = int(suffix) + 1
else:
id_body = related_id_value.split('-', 1)[-1]
_instance_id = f"{instance_class.PREFIX}-{id_body}"

for instance in instances:
instance.id = '{0}-{1}'.format(_instance_id, '{0:03d}'.format(new_suffix))
new_suffix += 1

return self.add_all(instances)


SessionLocal = sessionmaker(autocommit=False, autoflush=False, class_=VerboseBaseSession)
Model = declarative_base()
Expand Down
5 changes: 5 additions & 0 deletions connect_ext_ppr/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,16 @@ class ExtensionHttpError(ExtensionErrorBase):
" for first row in Batch {batch_id}.",
15: 'No Marketplace is linked with Deployment Hub {hub_id}',
16: "Pricing Batch '{batch_id}' does not have any file.",
17: "Cannot create a new request, an open one already exists.",
}


class ExtensionValidationError(ExtensionErrorBase):
PREFIX = 'VAL'
ERRORS = {
0: "{validation_error}", # PPR Schema validation
1: "{field}: {id} not found.",
2: "{field}: This values {values} are invalid.",
3: "At least one choice needs to be specified.",
4: "Cannot applied PPR to {entity} {values}.",
}
9 changes: 7 additions & 2 deletions connect_ext_ppr/models/deployment.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class Deployment(Model):
updated_at = db.Column(db.DateTime(), onupdate=datetime.utcnow, default=datetime.utcnow)

product = relationship("Product", back_populates="deployment")
marketplaces = relationship('MarketplaceConfiguration', backref='deployment', lazy=True)


class DeploymentRequest(Model):
Expand Down Expand Up @@ -63,15 +64,19 @@ class DeploymentRequest(Model):
aborted_by = db.Column(db.String(20), nullable=True)

ppr = relationship('PPRVersion', foreign_keys="DeploymentRequest.ppr_id")
deployment = relationship('Deployment', foreign_keys="DeploymentRequest.deployment_id")
deployment = relationship(
'Deployment',
foreign_keys="DeploymentRequest.deployment_id",
innerjoin=True,
)


class MarketplaceConfiguration(Model):
__tablename__ = 'marketplace_configuration'

id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
marketplace = db.Column(db.String(16))
deployment = db.Column(db.ForeignKey(Deployment.id), nullable=True)
deployment_id = db.Column(db.ForeignKey(Deployment.id), nullable=True)
deployment_request = db.Column(db.ForeignKey(DeploymentRequest.id), nullable=True)
ppr_id = db.Column(db.String, db.ForeignKey(PPRVersion.id))

Expand Down
1 change: 1 addition & 0 deletions connect_ext_ppr/models/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class Task(Model):
PREFIX = 'TSK'

STATUSES = TasksStatusChoices
TYPES = TaskTypesChoices

id = db.Column(db.String(30), primary_key=True)
status = db.Column(
Expand Down
28 changes: 27 additions & 1 deletion connect_ext_ppr/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
# All rights reserved.
#
from datetime import datetime
from typing import Dict, Optional, Union

from pydantic import BaseModel, Field, root_validator
from fastapi import status

from typing import Dict, List, Optional, Union

from connect_ext_ppr.errors import ExtensionValidationError
from connect_ext_ppr.models.enums import (
ConfigurationStateChoices,
DeploymentRequestStatusChoices,
Expand Down Expand Up @@ -56,6 +59,21 @@ def validate_events(cls, values):
return values


class PrimaryKeyReference(BaseModel):
id: str


class ChoicesSchema(BaseModel):
choices: Optional[List[PrimaryKeyReference]]
all: bool

@root_validator
def check_choices_exists_if_all_is_false(cls, values):
if not values.get('all') and not values.get('choices'):
raise ExtensionValidationError.VAL_003(status_code=status.HTTP_400_BAD_REQUEST)
return values


class VendorSchema(NonNullSchema):
id: str
name: str
Expand Down Expand Up @@ -187,3 +205,11 @@ class TaskSchema(NonNullSchema):
events: Events
status: TasksStatusChoices
error_message: Optional[str]


class DeploymentRequestCreateSchema(NonNullSchema):
deployment: PrimaryKeyReference
ppr: PrimaryKeyReference
manually: bool
delegate_l2: Optional[bool]
marketplaces: ChoicesSchema
65 changes: 63 additions & 2 deletions connect_ext_ppr/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,15 @@
from connect_ext_ppr.db import get_db_ctx_manager
from connect_ext_ppr.errors import ExtensionHttpError
from connect_ext_ppr.models.configuration import Configuration
from connect_ext_ppr.models.deployment import Deployment, MarketplaceConfiguration
from connect_ext_ppr.models.deployment import (
Deployment,
DeploymentRequest,
MarketplaceConfiguration,
)
from connect_ext_ppr.models.file import File
from connect_ext_ppr.models.ppr import PPRVersion
from connect_ext_ppr.models.replicas import Product
from connect_ext_ppr.models.task import Task
from connect_ext_ppr.schemas import clean_empties_from_dict, FileSchema, PPRVersionCreateSchema
from connect_ext_ppr.utils import (
build_summary,
Expand Down Expand Up @@ -55,11 +60,12 @@ def add_marketplaces_to_deployment(db, deployment, marketplaces):
configs = []
for marketplace in marketplaces:
mc = MarketplaceConfiguration(
deployment=deployment.id,
deployment_id=deployment.id,
marketplace=marketplace,
)
configs.append(mc)
db.add_all(configs)
db.commit()


def add_deployments(installation, listings, config, logger):
Expand Down Expand Up @@ -98,6 +104,7 @@ def add_deployments(installation, listings, config, logger):
)
deployments.append(dep)
seen.add(comb)

key = f"{product_id}#{hub_id}"
deployments_marketplaces.setdefault(
key,
Expand Down Expand Up @@ -291,3 +298,57 @@ def create_ppr(ppr, user_id, deployment, db, client, logger):
def validate_configuration(client, deployment, file_data):
data = get_configuration_from_media(client, deployment.account_id, deployment.id, file_data.id)
return validate_configuration_schema(data, deployment.product_id)


def add_new_deployment_request(db, dr_data, deployment, account_id, logger):
try:
deployment_request = DeploymentRequest(
deployment_id=dr_data.deployment.id,
ppr_id=dr_data.ppr.id,
manually=dr_data.manually,
delegate_l2=dr_data.delegate_l2,
created_by=account_id,
)
db.set_next_verbose(deployment_request, 'deployment_id')
db.commit()
db.refresh(deployment_request)

marketplaces = [m.id for m in dr_data.marketplaces.choices]
if dr_data.marketplaces.all:
marketplaces = [m.id for m in deployment.marketplaces]

for m_id in marketplaces:
mc = MarketplaceConfiguration(
deployment_request=deployment_request.id,
marketplace=m_id,
)
db.add(mc)

tasks = []
tasks.append(Task(
deployment_request=deployment_request.id,
title='PPR Validation',
type=Task.TYPES.ppr_validation,
created_by=account_id,
))
tasks.append(Task(
deployment_request=deployment_request.id,
title='Apply PP and delegate to marketplaces',
type=Task.TYPES.apply_and_delegate,
created_by=account_id,
))
if deployment_request.delegate_l2:
tasks.append(Task(
deployment_request=deployment_request.id,
title='Delegate to L2',
type=Task.TYPES.delegate_to_l2,
created_by=account_id,
))

db.set_all_next_verbose(tasks, 'deployment_request')
db.commit()
return deployment_request
except DBAPIError as ex:
logger.error(ex)
db.rollback()
raise ExtensionHttpError.EXT_003()
1 change: 0 additions & 1 deletion connect_ext_ppr/static/images/mkp.svg

This file was deleted.

Loading

0 comments on commit f8c4def

Please sign in to comment.