Skip to content

Commit

Permalink
feat(provider/cf): deploy Service via manifest (#6094)
Browse files Browse the repository at this point in the history
- spinnaker/spinnaker#3592

Co-Authored-By: Joris Melchior <joris.melchior@gmail.com>
  • Loading branch information
jmelchio authored and jkschneider committed Dec 7, 2018
1 parent 9e3415c commit d5c2511
Show file tree
Hide file tree
Showing 7 changed files with 324 additions and 103 deletions.
1 change: 1 addition & 0 deletions app/scripts/modules/cloudfoundry/src/cf.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { CloudFoundryNoLoadBalancerModal } from './loadBalancer/configure/cloudF
import 'cloudfoundry/pipeline/config/validation/instanceSize.validator';
import 'cloudfoundry/pipeline/config/validation/cfTargetImpedance.validator';
import 'cloudfoundry/pipeline/config/validation/validServiceParameterJson.validator';
import 'cloudfoundry/pipeline/config/validation/validateManifestRequiredField.validator.ts';
import { CLOUD_FOUNDRY_DEPLOY_SERVICE_STAGE } from './pipeline/stages/deployService/cloudfoundryDeployServiceStage.module';
import { CLOUD_FOUNDRY_DESTROY_ASG_STAGE } from './pipeline/stages/destroyAsg/cloudfoundryDestroyAsgStage.module';
import { CLOUD_FOUNDRY_DESTROY_SERVICE_STAGE } from './pipeline/stages/destroyService/cloudfoundryDestroyServiceStage.module';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { IValidatorConfig } from '@spinnaker/core';

export interface IManifestFieldValidatorConfig extends IValidatorConfig {
manifestType: string;
}
Original file line number Diff line number Diff line change
@@ -1,66 +1,51 @@
import { get, has, upperFirst } from 'lodash';
import { get, upperFirst } from 'lodash';

import {
IPipeline,
IStage,
IStageOrTriggerValidator,
ITrigger,
IValidatorConfig,
PipelineConfigValidator,
} from '@spinnaker/core';

export interface IServiceParameterJsonValidationConfig extends IValidatorConfig {
fieldName: string;
fieldLabel?: string;
message?: string;
}
import { IPipeline, IStage, IStageOrTriggerValidator, ITrigger, PipelineConfigValidator } from '@spinnaker/core';
import { IManifestFieldValidatorConfig } from 'cloudfoundry/pipeline/config/validation/ManifestConfigValidator';

export class ServiceParameterJsonFieldValidator implements IStageOrTriggerValidator {
public validate(
pipeline: IPipeline,
stage: IStage | ITrigger,
validationConfig: IServiceParameterJsonValidationConfig,
): string {
if (!this.passesValidation(stage, validationConfig)) {
return this.validationMessage(validationConfig, pipeline);
}
return null;
}

protected passesValidation(
stage: IStage | ITrigger,
validationConfig: IServiceParameterJsonValidationConfig,
): boolean {
return this.fieldIsValid(stage, validationConfig);
}

protected validationMessage(validationConfig: IServiceParameterJsonValidationConfig, pipeline: IPipeline): string {
const fieldLabel: string = this.printableFieldLabel(validationConfig);
return (
validationConfig.message || `<strong>${fieldLabel}</strong> should be a valid JSON string in ${pipeline.name}`
);
private static validationMessage(validationConfig: IManifestFieldValidatorConfig): string {
const fieldLabel: string = ServiceParameterJsonFieldValidator.printableFieldLabel(validationConfig);
return validationConfig.message || `<strong>${fieldLabel}</strong> should be a valid JSON string.`;
}

protected printableFieldLabel(config: IServiceParameterJsonValidationConfig): string {
private static printableFieldLabel(config: IManifestFieldValidatorConfig): string {
const fieldLabel: string = config.fieldLabel || config.fieldName;
return upperFirst(fieldLabel);
}

protected fieldIsValid(stage: IStage | ITrigger, config: IServiceParameterJsonValidationConfig): boolean {
const fieldExists = has(stage, config.fieldName);
const field: any = get(stage, config.fieldName);
private static fieldIsValid(stage: IStage | ITrigger, config: IManifestFieldValidatorConfig): boolean {
const manifest: any = get(stage, 'manifest');
const content: any = get(manifest, config.fieldName);

if (!fieldExists || !field.trim()) {
if (!content) {
return true;
}

try {
JSON.parse(field);
JSON.parse(content);
return true;
} catch (e) {
return false;
}
}

public validate(
_pipeline: IPipeline,
stage: IStage | ITrigger,
validationConfig: IManifestFieldValidatorConfig,
): string {
const manifest: any = get(stage, 'manifest');

if (manifest.type !== validationConfig.manifestType) {
return null;
}

if (!ServiceParameterJsonFieldValidator.fieldIsValid(stage, validationConfig)) {
return ServiceParameterJsonFieldValidator.validationMessage(validationConfig);
}
return null;
}
}

PipelineConfigValidator.registerValidator('validServiceParameterJson', new ServiceParameterJsonFieldValidator());
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { get, upperFirst } from 'lodash';

import { IPipeline, IStage, IStageOrTriggerValidator, ITrigger, PipelineConfigValidator } from '@spinnaker/core';
import { IManifestFieldValidatorConfig } from 'cloudfoundry/pipeline/config/validation/ManifestConfigValidator';

export class RequiredManifestFieldValidator implements IStageOrTriggerValidator {
public validate(
_pipeline: IPipeline,
stage: IStage | ITrigger,
validationConfig: IManifestFieldValidatorConfig,
): string {
const manifest: any = get(stage, 'manifest');

if (manifest.type !== validationConfig.manifestType) {
return null;
}

const content: any = get(manifest, validationConfig.fieldName);
const fieldLabel = upperFirst(validationConfig.fieldName);
return content ? null : `<strong>${fieldLabel}</strong> is a required field for Deploy Service stages.`;
}
}

PipelineConfigValidator.registerValidator('requiredManifestField', new RequiredManifestFieldValidator());
Loading

0 comments on commit d5c2511

Please sign in to comment.