Skip to content
This repository has been archived by the owner on Jul 12, 2022. It is now read-only.

Commit

Permalink
turn the reconcile class in a use case
Browse files Browse the repository at this point in the history
Signed-off-by: Cassio Godinho <cassiopgodinho@gmail.com>
  • Loading branch information
cpgo committed Feb 19, 2021
1 parent 4704477 commit b840652
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 17 deletions.
14 changes: 7 additions & 7 deletions butler/src/app/v2/operator/deployments.hook.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { KubernetesManifest } from '../core/integrations/interfaces/k8s-manifest
import { K8sClient } from '../core/integrations/k8s/client'
import { ConsoleLoggerService } from '../core/logs/console/console-logger.service'
import { HookParams } from './params.interface'
import { Reconcile } from './reconcile'
import { ReconcileDeployment } from './use-cases/reconcile-deployments.usecase'

@Controller('/')
export class DeploymentsHookController {
Expand All @@ -17,25 +17,25 @@ export class DeploymentsHookController {
private readonly deploymentRepository: DeploymentRepositoryV2,
private readonly componentRepository: ComponentsRepositoryV2,
private readonly configurationRepository: CdConfigurationsRepository,
private readonly consoleLoggerService: ConsoleLoggerService
private readonly consoleLoggerService: ConsoleLoggerService,
private readonly reconcileUseCase: ReconcileDeployment
) { }

@Post('/v2/operator/deployment/hook/reconcile')
@HttpCode(200)
@UsePipes(new ValidationPipe({ transform: true }))
public async reconcile(@Body() params: HookParams) : Promise<{status?: unknown, children: KubernetesManifest[], resyncAfterSeconds?: number}> {
const reconcile = new Reconcile()
const deployment = await this.deploymentRepository.findWithComponentsAndConfig(params.parent.spec.deploymentId)
const decryptedConfig = await this.configurationRepository.findDecrypted(deployment.cdConfiguration.id)
const rawSpecs = deployment.components.flatMap(c => c.manifests)
const specs = reconcile.addMetadata(rawSpecs, deployment)
const specs = this.reconcileUseCase.addMetadata(rawSpecs, deployment)

if (isEmpty(params.children['Deployment.apps/v1'])) {
return { children: specs, resyncAfterSeconds: 5 }
}
const currentDeploymentSpecs = reconcile.specsByDeployment(params, deployment.id)
const currentDeploymentSpecs = this.reconcileUseCase.specsByDeployment(params, deployment.id)

const allReady = reconcile.checkConditions(currentDeploymentSpecs)
const allReady = this.reconcileUseCase.checkConditions(currentDeploymentSpecs)
if (allReady === false) {
const previousDeploymentId = deployment.previousDeploymentId

Expand All @@ -44,7 +44,7 @@ export class DeploymentsHookController {
return { children: specs, resyncAfterSeconds: 5 }
}
const previousDeployment = await this.deploymentRepository.findWithComponentsAndConfig(previousDeploymentId)
const currentAndPrevious = reconcile.concatWithPrevious(previousDeployment, specs)
const currentAndPrevious = this.reconcileUseCase.concatWithPrevious(previousDeployment, specs)
return { children: currentAndPrevious, resyncAfterSeconds: 5 }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Injectable } from '@nestjs/common'
import { uniqWith } from 'lodash'
import { DeploymentEntityV2 } from '../api/deployments/entity/deployment.entity'
import { KubernetesManifest } from '../core/integrations/interfaces/k8s-manifest.interface'
import { HookParams, SpecMetadata, SpecStatus } from './params.interface'
import { DeploymentEntityV2 } from '../../api/deployments/entity/deployment.entity'
import { KubernetesManifest } from '../../core/integrations/interfaces/k8s-manifest.interface'
import { HookParams, SpecMetadata, SpecStatus } from '../params.interface'


export class Reconcile {
@Injectable()
export class ReconcileDeployment {
public concatWithPrevious(previousDeployment: DeploymentEntityV2, specs: KubernetesManifest[]) : KubernetesManifest[] {
const rawSpecs = previousDeployment.components.flatMap(c => c.manifests)
const previousSpecs = this.addMetadata(rawSpecs, previousDeployment)
Expand Down
10 changes: 5 additions & 5 deletions butler/src/tests/v2/unit/operator/reconcile.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@ import { ComponentEntityV2 } from '../../../../app/v2/api/deployments/entity/com
import { DeploymentEntityV2 } from '../../../../app/v2/api/deployments/entity/deployment.entity'
import { GitProvidersEnum } from '../../../../app/v2/core/configuration/interfaces/git-providers.type'
import { ClusterProviderEnum } from '../../../../app/v2/core/integrations/octopipe/interfaces/octopipe-payload.interface'
import { Reconcile } from '../../../../app/v2/operator/reconcile'
import { ReconcileDeployment } from '../../../../app/v2/operator/use-cases/reconcile-deployments.usecase'
import { reconcileFixtures, reconcileFixturesParams } from './params'

describe('Deployment on existing circle', () => {
it('returns empty array for the first reconcile loop on same circle that already had deployments', () => {
const params = reconcileFixturesParams.paramsWithPreviousDeployment
const currentDeployment = reconcileFixtures.currentDeploymentId
const reconcile = new Reconcile()
const reconcile = new ReconcileDeployment()
expect(reconcile.specsByDeployment(params, currentDeployment)).toEqual([])
})
it('returns list of previous deployment specs', () => {
const params = reconcileFixturesParams.paramsWithPreviousDeployment
const previousDeployment = reconcileFixtures.previousDeploymentId
const reconcile = new Reconcile()
const reconcile = new ReconcileDeployment()
const ids = reconcile.specsByDeployment(params, previousDeployment).map(s => s.metadata.labels.deployment_id)
expect(ids).toEqual([previousDeployment, previousDeployment])
})
Expand All @@ -27,15 +27,15 @@ describe('Deployment on existing circle', () => {
const params = reconcileFixturesParams.paramsWithPreviousDeployment
const previousDeployment = reconcileFixtures.previousDeploymentId
const currentDeployment = reconcileFixtures.currentDeploymentId
const reconcile = new Reconcile()
const reconcile = new ReconcileDeployment()
const currentSpecs = reconcile.specsByDeployment(params, currentDeployment)
const previousSpecs = reconcile.specsByDeployment(params, previousDeployment)
expect(reconcile.checkConditions(currentSpecs)).toEqual(false)
expect(reconcile.checkConditions(previousSpecs)).toEqual(true)
})

it('concatenates deployments and services from previous and current deployment', () => {
const reconcile = new Reconcile()
const reconcile = new ReconcileDeployment()
const cdConfig = new CdConfigurationEntity(
CdTypeEnum.OCTOPIPE,
{ provider: ClusterProviderEnum.DEFAULT, gitProvider: GitProvidersEnum.GITHUB, gitToken: 'my-token', namespace: 'my-namespace' },
Expand Down

0 comments on commit b840652

Please sign in to comment.