After the initial creation of a new workflow, you can start editing the workflow's
_page.py
file and other scripts to implement the desired
functionality.
<bluecat_gateway>
folder:<bluecat_gateway>/workflows/<category_name>/<workflow_name>
Where:
<bluecat_gateway>
is the BlueCat Gateway folder.<category_name>
is the nested Workflow Category (and optional subcategory) that you specified when creating the workflow in Gateway.-
<workflow_name>
is the Workflow Name that you specified when creating the workflow in Gateway.
For example, if the workflow name was example_workflow
and you entered a
category of Examples
, the files would be stored under
<bluecat_gateway>/workflows/Examples/example_workflow
.
While Gateway fills in each file with starter code, you can replace it with your own implementation. Once done, it can be called by any suitable REST client using Basic authentication.
The workflow script's app.route header
When implementing a workflow script, make sure that Flask's app.route()
decorator is replaced with the @route()
decorator. The
@route()
decorator enforces separation of namespaces between
different workflows. If you don't use @route()
, it is possible for
function and endpoint name collisions to occur, especially when multiple people
develop workflows at the same time.
Sample UI workflow scripts
# The workflow name must be the first part of any endpoints defined in this file.
# If you break this rule, you will trip up on other people's endpoint names and
# chaos will ensue.
@route(app, '/example_workflow/example_workflow_endpoint')
@util.workflow_permission_required('example_workflow_page')
@util.exception_catcher
@util.ui_secure_endpoint
def example_workflow_example_workflow_page():
form = GenericFormTemplate()
# Remove this line if your workflow does not need to select a configuration
form.configuration.choices = util.get_configurations(default_val=True)
return render_template(
'example_workflow_page.html',
form=form,
text=util.get_text(module_path(), config.language),
options=g.user.get_options(),
)
@route(app, '/example_workflow/form', methods=['POST'])
@util.workflow_permission_required('example_workflow_page')
@util.exception_catcher
@util.ui_secure_endpoint
def example_workflow_example_workflow_page_form():
form = GenericFormTemplate()
# Remove this line if your workflow does not need to select a configuration
form.configuration.choices = util.get_configurations(default_val=True)
if not form.validate_on_submit():
g.user.logger.info('Form data was not valid.')
return render_template(
'example_workflow_page.html',
form=form,
text=util.get_text(module_path(), config.language),
options=g.user.get_options(),
)
print(form.configuration.data)
print(form.email.data)
print(form.password.data)
print(form.mac_address.data)
print(form.ip_address.data)
print(form.url.data)
print(form.file.data)
print(form.boolean_checked.data)
print(form.boolean_unchecked.data)
print(form.date_time.data)
print(form.submit.data)
# Put form processing logic here
g.user.logger.info('SUCCESS')
flash('success', 'succeed')
return redirect(url_for('example_workflowexample_workflow_example_workflow_page'))
Sample API workflow script
Since the new workflow was created as a REST API workflow, it will not show up on the
Available Actions menu. As with UI workflows, Gateway creates new files for your new API in the
<bluecat_gateway>/workflows/<category_name>/<workflow_name>
folder.
# Copyright 2020 BlueCat Networks. All rights reserved.
from flask import request, g, abort, jsonify
from bluecat import route, util
from main_app import app
@route(app, '/example_rest_workflow/example_rest_workflow_endpoint', methods=['GET', 'PUT', 'POST'])
@util.rest_workflow_permission_required('example_rest_workflow_page')
@util.rest_exception_catcher
def example_rest_workflow_example_rest_workflow_page():
# Put endpoint logic here
g.user.logger.info('SUCCESS')
return jsonify({"method": request.method})
Again, you can place your own implementation in this file. Once done, it can be called by any suitable REST client using Basic authentication.