27 class LogFileResource :
public Wt::WResource
32 void set_last_log(
const std::string& log) { last_log_ = log; }
34 void handleRequest(
const Wt::Http::Request& request, Wt::Http::Response& response)
override
36 suggestFileName(
"jaiabot_upgrade_ansible_log_" + goby::time::file_str() +
".json");
37 response.addHeader(
"Content-Type",
"application/json");
38 response.out() << last_log_;
42 std::string last_log_;
45 class AutoScrollWidget :
public Wt::WContainerWidget
50 this->setOverflow(Wt::Overflow::Auto,
51 Wt::Orientation::Horizontal | Wt::Orientation::Vertical);
55 void addText(Wt::WString line)
57 this->addNew<Wt::WText>(line +
"<br/>");
60 std::string jsCode =
"var obj = document.getElementById('" + this->id() +
61 "'); obj.scrollTop = obj.scrollHeight;";
62 Wt::WApplication::instance()->doJavaScript(jsCode);
68 AnsiblePlaybookConfig(
const jaiabot::protobuf::UpgradeConfig::AnsiblePlaybook& playbook,
69 Wt::WContainerWidget* parent, LiaisonUpgrade* upgrade,
70 std::size_t playbook_index);
71 AnsiblePlaybookConfig() =
delete;
72 AnsiblePlaybookConfig(
const AnsiblePlaybookConfig&) =
delete;
73 AnsiblePlaybookConfig(AnsiblePlaybookConfig&&) =
default;
76 std::string stdout_file;
77 std::string json_file;
79 Wt::WPushButton* run_button{0};
80 Wt::WPushButton* log_button{0};
81 Wt::WPushButton* stdout_button{0};
82 Wt::WText* result_text{0};
83 Wt::WTable* result_table{0};
84 Wt::WGroupBox* stdout_group{0};
85 AutoScrollWidget* stdout_div{0};
87 std::vector<std::string>::const_iterator run_text_it;
89 std::map<std::string, std::string> input_var;
91 std::map<std::string, std::string> output_var;
92 std::vector<std::string> output_var_order;
96 ProcessData(
const protobuf::UpgradeConfig& cfg,
const std::string& playbook_file,
97 const jaiabot::protobuf::UpgradeConfig::AnsiblePlaybook& pb_playbook,
98 const std::string& input_vars,
const std::string& ansible_stdout_file,
99 const std::string& ansible_json_file);
102 boost::asio::io_service
io;
108 std::unique_ptr<ProcessData> pdata;
109 std::string last_log;
110 std::shared_ptr<LogFileResource> log_resource;
111 const jaiabot::protobuf::UpgradeConfig::AnsiblePlaybook& pb_playbook;
126 ResultType result{SUCCESS};
127 std::map<std::string, std::string> output_vars;
130 void run_ansible_playbook(std::size_t playbook_index);
131 void set_input_var(
int selection_index, Wt::WComboBox* selection, std::string name,
132 std::size_t playbook_index);
134 void process_ansible_json_result(nlohmann::json j, AnsiblePlaybookConfig& playbook);
135 void toggle_stdout(std::size_t playbook_index);
138 void focus()
override { timer_.start(); }
139 void unfocus()
override { timer_.stop(); }
142 struct SectionWidgets
145 Wt::WContainerWidget* div;
148 std::map<std::string, SectionWidgets> sections;
150 const protobuf::UpgradeConfig& cfg_;
151 std::vector<AnsiblePlaybookConfig> playbooks_;
153 static const std::vector<std::string> running_;
154 static const Wt::WColor color_success_;
155 static const Wt::WColor color_failure_;