Skip to content

Commit

Permalink
dird: bconsole: changed list jobs jobstatus to support multiple comma…
Browse files Browse the repository at this point in the history
…s seperated values
  • Loading branch information
HediBenFraj authored and Hedi committed May 3, 2022
1 parent 936174a commit 162df41
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 58 deletions.
2 changes: 1 addition & 1 deletion core/src/cats/cats.h
Expand Up @@ -789,7 +789,7 @@ class BareosDb : public BareosDbQueryEnum {
JobDbRecord* jr,
const char* range,
const char* clientname,
int jobstatus,
std::vector<char> jobstatusarray,
int joblevel,
std::vector<char> jobtypes,
const char* volumename,
Expand Down
8 changes: 5 additions & 3 deletions core/src/cats/sql_list.cc
Expand Up @@ -507,7 +507,7 @@ void BareosDb::ListJobRecords(JobControlRecord* jcr,
JobDbRecord* jr,
const char* range,
const char* clientname,
int jobstatus,
std::vector<char> jobstatuslist,
int joblevel,
std::vector<char> jobtypes,
const char* volumename,
Expand Down Expand Up @@ -539,8 +539,10 @@ void BareosDb::ListJobRecords(JobControlRecord* jcr,
PmStrcat(selection, temp.c_str());
}

if (jobstatus) {
temp.bsprintf("AND Job.JobStatus = '%c' ", jobstatus);
if (!jobstatuslist.empty()) {
std::string jobStatuses
= CreateDelimitedStringForSqlQueries(jobstatuslist, ',');
temp.bsprintf("AND Job.JobStatus in (%s) ", jobStatuses.c_str());
PmStrcat(selection, temp.c_str());
}

Expand Down
14 changes: 7 additions & 7 deletions core/src/dird/ua_output.cc
Expand Up @@ -676,9 +676,9 @@ static bool DoListCmd(UaContext* ua, const char* cmd, e_list_type llist)
}


// jobstatus=X
int jobstatus = 0;
if (!GetUserJobStatusSelection(ua, &jobstatus)) {
// jobstatus=X,Y,Z....
std::vector<char> jobstatuslist;
if (!GetUserJobStatusSelection(ua, jobstatuslist)) {
ua->ErrorMsg(_("invalid jobstatus parameter\n"));
return false;
}
Expand Down Expand Up @@ -756,9 +756,9 @@ static bool DoListCmd(UaContext* ua, const char* cmd, e_list_type llist)
SetQueryRange(query_range, ua, &jr);

ua->db->ListJobRecords(ua->jcr, &jr, query_range.c_str(), clientname,
jobstatus, joblevel, jobtypes, volumename, poolname,
schedtime, optionslist.last, optionslist.count,
ua->send, llist);
jobstatuslist, joblevel, jobtypes, volumename,
poolname, schedtime, optionslist.last,
optionslist.count, ua->send, llist);
} else if (Bstrcasecmp(ua->argk[1], NT_("jobtotals"))) {
// List JOBTOTALS
ua->db->ListJobTotals(ua->jcr, &jr, ua->send);
Expand Down Expand Up @@ -807,7 +807,7 @@ static bool DoListCmd(UaContext* ua, const char* cmd, e_list_type llist)
SetQueryRange(query_range, ua, &jr);

ua->db->ListJobRecords(ua->jcr, &jr, query_range.c_str(), clientname,
jobstatus, joblevel, jobtypes, volumename,
jobstatuslist, joblevel, jobtypes, volumename,
poolname, schedtime, optionslist.last,
optionslist.count, ua->send, llist);
}
Expand Down
48 changes: 29 additions & 19 deletions core/src/dird/ua_select.cc
Expand Up @@ -994,8 +994,9 @@ PoolResource* get_pool_resource(UaContext* ua)
// List all jobs and ask user to select one
int SelectJobDbr(UaContext* ua, JobDbRecord* jr)
{
ua->db->ListJobRecords(ua->jcr, jr, "", NULL, 0, 0, std::vector<char>{}, NULL,
NULL, 0, 0, 0, ua->send, HORZ_LIST);
ua->db->ListJobRecords(ua->jcr, jr, "", NULL, std::vector<char>{}, 0,
std::vector<char>{}, NULL, NULL, 0, 0, 0, ua->send,
HORZ_LIST);
if (!GetPint(ua, _("Enter the JobId to select: "))) { return 0; }

jr->JobId = ua->int64_val;
Expand Down Expand Up @@ -1952,28 +1953,37 @@ bool GetUserJobTypeListSelection(UaContext* ua,
return true;
}

bool GetUserJobStatusSelection(UaContext* ua, int* jobstatus)
bool GetUserJobStatusSelection(UaContext* ua, std::vector<char>& jobstatuslist)
{
int i;

if ((i = FindArgWithValue(ua, NT_("jobstatus"))) >= 0) {
if (strlen(ua->argv[i]) == 1 && ua->argv[i][0] >= 'A'
&& ua->argv[i][0] <= 'z') {
*jobstatus = ua->argv[i][0];
} else if (Bstrcasecmp(ua->argv[i], "terminated")) {
*jobstatus = JS_Terminated;
} else if (Bstrcasecmp(ua->argv[i], "warnings")) {
*jobstatus = JS_Warnings;
} else if (Bstrcasecmp(ua->argv[i], "canceled")) {
*jobstatus = JS_Canceled;
} else if (Bstrcasecmp(ua->argv[i], "running")) {
*jobstatus = JS_Running;
} else if (Bstrcasecmp(ua->argv[i], "error")) {
*jobstatus = JS_ErrorTerminated;
} else if (Bstrcasecmp(ua->argv[i], "fatal")) {
*jobstatus = JS_FatalError;
if (strlen(ua->argv[i]) > 0) {
std::vector<std::string> jobstatusinput_list;
jobstatusinput_list = split_string(ua->argv[i], ',');

for (auto& jobstatus : jobstatusinput_list) {
if (strlen(jobstatus.c_str()) == 1 && jobstatus.c_str()[0] >= 'A'
&& jobstatus.c_str()[0] <= 'z') {
jobstatuslist.push_back(jobstatus[0]);
} else if (Bstrcasecmp(jobstatus.c_str(), "terminated")) {
jobstatuslist.push_back(JS_Terminated);
} else if (Bstrcasecmp(jobstatus.c_str(), "warnings")) {
jobstatuslist.push_back(JS_Warnings);
} else if (Bstrcasecmp(jobstatus.c_str(), "canceled")) {
jobstatuslist.push_back(JS_Canceled);
} else if (Bstrcasecmp(jobstatus.c_str(), "running")) {
jobstatuslist.push_back(JS_Running);
} else if (Bstrcasecmp(jobstatus.c_str(), "error")) {
jobstatuslist.push_back(JS_ErrorTerminated);
} else if (Bstrcasecmp(jobstatus.c_str(), "fatal")) {
jobstatuslist.push_back(JS_FatalError);
} else {
/* invalid jobstatus */
return false;
}
}
} else {
/* invalid jobstatus */
return false;
}
}
Expand Down
2 changes: 1 addition & 1 deletion core/src/dird/ua_select.h
Expand Up @@ -92,7 +92,7 @@ bool GetUserSlotList(UaContext* ua,
bool GetUserJobTypeListSelection(UaContext* ua,
std::vector<char>& passed_jobtypes,
bool ask_user);
bool GetUserJobStatusSelection(UaContext* ua, int* jobstatus);
bool GetUserJobStatusSelection(UaContext* ua, std::vector<char>& jobstatus);
bool GetUserJobLevelSelection(UaContext* ua, int* joblevel);

int FindArgKeyword(UaContext* ua, const char** list);
Expand Down
34 changes: 7 additions & 27 deletions core/src/tests/select_functions.cc
Expand Up @@ -27,14 +27,13 @@
# include "include/bareos.h"
#endif

#include <unordered_map>

#include "dird/ua_select.h"
#include "dird/ua.h"
#include "include/jcr.h"
#include "dird/dird_conf.h"
#include "include/job_types.h"
#include "lib/util.h"

#include <string>

namespace directordaemon {
bool DoReloadConfig() { return false; }
Expand Down Expand Up @@ -214,7 +213,7 @@ class JobStatusSelection : public testing::Test {

JobControlRecord jcr{};
directordaemon::UaContext* ua{nullptr};
std::unordered_map<char, std::string> jobstatuses{
std::unordered_map<char, std::string> allowed_jobstatuses{
{JS_Terminated, "terminated"}, {JS_Warnings, "warnings"},
{JS_Canceled, "canceled"}, {JS_Running, "running"},
{JS_ErrorTerminated, "error"}, {JS_FatalError, "fatal"}};
Expand All @@ -239,7 +238,7 @@ TEST_F(JobStatusSelection, ErrorWhenJobtatusArgumentSpecifiedButNoneGiven)

TEST_F(JobStatusSelection, ReturnOnlyOneJobStatusIfOnlyOneIsEntered)
{
for (const auto& jobstatus : jobstatuses) {
for (const auto& jobstatus : allowed_jobstatuses) {
std::vector<char> jobstatuslist{};
std::string argument{jobstatus.first};
FakeListJobStatusCommand(argument);
Expand All @@ -251,7 +250,7 @@ TEST_F(JobStatusSelection, ReturnOnlyOneJobStatusIfOnlyOneIsEntered)
TEST_F(JobStatusSelection,
ReturnOnlyOneShortJobStatusIfOnlyOneLongJobStatusIsEntered)
{
for (const auto& jobstatus : jobstatuses) {
for (const auto& jobstatus : allowed_jobstatuses) {
std::vector<char> jobstatuslist{};
std::string argument{jobstatus.second};
FakeListJobStatusCommand(argument);
Expand Down Expand Up @@ -280,13 +279,13 @@ TEST_F(JobStatusSelection,
}

TEST_F(JobStatusSelection,
ReturnMultipleParsedJobStatusIfMultipleParsedAndUnparsedEntered)
ReturnMultipleShortJobStatusIfMultipleLongAndShortJobstatusesEntered)
{
std::vector<char> jobstatuslist{};
std::vector<char> expectedJobStatusList{};
std::string argumentForMultipleLongAndShortJobstatus;
int i = 0;
for (const auto& jobstatus : jobstatuses) {
for (const auto& jobstatus : allowed_jobstatuses) {
if (i % 2 == 0) {
argumentForMultipleLongAndShortJobstatus
+= jobstatus.first; // short jobstatus
Expand All @@ -305,22 +304,3 @@ TEST_F(JobStatusSelection,
EXPECT_TRUE(GetUserJobStatusSelection(ua, jobstatuslist));
EXPECT_EQ(jobstatuslist, expectedJobStatusList);
}


TEST_F(JobStatusSelection, ReturnSelectJobsWithCorrectJobStatusArgumentString)
{ // takes in ['A','T','E'..] returns : "'A','T','E',..] for sql query
std::vector<char> jobStatusInputArray{};
std::string expectedJobStatusesString;
for (const auto& jobstatus : jobstatuses) {
jobStatusInputArray.push_back(jobstatus.first);
expectedJobStatusesString += "'";
expectedJobStatusesString.push_back(jobstatus.first);
expectedJobStatusesString += "',";
}
expectedJobStatusesString.pop_back();

std::string jobStatusString
= CreateDelimitedStringForSqlQueries(jobStatusInputArray, ',');

EXPECT_EQ(jobStatusString, expectedJobStatusesString);
}

0 comments on commit 162df41

Please sign in to comment.