浏览代码

Merge pull request #7259 from wangkx/h13462

HPCC-13462 Add ability filter by DFUWUID

Reviewed-By: Miguel Vazquez <miguel.vazquez@lexisnexis.com>
Reviewed-By: Russ Whitehead <william.whitehead@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 10 年之前
父节点
当前提交
889aa6029a

+ 2 - 2
common/workunit/workunit.cpp

@@ -10841,11 +10841,11 @@ extern WORKUNIT_API void gatherLibraryNames(StringArray &names, StringArray &unr
     }
 }
 
-bool looksLikeAWuid(const char * wuid)
+bool looksLikeAWuid(const char * wuid, const char firstChar)
 {
     if (!wuid)
         return false;
-    if (wuid[0] != 'W')
+    if (wuid[0] != firstChar)
         return false;
     if (!isdigit(wuid[1]) || !isdigit(wuid[2]) || !isdigit(wuid[3]) || !isdigit(wuid[4]))
         return false;

+ 1 - 1
common/workunit/workunit.hpp

@@ -1392,7 +1392,7 @@ extern WORKUNIT_API bool isQueryManifest(const char * text);
 extern WORKUNIT_API IPropertyTree * resolveDefinitionInArchive(IPropertyTree * archive, const char * path);
 
 inline bool isLibrary(IConstWorkUnit * wu) { return wu->getApplicationValueInt("LibraryModule", "interfaceHash", 0) != 0; }
-extern WORKUNIT_API bool looksLikeAWuid(const char * wuid);
+extern WORKUNIT_API bool looksLikeAWuid(const char * wuid, const char firstChar);
 
 enum WUQueryActivationOptions
 {

+ 6 - 2
dali/dfu/dfuwu.cpp

@@ -3043,7 +3043,8 @@ public:
             }
         };
 
-        StringBuffer query("*");
+        StringBuffer query;
+        StringAttr namefilter("*");
         StringBuffer so;
         const char *field;
         StringBuffer sf;
@@ -3058,8 +3059,10 @@ public:
                 DFUsortfield fmt = filters[i];
                 if (fmt==DFUsf_wuid) 
                     namefilterlo.set(fv);
-                else if (fmt==DFUsf_wuidhigh) 
+                else if (fmt==DFUsf_wuidhigh)
                     namefilterhi.set(fv);
+                else if (fmt==DFUsf_wildwuid)
+                    namefilter.set(fv);
                 else if (!fv || !*fv)
                 {
                     const char* attr = getDFUSortFieldXPath(fmt);
@@ -3079,6 +3082,7 @@ public:
                 fv += strlen(fv)+1;
             }
         }
+        query.insert(0, namefilter.get());
         if (sortorder)
         {
             for (unsigned i=0;sortorder[i]!=DFUsf_term;i++)

+ 1 - 0
dali/dfu/dfuwu.hpp

@@ -118,6 +118,7 @@ enum DFUsortfield
     DFUsf_pcdone,
     DFUsf_wuidhigh,         // only for filter high of range
     DFUsf_protected,
+    DFUsf_wildwuid,
     DFUsf_term = 0,
     DFUsf_reverse = 0x100,  // for sort
     DFUsf_nocase  = 0x200,  // sort and filter

+ 1 - 0
esp/scm/ws_fs.ecm

@@ -126,6 +126,7 @@ DFUWUSearchResponse
 
 ESPrequest GetDFUWorkunits
 {
+    [min_ver("1.12")] string Wuid;
     string Owner;
     string Cluster;
     string StateReq;

+ 59 - 0
esp/services/ws_fs/ws_fsService.cpp

@@ -843,6 +843,53 @@ bool CFileSprayEx::GetArchivedDFUWorkunits(IEspContext &context, IEspGetDFUWorku
     return true;
 }
 
+bool CFileSprayEx::getOneDFUWorkunit(IEspContext& context, const char* wuid, IEspGetDFUWorkunitsResponse& resp)
+{
+    Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
+    Owned<IConstDFUWorkUnit> wu = factory->openWorkUnit(wuid, false);
+    if (!wu)
+        throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT, "Dfu workunit %s not found.", wuid);
+
+    Owned<IEspDFUWorkunit> resultWU = createDFUWorkunit();
+    resultWU->setID(wuid);
+    resultWU->setCommand(wu->getCommand());
+    resultWU->setIsProtected(wu->isProtected());
+
+    StringBuffer jobname, user, cluster;
+    resultWU->setJobName(wu->getJobName(jobname).str());
+    resultWU->setUser(wu->getUser(user).str());
+
+    const char* clusterName = wu->getClusterName(cluster).str();
+    if (clusterName && *clusterName)
+    {
+        Owned<IStringIterator> targets = getTargetClusters(NULL, clusterName);
+        if (!targets->first())
+            resultWU->setClusterName(clusterName);
+        else
+        {
+            SCMStringBuffer targetCluster;
+            targets->str(targetCluster);
+            resultWU->setClusterName(targetCluster.str());
+        }
+    }
+
+    IConstDFUprogress* prog = wu->queryProgress();
+    if (prog)
+    {
+        StringBuffer statemsg;
+        DFUstate state = prog->getState();
+        encodeDFUstate(state, statemsg);
+        resultWU->setState(state);
+        resultWU->setStateMessage(statemsg.str());
+        resultWU->setPercentDone(prog->getPercentDone());
+    }
+
+    IArrayOf<IEspDFUWorkunit> result;
+    result.append(*resultWU.getClear());
+    resp.setResults(result);
+    return true;
+}
+
 bool CFileSprayEx::onGetDFUWorkunits(IEspContext &context, IEspGetDFUWorkunits &req, IEspGetDFUWorkunitsResponse &resp)
 {
     try
@@ -850,6 +897,11 @@ bool CFileSprayEx::onGetDFUWorkunits(IEspContext &context, IEspGetDFUWorkunits &
         if (!context.validateFeatureAccess(DFU_WU_URL, SecAccess_Read, false))
             throw MakeStringException(ECLWATCH_DFU_WU_ACCESS_DENIED, "Access to DFU workunit is denied.");
 
+        StringBuffer wuidStr = req.getWuid();
+        const char* wuid = wuidStr.trim().str();
+        if (wuid && *wuid && looksLikeAWuid(wuid, 'D'))
+            return getOneDFUWorkunit(context, wuid, resp);
+
         double version = context.getClientVersion();
         if (version > 1.02)
         {
@@ -975,6 +1027,13 @@ bool CFileSprayEx::onGetDFUWorkunits(IEspContext &context, IEspGetDFUWorkunits &
                 filterbuf.append("");
         }
 
+        if(wuid && *wuid)
+        {
+            filters[filterCount] = DFUsf_wildwuid;
+            filterCount++;
+            filterbuf.append(wuid);
+        }
+
         if(clusterName && *clusterName)
         {
             filters[filterCount] = DFUsf_cluster;

+ 1 - 0
esp/services/ws_fs/ws_fsService.hpp

@@ -113,6 +113,7 @@ protected:
     bool ParseLogicalPath(const char * pLogicalPath, const char *group, const char* cluster, StringBuffer &folder, StringBuffer &title, StringBuffer &defaultFolder, StringBuffer &defaultReplicateFolder);
     StringBuffer& getAcceptLanguage(IEspContext& context, StringBuffer& acceptLanguage);
     void appendGroupNode(IArrayOf<IEspGroupNode>& groupNodes, const char* nodeName, const char* clusterType, bool replicateOutputs);
+    bool getOneDFUWorkunit(IEspContext& context, const char* wuid, IEspGetDFUWorkunitsResponse& resp);
 };
 
 #endif //_ESPWIZ_FileSpray_HPP__

+ 1 - 1
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -3104,7 +3104,7 @@ void WsWuHelpers::checkAndTrimWorkunit(const char* methodName, StringBuffer& inp
     if (isEmpty(trimmedInput))
         throw MakeStringException(ECLWATCH_INVALID_INPUT, "%s: Workunit ID not set", methodName);
 
-    if (!looksLikeAWuid(trimmedInput))
+    if (!looksLikeAWuid(trimmedInput, 'W'))
         throw MakeStringException(ECLWATCH_INVALID_INPUT, "%s: Invalid Workunit ID: %s", methodName, trimmedInput);
 
     return;

+ 7 - 7
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -178,7 +178,7 @@ bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties*
 
         try
         {
-            if (!looksLikeAWuid(wuid))
+            if (!looksLikeAWuid(wuid, 'W'))
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID: %s", wuid);
 
             if ((action == ActionRestore) || (action == ActionEventDeschedule))
@@ -1093,7 +1093,7 @@ bool CWsWorkunitsEx::onWURun(IEspContext &context, IEspWURunRequest &req, IEspWU
 
         if (runWuid && *runWuid)
         {
-            if (!looksLikeAWuid(runWuid))
+            if (!looksLikeAWuid(runWuid, 'W'))
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID: %s", runWuid);
 
             if (req.getCloneWorkunit())
@@ -1879,7 +1879,7 @@ void doWUQueryWithSort(IEspContext &context, IEspWUQueryRequest & req, IEspWUQue
 
         SCMStringBuffer wuidStr;
         const char* wuid = cw.getWuid(wuidStr).str();
-        if (!looksLikeAWuid(wuid))
+        if (!looksLikeAWuid(wuid, 'W'))
         {
             numWUs--;
             continue;
@@ -2211,7 +2211,7 @@ bool CWsWorkunitsEx::onWUQuery(IEspContext &context, IEspWUQueryRequest & req, I
 
         if (req.getType() && strieq(req.getType(), "archived workunits"))
             doWUQueryFromArchive(context, sashaServerIp.get(), sashaServerPort, *archivedWuCache, awusCacheMinutes, req, resp);
-        else if(notEmpty(wuid) && looksLikeAWuid(wuid))
+        else if(notEmpty(wuid) && looksLikeAWuid(wuid, 'W'))
             doWUQueryBySingleWuid(context, wuid, resp);
         else if (notEmpty(req.getLogicalFile()) && req.getLogicalFileSearchType() && strieq(req.getLogicalFileSearchType(), "Created"))
             doWUQueryByFile(context, req.getLogicalFile(), resp);
@@ -2489,7 +2489,7 @@ bool CWsWorkunitsEx::onWUFile(IEspContext &context,IEspWULogFileRequest &req, IE
         const char* wuidIn = wuidStr.trim().str();
         if (wuidIn && *wuidIn)
         {
-            if (!looksLikeAWuid(wuidIn))
+            if (!looksLikeAWuid(wuidIn, 'W'))
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID");
 
             ensureWsWorkunitAccess(context, wuidIn, SecAccess_Read);
@@ -2615,7 +2615,7 @@ bool CWsWorkunitsEx::onWUResultBin(IEspContext &context,IEspWUResultBinRequest &
         const char* wuidIn = wuidStr.trim().str();
         if (wuidIn && *wuidIn)
         {
-            if (!looksLikeAWuid(wuidIn))
+            if (!looksLikeAWuid(wuidIn, 'W'))
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID: %s", wuidIn);
 
             ensureWsWorkunitAccess(context, wuidIn, SecAccess_Read);
@@ -2808,7 +2808,7 @@ bool CWsWorkunitsEx::onWUResult(IEspContext &context, IEspWUResultRequest &req,
         const char* wuid = wuidStr.trim().str();
         if (wuid && *wuid)
         {
-            if (!looksLikeAWuid(wuid))
+            if (!looksLikeAWuid(wuid, 'W'))
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID: %s", wuid);
 
             ensureWsWorkunitAccess(context, wuid, SecAccess_Read);