Skip to content

Instantly share code, notes, and snippets.

@iNecas
Last active July 18, 2019 00:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save iNecas/262ac10a200f1a004a8f57cd3e4371f9 to your computer and use it in GitHub Desktop.
Save iNecas/262ac10a200f1a004a8f57cd3e4371f9 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
function export-csv () {
echo "Exporting $2"
echo "COPY ($1) TO STDOUT WITH CSV;" | su - postgres -c '/usr/bin/psql -d foreman' > $2
}
function import-csv () {
echo "Importing $2"
su - postgres -c "/usr/bin/psql -d $IMPORT_DATABASE -c 'COPY $1 FROM STDIN WITH CSV'" <$2
}
function run-dynflow () {
block=${1:-false}
cat <<EOF | sudo -u postgres scl enable tfm ruby
require 'dynflow'
config = Dynflow::Config.new
config.persistence_adapter = Dynflow::PersistenceAdapters::Sequel.new "postgres://postgres@/$IMPORT_DATABASE"
config.logger_adapter = Dynflow::LoggerAdapters::Simple.new STDERR, 4
config.auto_rescue = false
config.auto_execute = false
config.auto_validity_check = false
config.auto_terminate = false
world = Dynflow::World.new(config)
if $block
require 'dynflow/web'
dynflow_console = Dynflow::Web.setup do
set :world, world
end
puts "\n The Dynflow console is starting. To increase the page size, use 'per_page=1000' in web query\n\n"
Rack::Server.new(:app => dynflow_console, :Port => 4567).start
end
EOF
}
function dynflow-import () {
sudo su - postgres -c "createdb $IMPORT_DATABASE"
# prepare db schema
run-dynflow
# load data
import-csv dynflow_execution_plans dynflow_execution_plans.csv
import-csv dynflow_actions dynflow_actions.csv
import-csv dynflow_steps dynflow_steps.csv
# run web console
run-dynflow true
}
function dynflow-export () {
export-csv "select dynflow_execution_plans.* from foreman_tasks_tasks join dynflow_execution_plans on (foreman_tasks_tasks.external_id = dynflow_execution_plans.uuid) where foreman_tasks_tasks.started_at > 'now'::timestamp - '2 months'::interval" dynflow_execution_plans.csv
export-csv "select dynflow_actions.* from foreman_tasks_tasks join dynflow_actions on (foreman_tasks_tasks.external_id = dynflow_actions.execution_plan_uuid) where foreman_tasks_tasks.started_at > 'now'::timestamp - '2 months'::interval" dynflow_actions.csv
export-csv "select dynflow_steps.* from foreman_tasks_tasks join dynflow_steps on (foreman_tasks_tasks.external_id = dynflow_steps.execution_plan_uuid) where foreman_tasks_tasks.started_at > 'now'::timestamp - '2 months'::interval" dynflow_steps.csv
export-csv "select * from foreman_tasks_tasks" foreman_tasks_tasks.csv
export-csv "select * from dynflow_schema_info" dynflow_schema_info.csv
}
operation=$1
shift
case $operation in
import )
IMPORT_DATABASE=${1:-dynflow-import}
dynflow-import;;
export )
dynflow-export ;;
* )
cat <<HELP
Usage:
Export dynflow data to CSV files inside current directory:
dynflow-csv export
Import CSV data from current directory
dynflow-csv import [database-name]
* database-name - what database to use for loading the data? "dynflow-import" by default
HELP
esac
@pmoravec
Copy link

"function dynflow-import": shall not be here also:

import-csv dynflow_schema_info dynflow_schema_info.csv

?

@iNecas
Copy link
Author

iNecas commented Feb 20, 2017

For now, we don't ened the dynflow_schema_info: we let the dynflow to recreate the schema for now.

@pmoravec
Copy link

"createdb $IMPORT_DATABASE" (why I can't comment individual lines?): I suggest improvement: if the db already exist, drop it first (or make the drop optional) - we will often use the same machine for importing different task "exports" and need some cleanup.

Worth to mention in usage/help or in stdout, that the WebUI is running on $(hostname):4567

Tiny bug in dynflow(?): clicking twice to sort per time shall sort in descending order, but ascending order (from 1st change) remains. But browser knows button "Back" :)

Otherwise great.

@pmoravec
Copy link

Another (monkey) improvement since on my rails (rubygem-rails-4.2.6-1, for foreman 1.15 / Satellite 6.3), the app listens on localhost only - let it listen on its hostname's IP rather:

  ..
  require 'socket'
  Rack::Server.new(:app => dynflow_console, :Port => 4567, :Host => Socket.gethostname).start
  ..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment