Skip to content

Commit

Permalink
Implement static dashboard url (#47 step 1)
Browse files Browse the repository at this point in the history
   - add a configuration flag in DeploymentProperties
   - use the configuration flag in BoshProcessor#preCreate()
  • Loading branch information
gberche-orange committed May 25, 2020
1 parent efda7c5 commit 2163d8f
Show file tree
Hide file tree
Showing 5 changed files with 195 additions and 143 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ public BrokerProcessor boshProcessor(Clock clock,
secretsGenerator,
pipelineCompletionTracker,
deploymentProperties.getBrokerDisplayName(),
deploymentProperties.getModelDeploymentShortAlias());
deploymentProperties.getModelDeploymentShortAlias(),
deploymentProperties.getDashboardUrlTemplate());
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,76 +14,80 @@
import org.springframework.cloud.servicebroker.model.instance.*;

import java.nio.file.Path;
import java.text.MessageFormat;

public class BoshProcessor extends DefaultBrokerProcessor {

private static Logger logger = LoggerFactory.getLogger(BoshProcessor.class.getName());
private final String brokerDisplayName;
private String modelDeploymentShortAlias;
private static Logger logger = LoggerFactory.getLogger(BoshProcessor.class.getName());
private final String brokerDisplayName;
private String modelDeploymentShortAlias;
private String dashboardUrlTemplate;

private String templatesRepositoryAliasName;
private String secretsRepositoryAliasName;
private PipelineCompletionTracker tracker;
private TemplatesGenerator templatesGenerator;
private SecretsGenerator secretsGenerator;
private String templatesRepositoryAliasName;
private String secretsRepositoryAliasName;
private PipelineCompletionTracker tracker;
private TemplatesGenerator templatesGenerator;
private SecretsGenerator secretsGenerator;

public BoshProcessor(String templatesRepositoryAliasName, String secretsRepositoryAliasName, TemplatesGenerator templatesGenerator, SecretsGenerator secretsGenerator, PipelineCompletionTracker tracker, String brokerDisplayName, String modelDeploymentShortAlias) {
public BoshProcessor(String templatesRepositoryAliasName, String secretsRepositoryAliasName, TemplatesGenerator templatesGenerator, SecretsGenerator secretsGenerator, PipelineCompletionTracker tracker, String brokerDisplayName, String modelDeploymentShortAlias, String dashboardUrlTemplate) {
this.templatesRepositoryAliasName = templatesRepositoryAliasName;
this.secretsRepositoryAliasName = secretsRepositoryAliasName;
this.templatesGenerator = templatesGenerator;
this.secretsGenerator = secretsGenerator;
this.tracker = tracker;
this.brokerDisplayName = brokerDisplayName;
this.modelDeploymentShortAlias = modelDeploymentShortAlias;
}

@Override
public void preCreate(Context ctx) {
//Need to retrieve workdirs from context (one for secrets and one for template)
Path templatesWorkDir = getPaasTemplate(ctx);
Path secretsWorkDir = getPaasSecret(ctx);

//Need to retrieve service instance id from context
CreateServiceInstanceRequest creationRequest = (CreateServiceInstanceRequest) ctx.contextKeys.get(ProcessorChainServiceInstanceService.CREATE_SERVICE_INSTANCE_REQUEST);
String serviceInstanceId = creationRequest.getServiceInstanceId();
logger.debug("service instance id is " + serviceInstanceId);

CoabVarsFileDto coabVarsFileDto = wrapOsbIntoVarsDto(creationRequest);
this.secretsGenerator = secretsGenerator;
this.tracker = tracker;
this.brokerDisplayName = brokerDisplayName;
this.modelDeploymentShortAlias = modelDeploymentShortAlias;
this.dashboardUrlTemplate = dashboardUrlTemplate;
}

//Check pre-requisites and generate paas-template structure
this.templatesGenerator.checkPrerequisites(templatesWorkDir);
this.templatesGenerator.generate(templatesWorkDir, serviceInstanceId, coabVarsFileDto);
@Override
public void preCreate(Context ctx) {
//Need to retrieve workdirs from context (one for secrets and one for template)
Path templatesWorkDir = getPaasTemplate(ctx);
Path secretsWorkDir = getPaasSecret(ctx);

//Check pre-requisites and generate paas-secrets structure
this.secretsGenerator.checkPrerequisites(secretsWorkDir);
this.secretsGenerator.generate(secretsWorkDir, serviceInstanceId, null);
//Need to retrieve service instance id from context
CreateServiceInstanceRequest creationRequest = (CreateServiceInstanceRequest) ctx.contextKeys.get(ProcessorChainServiceInstanceService.CREATE_SERVICE_INSTANCE_REQUEST);
String serviceInstanceId = creationRequest.getServiceInstanceId();
logger.debug("service instance id is " + serviceInstanceId);

//Create response and put it into context
CreateServiceInstanceResponse creationResponse = CreateServiceInstanceResponse.builder().
async(true).
operation(this.tracker.getPipelineOperationStateAsJson(creationRequest)).build();
ctx.contextKeys.put(ProcessorChainServiceInstanceService.CREATE_SERVICE_INSTANCE_RESPONSE, creationResponse);
CoabVarsFileDto coabVarsFileDto = wrapOsbIntoVarsDto(creationRequest);

//Generate commit message and put it into context
setCommitMsg(ctx, formatProvisionCommitMsg(creationRequest));
}
//Check pre-requisites and generate paas-template structure
this.templatesGenerator.checkPrerequisites(templatesWorkDir);
this.templatesGenerator.generate(templatesWorkDir, serviceInstanceId, coabVarsFileDto);

//Check pre-requisites and generate paas-secrets structure
this.secretsGenerator.checkPrerequisites(secretsWorkDir);
this.secretsGenerator.generate(secretsWorkDir, serviceInstanceId, null);

//Create response and put it into context
CreateServiceInstanceResponse creationResponse = CreateServiceInstanceResponse.builder().
async(true).
dashboardUrl(formatDashboard(dashboardUrlTemplate, creationRequest)).
operation(this.tracker.getPipelineOperationStateAsJson(creationRequest)).build();
ctx.contextKeys.put(ProcessorChainServiceInstanceService.CREATE_SERVICE_INSTANCE_RESPONSE, creationResponse);

//Generate commit message and put it into context
setCommitMsg(ctx, formatProvisionCommitMsg(creationRequest));
}

@Override
public void preGetLastOperation(Context ctx) {
public void preGetLastOperation(Context ctx) {

//Need to retrieve workdir from context
Path secretsWorkDir = getPaasSecret(ctx);
//Need to retrieve workdir from context
Path secretsWorkDir = getPaasSecret(ctx);

//Need to retrieve operation request from context
GetLastServiceOperationRequest operationRequest = (GetLastServiceOperationRequest)
ctx.contextKeys.get(ProcessorChainServiceInstanceService.GET_LAST_SERVICE_OPERATION_REQUEST);
//Need to retrieve operation request from context
GetLastServiceOperationRequest operationRequest = (GetLastServiceOperationRequest)
ctx.contextKeys.get(ProcessorChainServiceInstanceService.GET_LAST_SERVICE_OPERATION_REQUEST);

//Get deployment execution status through response
GetLastServiceOperationResponse operationResponse = this.tracker.getDeploymentExecStatus(secretsWorkDir, operationRequest.getServiceInstanceId(), operationRequest.getOperation(), operationRequest);
//Get deployment execution status through response
GetLastServiceOperationResponse operationResponse = this.tracker.getDeploymentExecStatus(secretsWorkDir, operationRequest.getServiceInstanceId(), operationRequest.getOperation(), operationRequest);

//Put the response into context
ctx.contextKeys.put(ProcessorChainServiceInstanceService.GET_LAST_SERVICE_OPERATION_RESPONSE, operationResponse);
}
//Put the response into context
ctx.contextKeys.put(ProcessorChainServiceInstanceService.GET_LAST_SERVICE_OPERATION_RESPONSE, operationResponse);
}

@Override
public void preBind(Context ctx) {
Expand All @@ -110,68 +114,68 @@ public void preUnBind(Context ctx) {
this.tracker.delegateUnbindRequest(secretsWorkDir, request);
}

@Override
public void preDelete(Context ctx) {
@Override
public void preDelete(Context ctx) {

//Need to retrieve workdir from context
Path secretsWorkDir = getPaasSecret(ctx);
//Need to retrieve workdir from context
Path secretsWorkDir = getPaasSecret(ctx);

//Need to retrieve delete request from context
DeleteServiceInstanceRequest request = (DeleteServiceInstanceRequest) ctx.contextKeys.get(ProcessorChainServiceInstanceService.DELETE_SERVICE_INSTANCE_REQUEST);
String serviceInstanceId = request.getServiceInstanceId();
//Need to retrieve delete request from context
DeleteServiceInstanceRequest request = (DeleteServiceInstanceRequest) ctx.contextKeys.get(ProcessorChainServiceInstanceService.DELETE_SERVICE_INSTANCE_REQUEST);
String serviceInstanceId = request.getServiceInstanceId();

//Check pre-requisites and generate paas-secrets structure
this.secretsGenerator.checkPrerequisites(secretsWorkDir);
this.secretsGenerator.remove(secretsWorkDir, serviceInstanceId);
//Check pre-requisites and generate paas-secrets structure
this.secretsGenerator.checkPrerequisites(secretsWorkDir);
this.secretsGenerator.remove(secretsWorkDir, serviceInstanceId);

//Create response and put it into context
DeleteServiceInstanceResponse deletionResponse = DeleteServiceInstanceResponse.builder()
.async(true)
.operation(this.tracker.getPipelineOperationStateAsJson(request)).build();
//Create response and put it into context
DeleteServiceInstanceResponse deletionResponse = DeleteServiceInstanceResponse.builder()
.async(true)
.operation(this.tracker.getPipelineOperationStateAsJson(request)).build();

ctx.contextKeys.put(ProcessorChainServiceInstanceService.DELETE_SERVICE_INSTANCE_RESPONSE, deletionResponse);
ctx.contextKeys.put(ProcessorChainServiceInstanceService.DELETE_SERVICE_INSTANCE_RESPONSE, deletionResponse);

//Generate commit message and put it into context
setCommitMsg(ctx, formatUnprovisionCommitMsg(request));
}
//Generate commit message and put it into context
setCommitMsg(ctx, formatUnprovisionCommitMsg(request));
}

protected String formatProvisionCommitMsg(CreateServiceInstanceRequest request) {
String originDetails;
String originDetails;

Object userKey = extractUserKeyFromOsbContext(request.getOriginatingIdentity());
Object userKey = extractUserKeyFromOsbContext(request.getOriginatingIdentity());

String organizationGuid = extractCfOrgGuid(request);
String spaceGuid = extractCfSpaceGuid(request);
String organizationGuid = extractCfOrgGuid(request);
String spaceGuid = extractCfSpaceGuid(request);

originDetails = "Requested from space_guid=" + spaceGuid + " org_guid=" + organizationGuid + " by user_guid=" + userKey;
return brokerDisplayName + " broker: create instance id=" + request.getServiceInstanceId()
+ "\n\n" + originDetails;
originDetails = "Requested from space_guid=" + spaceGuid + " org_guid=" + organizationGuid + " by user_guid=" + userKey;
return brokerDisplayName + " broker: create instance id=" + request.getServiceInstanceId()
+ "\n\n" + originDetails;
}

private String extractCfSpaceGuid(CreateServiceInstanceRequest request) {
private String extractCfSpaceGuid(CreateServiceInstanceRequest request) {
org.springframework.cloud.servicebroker.model.Context context = request.getContext();
if (context instanceof CloudFoundryContext) {
CloudFoundryContext cloudFoundryContext = (CloudFoundryContext) context;
return cloudFoundryContext.getSpaceGuid();
}
return null;
}

private String extractCfOrgGuid(CreateServiceInstanceRequest request) {
org.springframework.cloud.servicebroker.model.Context context = request.getContext();
if (context instanceof CloudFoundryContext) {
CloudFoundryContext cloudFoundryContext = (CloudFoundryContext) context;
return cloudFoundryContext.getOrganizationGuid();
}
return null;
}

protected String formatUnprovisionCommitMsg(DeleteServiceInstanceRequest request) {
}

private String extractCfOrgGuid(CreateServiceInstanceRequest request) {
org.springframework.cloud.servicebroker.model.Context context = request.getContext();
if (context instanceof CloudFoundryContext) {
CloudFoundryContext cloudFoundryContext = (CloudFoundryContext) context;
return cloudFoundryContext.getOrganizationGuid();
}
return null;
}

protected String formatUnprovisionCommitMsg(DeleteServiceInstanceRequest request) {
Object userKey = extractUserKeyFromOsbContext(request.getOriginatingIdentity());

return brokerDisplayName + " broker: delete instance id=" + request.getServiceInstanceId()
+ "\n\nRequested by user_guid=" + userKey;
}
return brokerDisplayName + " broker: delete instance id=" + request.getServiceInstanceId()
+ "\n\nRequested by user_guid=" + userKey;
}

private String extractUserKeyFromOsbContext(org.springframework.cloud.servicebroker.model.Context context) {
if (context instanceof CloudFoundryContext) {
Expand All @@ -181,44 +185,51 @@ private String extractUserKeyFromOsbContext(org.springframework.cloud.servicebro
return null;
}

private Path getPaasSecret(Context ctx) {
Path secretsWorkDir = (Path) ctx.contextKeys.get(secretsRepositoryAliasName + GitProcessorContext.workDir.toString());
logger.debug("secrets workDir is " + secretsWorkDir.toString());
return secretsWorkDir;
}
private Path getPaasSecret(Context ctx) {
Path secretsWorkDir = (Path) ctx.contextKeys.get(secretsRepositoryAliasName + GitProcessorContext.workDir.toString());
logger.debug("secrets workDir is " + secretsWorkDir.toString());
return secretsWorkDir;
}

private Path getPaasTemplate(Context ctx) {
Path templatesWorkDir = (Path) ctx.contextKeys.get(templatesRepositoryAliasName + GitProcessorContext.workDir.toString());
logger.debug("templates workDir is " + templatesWorkDir.toString());
return templatesWorkDir;
}
private Path getPaasTemplate(Context ctx) {
Path templatesWorkDir = (Path) ctx.contextKeys.get(templatesRepositoryAliasName + GitProcessorContext.workDir.toString());
logger.debug("templates workDir is " + templatesWorkDir.toString());
return templatesWorkDir;
}

/**
* Set commmit msg for both secrets and template repos. Template repos commit msg will be ignored if not changes
*/
/**
* Set commmit msg for both secrets and template repos. Template repos commit msg will be ignored if not changes
*/
private void setCommitMsg(Context ctx, String msg) {
ctx.contextKeys.put(templatesRepositoryAliasName + GitProcessorContext.commitMessage.toString(), msg);
ctx.contextKeys.put(secretsRepositoryAliasName + GitProcessorContext.commitMessage.toString(), msg);
}

protected CoabVarsFileDto wrapOsbIntoVarsDto(CreateServiceInstanceRequest request) {
String userKey = extractUserKeyFromOsbContext(request.getOriginatingIdentity());
String organizationGuid = extractCfOrgGuid(request);
String spaceGuid = extractCfSpaceGuid(request);

CoabVarsFileDto coabVarsFileDto = new CoabVarsFileDto();
coabVarsFileDto.deployment_name = modelDeploymentShortAlias+ "_" + request.getServiceInstanceId();
coabVarsFileDto.instance_id = request.getServiceInstanceId();
coabVarsFileDto.service_id = request.getServiceDefinitionId();
coabVarsFileDto.plan_id = request.getPlanId();

coabVarsFileDto.context.user_guid = userKey;
coabVarsFileDto.context.space_guid = spaceGuid;
coabVarsFileDto.context.organization_guid = organizationGuid;
if (request.getParameters() != null) {
coabVarsFileDto.parameters.putAll(request.getParameters());
}
ctx.contextKeys.put(templatesRepositoryAliasName + GitProcessorContext.commitMessage.toString(), msg);
ctx.contextKeys.put(secretsRepositoryAliasName + GitProcessorContext.commitMessage.toString(), msg);
}

protected CoabVarsFileDto wrapOsbIntoVarsDto(CreateServiceInstanceRequest request) {
String userKey = extractUserKeyFromOsbContext(request.getOriginatingIdentity());
String organizationGuid = extractCfOrgGuid(request);
String spaceGuid = extractCfSpaceGuid(request);

CoabVarsFileDto coabVarsFileDto = new CoabVarsFileDto();
coabVarsFileDto.deployment_name = modelDeploymentShortAlias + "_" + request.getServiceInstanceId();
coabVarsFileDto.instance_id = request.getServiceInstanceId();
coabVarsFileDto.service_id = request.getServiceDefinitionId();
coabVarsFileDto.plan_id = request.getPlanId();

coabVarsFileDto.context.user_guid = userKey;
coabVarsFileDto.context.space_guid = spaceGuid;
coabVarsFileDto.context.organization_guid = organizationGuid;
if (request.getParameters() != null) {
coabVarsFileDto.parameters.putAll(request.getParameters());
}
return coabVarsFileDto;
}

public String formatDashboard(String dashboardUrlTemplate, CreateServiceInstanceRequest request) {
if (dashboardUrlTemplate == null) {
return null;
}
return new MessageFormat(dashboardUrlTemplate).format(new String[]{request.getServiceInstanceId()});
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public class DeploymentProperties {
private String rootDeployment = "coab-depls"; //Root deployment (i.e coab-depls)
private String modelDeployment = "cassandravarsops"; //Model deployment (i.e cassandra, cassandravarsops, ...)
private String modelDeploymentShortAlias = "c"; //shortname for the model deployment. Enables distinguishing services. Should be short so that broker URL remains shorter than 63 chars
private String dashboardUrlTemplate = null; // dashboard url template e.g. "https://shield_{0}.redacted-ops-domain.com" where {0} resolves to service instance guid.

public String getRootDeployment() {
return rootDeployment;
Expand Down Expand Up @@ -45,5 +46,8 @@ public String getBrokerDisplayName() {
public void setBrokerDisplayName(String brokerDisplayName) {
this.brokerDisplayName = brokerDisplayName;
}

public String getDashboardUrlTemplate() { return dashboardUrlTemplate; }
public void setDashboardUrlTemplate(String dashboardUrlTemplate) { this.dashboardUrlTemplate = dashboardUrlTemplate; }
}

Loading

0 comments on commit 2163d8f

Please sign in to comment.