wmglobalqueue 2.4.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Utils/CPMetrics.py +270 -0
- Utils/CertTools.py +100 -0
- Utils/EmailAlert.py +50 -0
- Utils/ExtendedUnitTestCase.py +62 -0
- Utils/FileTools.py +182 -0
- Utils/IteratorTools.py +80 -0
- Utils/MathUtils.py +31 -0
- Utils/MemoryCache.py +119 -0
- Utils/Patterns.py +24 -0
- Utils/Pipeline.py +137 -0
- Utils/PortForward.py +97 -0
- Utils/ProcFS.py +112 -0
- Utils/ProcessStats.py +194 -0
- Utils/PythonVersion.py +17 -0
- Utils/Signals.py +36 -0
- Utils/TemporaryEnvironment.py +27 -0
- Utils/Throttled.py +227 -0
- Utils/Timers.py +130 -0
- Utils/Timestamps.py +86 -0
- Utils/TokenManager.py +143 -0
- Utils/Tracing.py +60 -0
- Utils/TwPrint.py +98 -0
- Utils/Utilities.py +318 -0
- Utils/__init__.py +11 -0
- Utils/wmcoreDTools.py +707 -0
- WMCore/ACDC/Collection.py +57 -0
- WMCore/ACDC/CollectionTypes.py +12 -0
- WMCore/ACDC/CouchCollection.py +67 -0
- WMCore/ACDC/CouchFileset.py +238 -0
- WMCore/ACDC/CouchService.py +73 -0
- WMCore/ACDC/DataCollectionService.py +485 -0
- WMCore/ACDC/Fileset.py +94 -0
- WMCore/ACDC/__init__.py +11 -0
- WMCore/Algorithms/Alarm.py +39 -0
- WMCore/Algorithms/MathAlgos.py +274 -0
- WMCore/Algorithms/MiscAlgos.py +67 -0
- WMCore/Algorithms/ParseXMLFile.py +115 -0
- WMCore/Algorithms/Permissions.py +27 -0
- WMCore/Algorithms/Singleton.py +58 -0
- WMCore/Algorithms/SubprocessAlgos.py +129 -0
- WMCore/Algorithms/__init__.py +7 -0
- WMCore/Cache/GenericDataCache.py +98 -0
- WMCore/Cache/WMConfigCache.py +572 -0
- WMCore/Cache/__init__.py +0 -0
- WMCore/Configuration.py +659 -0
- WMCore/DAOFactory.py +47 -0
- WMCore/DataStructs/File.py +177 -0
- WMCore/DataStructs/Fileset.py +140 -0
- WMCore/DataStructs/Job.py +182 -0
- WMCore/DataStructs/JobGroup.py +142 -0
- WMCore/DataStructs/JobPackage.py +49 -0
- WMCore/DataStructs/LumiList.py +734 -0
- WMCore/DataStructs/Mask.py +219 -0
- WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +197 -0
- WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +92 -0
- WMCore/DataStructs/MathStructs/SummaryHistogram.py +117 -0
- WMCore/DataStructs/MathStructs/__init__.py +0 -0
- WMCore/DataStructs/Pickleable.py +24 -0
- WMCore/DataStructs/Run.py +256 -0
- WMCore/DataStructs/Subscription.py +175 -0
- WMCore/DataStructs/WMObject.py +47 -0
- WMCore/DataStructs/WorkUnit.py +112 -0
- WMCore/DataStructs/Workflow.py +60 -0
- WMCore/DataStructs/__init__.py +8 -0
- WMCore/Database/CMSCouch.py +1430 -0
- WMCore/Database/ConfigDBMap.py +29 -0
- WMCore/Database/CouchMonitoring.py +450 -0
- WMCore/Database/CouchUtils.py +118 -0
- WMCore/Database/DBCore.py +198 -0
- WMCore/Database/DBCreator.py +113 -0
- WMCore/Database/DBExceptionHandler.py +59 -0
- WMCore/Database/DBFactory.py +117 -0
- WMCore/Database/DBFormatter.py +177 -0
- WMCore/Database/Dialects.py +13 -0
- WMCore/Database/ExecuteDAO.py +327 -0
- WMCore/Database/MongoDB.py +241 -0
- WMCore/Database/MySQL/Destroy.py +42 -0
- WMCore/Database/MySQL/ListUserContent.py +20 -0
- WMCore/Database/MySQL/__init__.py +9 -0
- WMCore/Database/MySQLCore.py +132 -0
- WMCore/Database/Oracle/Destroy.py +56 -0
- WMCore/Database/Oracle/ListUserContent.py +19 -0
- WMCore/Database/Oracle/__init__.py +9 -0
- WMCore/Database/ResultSet.py +44 -0
- WMCore/Database/Transaction.py +91 -0
- WMCore/Database/__init__.py +9 -0
- WMCore/Database/ipy_profile_couch.py +438 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/CleanUpTask.py +29 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/HeartbeatMonitor.py +105 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/LocationUpdateTask.py +28 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/ReqMgrInteractionTask.py +35 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/__init__.py +0 -0
- WMCore/GlobalWorkQueue/__init__.py +0 -0
- WMCore/GroupUser/CouchObject.py +127 -0
- WMCore/GroupUser/Decorators.py +51 -0
- WMCore/GroupUser/Group.py +33 -0
- WMCore/GroupUser/Interface.py +73 -0
- WMCore/GroupUser/User.py +96 -0
- WMCore/GroupUser/__init__.py +11 -0
- WMCore/Lexicon.py +836 -0
- WMCore/REST/Auth.py +202 -0
- WMCore/REST/CherryPyPeriodicTask.py +166 -0
- WMCore/REST/Error.py +333 -0
- WMCore/REST/Format.py +642 -0
- WMCore/REST/HeartbeatMonitorBase.py +90 -0
- WMCore/REST/Main.py +636 -0
- WMCore/REST/Server.py +2435 -0
- WMCore/REST/Services.py +24 -0
- WMCore/REST/Test.py +120 -0
- WMCore/REST/Tools.py +38 -0
- WMCore/REST/Validation.py +250 -0
- WMCore/REST/__init__.py +1 -0
- WMCore/ReqMgr/DataStructs/RequestStatus.py +209 -0
- WMCore/ReqMgr/DataStructs/RequestType.py +13 -0
- WMCore/ReqMgr/DataStructs/__init__.py +0 -0
- WMCore/ReqMgr/__init__.py +1 -0
- WMCore/Services/AlertManager/AlertManagerAPI.py +111 -0
- WMCore/Services/AlertManager/__init__.py +0 -0
- WMCore/Services/CRIC/CRIC.py +238 -0
- WMCore/Services/CRIC/__init__.py +0 -0
- WMCore/Services/DBS/DBS3Reader.py +1044 -0
- WMCore/Services/DBS/DBSConcurrency.py +44 -0
- WMCore/Services/DBS/DBSErrors.py +112 -0
- WMCore/Services/DBS/DBSReader.py +23 -0
- WMCore/Services/DBS/DBSUtils.py +166 -0
- WMCore/Services/DBS/DBSWriterObjects.py +381 -0
- WMCore/Services/DBS/ProdException.py +133 -0
- WMCore/Services/DBS/__init__.py +8 -0
- WMCore/Services/FWJRDB/FWJRDBAPI.py +118 -0
- WMCore/Services/FWJRDB/__init__.py +0 -0
- WMCore/Services/HTTPS/HTTPSAuthHandler.py +66 -0
- WMCore/Services/HTTPS/__init__.py +0 -0
- WMCore/Services/LogDB/LogDB.py +201 -0
- WMCore/Services/LogDB/LogDBBackend.py +191 -0
- WMCore/Services/LogDB/LogDBExceptions.py +11 -0
- WMCore/Services/LogDB/LogDBReport.py +85 -0
- WMCore/Services/LogDB/__init__.py +0 -0
- WMCore/Services/MSPileup/__init__.py +0 -0
- WMCore/Services/MSUtils/MSUtils.py +54 -0
- WMCore/Services/MSUtils/__init__.py +0 -0
- WMCore/Services/McM/McM.py +173 -0
- WMCore/Services/McM/__init__.py +8 -0
- WMCore/Services/MonIT/Grafana.py +133 -0
- WMCore/Services/MonIT/__init__.py +0 -0
- WMCore/Services/PyCondor/PyCondorAPI.py +154 -0
- WMCore/Services/PyCondor/__init__.py +0 -0
- WMCore/Services/ReqMgr/ReqMgr.py +261 -0
- WMCore/Services/ReqMgr/__init__.py +0 -0
- WMCore/Services/ReqMgrAux/ReqMgrAux.py +419 -0
- WMCore/Services/ReqMgrAux/__init__.py +0 -0
- WMCore/Services/RequestDB/RequestDBReader.py +267 -0
- WMCore/Services/RequestDB/RequestDBWriter.py +39 -0
- WMCore/Services/RequestDB/__init__.py +0 -0
- WMCore/Services/Requests.py +624 -0
- WMCore/Services/Rucio/Rucio.py +1290 -0
- WMCore/Services/Rucio/RucioUtils.py +74 -0
- WMCore/Services/Rucio/__init__.py +0 -0
- WMCore/Services/RucioConMon/RucioConMon.py +121 -0
- WMCore/Services/RucioConMon/__init__.py +0 -0
- WMCore/Services/Service.py +400 -0
- WMCore/Services/StompAMQ/__init__.py +0 -0
- WMCore/Services/TagCollector/TagCollector.py +155 -0
- WMCore/Services/TagCollector/XMLUtils.py +98 -0
- WMCore/Services/TagCollector/__init__.py +0 -0
- WMCore/Services/UUIDLib.py +13 -0
- WMCore/Services/UserFileCache/UserFileCache.py +160 -0
- WMCore/Services/UserFileCache/__init__.py +8 -0
- WMCore/Services/WMAgent/WMAgent.py +63 -0
- WMCore/Services/WMAgent/__init__.py +0 -0
- WMCore/Services/WMArchive/CMSSWMetrics.py +526 -0
- WMCore/Services/WMArchive/DataMap.py +463 -0
- WMCore/Services/WMArchive/WMArchive.py +33 -0
- WMCore/Services/WMArchive/__init__.py +0 -0
- WMCore/Services/WMBS/WMBS.py +97 -0
- WMCore/Services/WMBS/__init__.py +0 -0
- WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +300 -0
- WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
- WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
- WMCore/Services/WMStats/WMStatsReader.py +445 -0
- WMCore/Services/WMStats/WMStatsWriter.py +273 -0
- WMCore/Services/WMStats/__init__.py +0 -0
- WMCore/Services/WMStatsServer/WMStatsServer.py +134 -0
- WMCore/Services/WMStatsServer/__init__.py +0 -0
- WMCore/Services/WorkQueue/WorkQueue.py +492 -0
- WMCore/Services/WorkQueue/__init__.py +0 -0
- WMCore/Services/__init__.py +8 -0
- WMCore/Services/pycurl_manager.py +574 -0
- WMCore/WMBase.py +50 -0
- WMCore/WMConnectionBase.py +164 -0
- WMCore/WMException.py +183 -0
- WMCore/WMExceptions.py +269 -0
- WMCore/WMFactory.py +76 -0
- WMCore/WMInit.py +377 -0
- WMCore/WMLogging.py +104 -0
- WMCore/WMSpec/ConfigSectionTree.py +442 -0
- WMCore/WMSpec/Persistency.py +135 -0
- WMCore/WMSpec/Steps/BuildMaster.py +87 -0
- WMCore/WMSpec/Steps/BuildTools.py +201 -0
- WMCore/WMSpec/Steps/Builder.py +97 -0
- WMCore/WMSpec/Steps/Diagnostic.py +89 -0
- WMCore/WMSpec/Steps/Emulator.py +62 -0
- WMCore/WMSpec/Steps/ExecuteMaster.py +208 -0
- WMCore/WMSpec/Steps/Executor.py +210 -0
- WMCore/WMSpec/Steps/StepFactory.py +213 -0
- WMCore/WMSpec/Steps/TaskEmulator.py +75 -0
- WMCore/WMSpec/Steps/Template.py +204 -0
- WMCore/WMSpec/Steps/Templates/AlcaHarvest.py +76 -0
- WMCore/WMSpec/Steps/Templates/CMSSW.py +613 -0
- WMCore/WMSpec/Steps/Templates/DQMUpload.py +59 -0
- WMCore/WMSpec/Steps/Templates/DeleteFiles.py +70 -0
- WMCore/WMSpec/Steps/Templates/LogArchive.py +84 -0
- WMCore/WMSpec/Steps/Templates/LogCollect.py +105 -0
- WMCore/WMSpec/Steps/Templates/StageOut.py +105 -0
- WMCore/WMSpec/Steps/Templates/__init__.py +10 -0
- WMCore/WMSpec/Steps/WMExecutionFailure.py +21 -0
- WMCore/WMSpec/Steps/__init__.py +8 -0
- WMCore/WMSpec/Utilities.py +63 -0
- WMCore/WMSpec/WMSpecErrors.py +12 -0
- WMCore/WMSpec/WMStep.py +347 -0
- WMCore/WMSpec/WMTask.py +1997 -0
- WMCore/WMSpec/WMWorkload.py +2288 -0
- WMCore/WMSpec/WMWorkloadTools.py +382 -0
- WMCore/WMSpec/__init__.py +9 -0
- WMCore/WorkQueue/DataLocationMapper.py +273 -0
- WMCore/WorkQueue/DataStructs/ACDCBlock.py +47 -0
- WMCore/WorkQueue/DataStructs/Block.py +48 -0
- WMCore/WorkQueue/DataStructs/CouchWorkQueueElement.py +148 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElement.py +274 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElementResult.py +152 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElementsSummary.py +185 -0
- WMCore/WorkQueue/DataStructs/__init__.py +0 -0
- WMCore/WorkQueue/Policy/End/EndPolicyInterface.py +44 -0
- WMCore/WorkQueue/Policy/End/SingleShot.py +22 -0
- WMCore/WorkQueue/Policy/End/__init__.py +32 -0
- WMCore/WorkQueue/Policy/PolicyInterface.py +17 -0
- WMCore/WorkQueue/Policy/Start/Block.py +258 -0
- WMCore/WorkQueue/Policy/Start/Dataset.py +180 -0
- WMCore/WorkQueue/Policy/Start/MonteCarlo.py +131 -0
- WMCore/WorkQueue/Policy/Start/ResubmitBlock.py +171 -0
- WMCore/WorkQueue/Policy/Start/StartPolicyInterface.py +316 -0
- WMCore/WorkQueue/Policy/Start/__init__.py +34 -0
- WMCore/WorkQueue/Policy/__init__.py +57 -0
- WMCore/WorkQueue/WMBSHelper.py +772 -0
- WMCore/WorkQueue/WorkQueue.py +1237 -0
- WMCore/WorkQueue/WorkQueueBackend.py +750 -0
- WMCore/WorkQueue/WorkQueueBase.py +39 -0
- WMCore/WorkQueue/WorkQueueExceptions.py +44 -0
- WMCore/WorkQueue/WorkQueueReqMgrInterface.py +278 -0
- WMCore/WorkQueue/WorkQueueUtils.py +130 -0
- WMCore/WorkQueue/__init__.py +13 -0
- WMCore/Wrappers/JsonWrapper/JSONThunker.py +342 -0
- WMCore/Wrappers/JsonWrapper/__init__.py +7 -0
- WMCore/Wrappers/__init__.py +6 -0
- WMCore/__init__.py +10 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-patch +15 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-unpatch +8 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-httpd +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/README.md +40 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/language +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
- wmglobalqueue-2.4.5.1.dist-info/METADATA +26 -0
- wmglobalqueue-2.4.5.1.dist-info/RECORD +347 -0
- wmglobalqueue-2.4.5.1.dist-info/WHEEL +5 -0
- wmglobalqueue-2.4.5.1.dist-info/licenses/LICENSE +202 -0
- wmglobalqueue-2.4.5.1.dist-info/licenses/NOTICE +16 -0
- wmglobalqueue-2.4.5.1.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
from __future__ import print_function
|
|
2
|
+
|
|
3
|
+
from builtins import str, bytes, int
|
|
4
|
+
from future.utils import viewitems
|
|
5
|
+
from Utils.PythonVersion import PY2
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import types
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class _EmptyClass(object):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class JSONThunker(object):
|
|
16
|
+
"""
|
|
17
|
+
_JSONThunker_
|
|
18
|
+
Converts an arbitrary object to <-> from a jsonable object.
|
|
19
|
+
|
|
20
|
+
Will, for the most part "do the right thing" about various instance objects
|
|
21
|
+
by storing their class information along with their data in a dict. Handles
|
|
22
|
+
a recursion limit to prevent infinite recursion.
|
|
23
|
+
|
|
24
|
+
self.passThroughTypes - stores a list of types that should be passed
|
|
25
|
+
through unchanged to the JSON parser
|
|
26
|
+
|
|
27
|
+
self.blackListedModules - a list of modules that should not be stored in
|
|
28
|
+
the JSON.
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self):
|
|
33
|
+
self.passThroughTypes = (type(None),
|
|
34
|
+
bool,
|
|
35
|
+
int,
|
|
36
|
+
float,
|
|
37
|
+
complex,
|
|
38
|
+
str,
|
|
39
|
+
bytes,
|
|
40
|
+
)
|
|
41
|
+
# objects that inherit from dict should be treated as a dict
|
|
42
|
+
# they don't store their data in __dict__. There was enough
|
|
43
|
+
# of those classes that it warrented making a special case
|
|
44
|
+
self.dictSortOfObjects = (('WMCore.Datastructs.Job', 'Job'),
|
|
45
|
+
('WMCore.WMBS.Job', 'Job'),
|
|
46
|
+
('WMCore.Database.CMSCouch', 'Document'))
|
|
47
|
+
# ditto above, but for lists
|
|
48
|
+
self.listSortOfObjects = (('WMCore.DataStructs.JobPackage', 'JobPackage'),
|
|
49
|
+
('WMCore.WMBS.JobPackage', 'JobPackage'),)
|
|
50
|
+
|
|
51
|
+
self.foundIDs = {}
|
|
52
|
+
# modules we don't want JSONed
|
|
53
|
+
self.blackListedModules = ('sqlalchemy.engine.threadlocal',
|
|
54
|
+
'WMCore.Database.DBCore',
|
|
55
|
+
'logging',
|
|
56
|
+
'WMCore.DAOFactory',
|
|
57
|
+
'WMCore.WMFactory',
|
|
58
|
+
'WMFactory',
|
|
59
|
+
'WMCore.Configuration',
|
|
60
|
+
'WMCore.Database.Transaction',
|
|
61
|
+
'threading',
|
|
62
|
+
'datetime')
|
|
63
|
+
|
|
64
|
+
def checkRecursion(self, data):
|
|
65
|
+
"""
|
|
66
|
+
handles checking for infinite recursion
|
|
67
|
+
"""
|
|
68
|
+
if id(data) in self.foundIDs:
|
|
69
|
+
if self.foundIDs[id(data)] > 5:
|
|
70
|
+
self.unrecurse(data)
|
|
71
|
+
return "**RECURSION**"
|
|
72
|
+
else:
|
|
73
|
+
self.foundIDs[id(data)] += 1
|
|
74
|
+
return data
|
|
75
|
+
else:
|
|
76
|
+
self.foundIDs[id(data)] = 1
|
|
77
|
+
return data
|
|
78
|
+
|
|
79
|
+
def unrecurse(self, data):
|
|
80
|
+
"""
|
|
81
|
+
backs off the recursion counter if we're returning from _thunk
|
|
82
|
+
"""
|
|
83
|
+
try:
|
|
84
|
+
self.foundIDs[id(data)] -= 1
|
|
85
|
+
except:
|
|
86
|
+
print("Could not find count for id %s of type %s data %s" % (id(data), type(data), data))
|
|
87
|
+
raise
|
|
88
|
+
|
|
89
|
+
def checkBlackListed(self, data):
|
|
90
|
+
"""
|
|
91
|
+
checks to see if a given object is from a blacklisted module
|
|
92
|
+
"""
|
|
93
|
+
try:
|
|
94
|
+
# special case
|
|
95
|
+
if data.__class__.__module__ == 'WMCore.Database.CMSCouch' and data.__class__.__name__ == 'Document':
|
|
96
|
+
data.__class__ = type({})
|
|
97
|
+
return data
|
|
98
|
+
if data.__class__.__module__ in self.blackListedModules:
|
|
99
|
+
return "Blacklisted JSON object: module %s, name %s, str() %s" % \
|
|
100
|
+
(data.__class__.__module__, data.__class__.__name__, str(data))
|
|
101
|
+
else:
|
|
102
|
+
return data
|
|
103
|
+
except Exception:
|
|
104
|
+
return data
|
|
105
|
+
|
|
106
|
+
def thunk(self, toThunk):
|
|
107
|
+
"""
|
|
108
|
+
Thunk - turns an arbitrary object into a JSONable object
|
|
109
|
+
"""
|
|
110
|
+
self.foundIDs = {}
|
|
111
|
+
data = self._thunk(toThunk)
|
|
112
|
+
return data
|
|
113
|
+
|
|
114
|
+
def unthunk(self, data):
|
|
115
|
+
"""
|
|
116
|
+
unthunk - turns a previously 'thunked' object back into a python object
|
|
117
|
+
"""
|
|
118
|
+
return self._unthunk(data)
|
|
119
|
+
|
|
120
|
+
def handleSetThunk(self, toThunk):
|
|
121
|
+
toThunk = self.checkRecursion(toThunk)
|
|
122
|
+
tempDict = {'thunker_encoded_json': True, 'type': 'set'}
|
|
123
|
+
tempDict['set'] = self._thunk(list(toThunk))
|
|
124
|
+
self.unrecurse(toThunk)
|
|
125
|
+
return tempDict
|
|
126
|
+
|
|
127
|
+
def handleListThunk(self, toThunk):
|
|
128
|
+
toThunk = self.checkRecursion(toThunk)
|
|
129
|
+
for k, v in enumerate(toThunk):
|
|
130
|
+
toThunk[k] = self._thunk(v)
|
|
131
|
+
self.unrecurse(toThunk)
|
|
132
|
+
return toThunk
|
|
133
|
+
|
|
134
|
+
def handleDictThunk(self, toThunk):
|
|
135
|
+
toThunk = self.checkRecursion(toThunk)
|
|
136
|
+
special = False
|
|
137
|
+
tmpdict = {}
|
|
138
|
+
for k, v in viewitems(toThunk):
|
|
139
|
+
if type(k) == type(int):
|
|
140
|
+
special = True
|
|
141
|
+
tmpdict['_i:%s' % k] = self._thunk(v)
|
|
142
|
+
elif type(k) == type(float):
|
|
143
|
+
special = True
|
|
144
|
+
tmpdict['_f:%s' % k] = self._thunk(v)
|
|
145
|
+
else:
|
|
146
|
+
tmpdict[k] = self._thunk(v)
|
|
147
|
+
if special:
|
|
148
|
+
toThunk['thunker_encoded_json'] = self._thunk(True)
|
|
149
|
+
toThunk['type'] = self._thunk('dict')
|
|
150
|
+
toThunk['dict'] = tmpdict
|
|
151
|
+
else:
|
|
152
|
+
toThunk.update(tmpdict)
|
|
153
|
+
self.unrecurse(toThunk)
|
|
154
|
+
return toThunk
|
|
155
|
+
|
|
156
|
+
def handleObjectThunk(self, toThunk):
|
|
157
|
+
toThunk = self.checkRecursion(toThunk)
|
|
158
|
+
toThunk = self.checkBlackListed(toThunk)
|
|
159
|
+
|
|
160
|
+
if isinstance(toThunk, (str, bytes)):
|
|
161
|
+
# things that got blacklisted
|
|
162
|
+
return toThunk
|
|
163
|
+
if hasattr(toThunk, '__to_json__'):
|
|
164
|
+
# Use classes own json thunker
|
|
165
|
+
toThunk2 = toThunk.__to_json__(self)
|
|
166
|
+
self.unrecurse(toThunk)
|
|
167
|
+
return toThunk2
|
|
168
|
+
elif isinstance(toThunk, dict):
|
|
169
|
+
toThunk2 = self.handleDictObjectThunk(toThunk)
|
|
170
|
+
self.unrecurse(toThunk)
|
|
171
|
+
return toThunk2
|
|
172
|
+
elif isinstance(toThunk, list):
|
|
173
|
+
# a mother thunking list
|
|
174
|
+
toThunk2 = self.handleListObjectThunk(toThunk)
|
|
175
|
+
self.unrecurse(toThunk)
|
|
176
|
+
return toThunk2
|
|
177
|
+
else:
|
|
178
|
+
try:
|
|
179
|
+
thunktype = '%s.%s' % (toThunk.__class__.__module__,
|
|
180
|
+
toThunk.__class__.__name__)
|
|
181
|
+
tempDict = {'thunker_encoded_json': True, 'type': thunktype}
|
|
182
|
+
tempDict[thunktype] = self._thunk(toThunk.__dict__)
|
|
183
|
+
self.unrecurse(toThunk)
|
|
184
|
+
return tempDict
|
|
185
|
+
except Exception as e:
|
|
186
|
+
tempDict = {'json_thunk_exception_': "%s" % e}
|
|
187
|
+
self.unrecurse(toThunk)
|
|
188
|
+
return tempDict
|
|
189
|
+
|
|
190
|
+
def handleDictObjectThunk(self, data):
|
|
191
|
+
thunktype = '%s.%s' % (data.__class__.__module__,
|
|
192
|
+
data.__class__.__name__)
|
|
193
|
+
tempDict = {'thunker_encoded_json': True,
|
|
194
|
+
'is_dict': True,
|
|
195
|
+
'type': thunktype,
|
|
196
|
+
thunktype: {}}
|
|
197
|
+
|
|
198
|
+
for k, v in viewitems(data.__dict__):
|
|
199
|
+
tempDict[k] = self._thunk(v)
|
|
200
|
+
for k, v in viewitems(data):
|
|
201
|
+
tempDict[thunktype][k] = self._thunk(v)
|
|
202
|
+
|
|
203
|
+
return tempDict
|
|
204
|
+
|
|
205
|
+
def handleDictObjectUnThunk(self, value, data):
|
|
206
|
+
data.pop('thunker_encoded_json', False)
|
|
207
|
+
data.pop('is_dict', False)
|
|
208
|
+
thunktype = data.pop('type', False)
|
|
209
|
+
|
|
210
|
+
for k, v in viewitems(data):
|
|
211
|
+
if k == thunktype:
|
|
212
|
+
for k2, v2 in viewitems(data[thunktype]):
|
|
213
|
+
value[k2] = self._unthunk(v2)
|
|
214
|
+
else:
|
|
215
|
+
value.__dict__[k] = self._unthunk(v)
|
|
216
|
+
return value
|
|
217
|
+
|
|
218
|
+
def handleListObjectThunk(self, data):
|
|
219
|
+
thunktype = '%s.%s' % (data.__class__.__module__,
|
|
220
|
+
data.__class__.__name__)
|
|
221
|
+
tempDict = {'thunker_encoded_json': True,
|
|
222
|
+
'is_list': True,
|
|
223
|
+
'type': thunktype,
|
|
224
|
+
thunktype: []}
|
|
225
|
+
for k, v in enumerate(data):
|
|
226
|
+
tempDict['thunktype'].append(self._thunk(v))
|
|
227
|
+
for k, v in viewitems(data.__dict__):
|
|
228
|
+
tempDict[k] = self._thunk(v)
|
|
229
|
+
return tempDict
|
|
230
|
+
|
|
231
|
+
def handleListObjectUnThunk(self, value, data):
|
|
232
|
+
data.pop('thunker_encoded_json', False)
|
|
233
|
+
data.pop('is_list', False)
|
|
234
|
+
thunktype = data.pop('type')
|
|
235
|
+
for k, v in viewitems(data[thunktype]):
|
|
236
|
+
setattr(value, k, self._unthunk(v))
|
|
237
|
+
|
|
238
|
+
for k, v in viewitems(data):
|
|
239
|
+
if k == thunktype:
|
|
240
|
+
continue
|
|
241
|
+
value.__dict__ = self._unthunk(v)
|
|
242
|
+
return value
|
|
243
|
+
|
|
244
|
+
def _thunk(self, toThunk):
|
|
245
|
+
"""
|
|
246
|
+
helper function for thunk, does the actual work
|
|
247
|
+
"""
|
|
248
|
+
if isinstance(toThunk, self.passThroughTypes):
|
|
249
|
+
return toThunk
|
|
250
|
+
elif type(toThunk) is list:
|
|
251
|
+
return self.handleListThunk(toThunk)
|
|
252
|
+
elif type(toThunk) is dict:
|
|
253
|
+
return self.handleDictThunk(toThunk)
|
|
254
|
+
elif type(toThunk) is set:
|
|
255
|
+
return self.handleSetThunk(toThunk)
|
|
256
|
+
elif type(toThunk) is types.FunctionType:
|
|
257
|
+
self.unrecurse(toThunk)
|
|
258
|
+
return "function reference"
|
|
259
|
+
elif isinstance(toThunk, object):
|
|
260
|
+
return self.handleObjectThunk(toThunk)
|
|
261
|
+
else:
|
|
262
|
+
self.unrecurse(toThunk)
|
|
263
|
+
raise RuntimeError(type(toThunk))
|
|
264
|
+
|
|
265
|
+
def _unthunk(self, jsondata):
|
|
266
|
+
"""
|
|
267
|
+
_unthunk - does the actual work for unthunk
|
|
268
|
+
"""
|
|
269
|
+
if PY2 and type(jsondata) is str:
|
|
270
|
+
return jsondata.encode("utf-8")
|
|
271
|
+
if type(jsondata) is dict:
|
|
272
|
+
if 'thunker_encoded_json' in jsondata:
|
|
273
|
+
# we've got a live one...
|
|
274
|
+
if jsondata['type'] == 'set':
|
|
275
|
+
newSet = set()
|
|
276
|
+
for i in self._unthunk(jsondata['set']):
|
|
277
|
+
newSet.add(self._unthunk(i))
|
|
278
|
+
return newSet
|
|
279
|
+
if jsondata['type'] == 'dict':
|
|
280
|
+
# We have a "special" dict
|
|
281
|
+
data = {}
|
|
282
|
+
for k, v in viewitems(jsondata['dict']):
|
|
283
|
+
tmp = self._unthunk(v)
|
|
284
|
+
if k.startswith('_i:'):
|
|
285
|
+
data[int(k.lstrip('_i:'))] = tmp
|
|
286
|
+
elif k.startswith('_f:'):
|
|
287
|
+
data[float(k.lstrip('_f:'))] = tmp
|
|
288
|
+
else:
|
|
289
|
+
data[k] = tmp
|
|
290
|
+
return data
|
|
291
|
+
else:
|
|
292
|
+
# spawn up an instance.. good luck
|
|
293
|
+
# here be monsters
|
|
294
|
+
# inspired from python's pickle code
|
|
295
|
+
ourClass = self.getThunkedClass(jsondata)
|
|
296
|
+
|
|
297
|
+
value = _EmptyClass()
|
|
298
|
+
if hasattr(ourClass, '__from_json__'):
|
|
299
|
+
# Use classes own json loader
|
|
300
|
+
try:
|
|
301
|
+
value.__class__ = ourClass
|
|
302
|
+
except Exception:
|
|
303
|
+
value = ourClass()
|
|
304
|
+
value = ourClass.__from_json__(value, jsondata, self)
|
|
305
|
+
elif 'thunker_encoded_json' in jsondata and 'is_dict' in jsondata:
|
|
306
|
+
try:
|
|
307
|
+
value.__class__ = ourClass
|
|
308
|
+
except Exception:
|
|
309
|
+
value = ourClass()
|
|
310
|
+
value = self.handleDictObjectUnThunk(value, jsondata)
|
|
311
|
+
elif 'thunker_encoded_json' in jsondata:
|
|
312
|
+
try:
|
|
313
|
+
value.__class__ = ourClass
|
|
314
|
+
except Exception:
|
|
315
|
+
value = ourClass()
|
|
316
|
+
value = self.handleListObjectUnThunk(value, jsondata)
|
|
317
|
+
else:
|
|
318
|
+
raise RuntimeError('Could not unthunk a class. Code to try was removed because it had errors.')
|
|
319
|
+
return value
|
|
320
|
+
else:
|
|
321
|
+
data = {}
|
|
322
|
+
for k, v in viewitems(jsondata):
|
|
323
|
+
data[k] = self._unthunk(v)
|
|
324
|
+
return data
|
|
325
|
+
|
|
326
|
+
else:
|
|
327
|
+
return jsondata
|
|
328
|
+
|
|
329
|
+
@staticmethod
|
|
330
|
+
def getThunkedClass(jsondata):
|
|
331
|
+
"""
|
|
332
|
+
Work out the class from it's thunked json representation
|
|
333
|
+
"""
|
|
334
|
+
module = jsondata['type'].rsplit('.', 1)[0]
|
|
335
|
+
name = jsondata['type'].rsplit('.', 1)[1]
|
|
336
|
+
if (module == 'WMCore.Services.Requests') and (name == JSONThunker):
|
|
337
|
+
raise RuntimeError("Attempted to unthunk a JSONThunker..")
|
|
338
|
+
|
|
339
|
+
__import__(module)
|
|
340
|
+
mod = sys.modules[module]
|
|
341
|
+
ourClass = getattr(mod, name)
|
|
342
|
+
return ourClass
|
WMCore/__init__.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Script to patch the server from the local developer area. The user's
|
|
3
|
+
# stuff goes into xbin/xlib/xpython directories, which are in front of
|
|
4
|
+
# the server's own bin/lib/python directories. So anything in x* will
|
|
5
|
+
# be picked up in preference to the server-distributed files.
|
|
6
|
+
|
|
7
|
+
R=${WMCORE_ROOT-$(dirname $(dirname $0))}
|
|
8
|
+
[ X"$R" = X ] && { echo '$WMCORE_ROOT not set' 1>&2; exit 1; }
|
|
9
|
+
|
|
10
|
+
[ -x $R/bin/wmc-dist-patch ] || { echo "$R does not appear to be the right place" 1>&2; exit 1; }
|
|
11
|
+
|
|
12
|
+
set -ex
|
|
13
|
+
rm -fr $R/x{lib,bin,python,data,doc}/{*,.??*}
|
|
14
|
+
python setup.py build_system ${1+"$@"}
|
|
15
|
+
python setup.py install_system ${1+"$@"} --patch --prefix=$R
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Script to unpatch the server area. Simply clears out xbin/xlib/xpython
|
|
3
|
+
# so the server will then pick up the files distributed with the RPM.
|
|
4
|
+
|
|
5
|
+
R=${WMCORE_ROOT-$(dirname $(dirname $0))}
|
|
6
|
+
[ X"$R" = X ] && { echo '$WMCORE_ROOT not set' 1>&2; exit 1; }
|
|
7
|
+
[ -x $R/bin/wmc-dist-patch ] || { echo "$R does not appear to be the right place" 1>&2; exit 1; }
|
|
8
|
+
exec rm -fr $R/x{lib,bin,python,data,doc}/{*,.??*}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
## Generated by CouchApp
|
|
2
|
+
|
|
3
|
+
CouchApps are web applications which can be served directly from [CouchDB](http://couchdb.apache.org). This gives them the nice property of replicating just like any other data stored in CouchDB. They are also simple to write as they can use the built-in jQuery libraries and plugins that ship with CouchDB.
|
|
4
|
+
|
|
5
|
+
[More info about CouchApps here.](http://couchapp.org)
|
|
6
|
+
|
|
7
|
+
## Deploying this app
|
|
8
|
+
|
|
9
|
+
Assuming you just cloned this app from git, and you have changed into the app directory in your terminal, you want to push it to your CouchDB with the CouchApp command line tool, like this:
|
|
10
|
+
|
|
11
|
+
couchapp push . http://name:password@hostname:5984/mydatabase
|
|
12
|
+
|
|
13
|
+
If you don't have a password on your CouchDB (admin party) you can do it like this (but it's a bad, idea, set a password):
|
|
14
|
+
|
|
15
|
+
couchapp push . http://hostname:5984/mydatabase
|
|
16
|
+
|
|
17
|
+
If you get sick of typing the URL, you should setup a `.couchapprc` file in the root of your directory. Remember not to check this into version control as it will have passwords in it.
|
|
18
|
+
|
|
19
|
+
The `.couchapprc` file should have contents like this:
|
|
20
|
+
|
|
21
|
+
{
|
|
22
|
+
"env" : {
|
|
23
|
+
"public" : {
|
|
24
|
+
"db" : "http://name:pass@mycouch.couchone.com/mydatabase"
|
|
25
|
+
},
|
|
26
|
+
"default" : {
|
|
27
|
+
"db" : "http://name:pass@localhost:5984/mydatabase"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Now that you have the `.couchapprc` file set up, you can push your app to the CouchDB as simply as:
|
|
33
|
+
|
|
34
|
+
couchapp push
|
|
35
|
+
|
|
36
|
+
This pushes to the `default` as specified. To push to the `public` you'd run:
|
|
37
|
+
|
|
38
|
+
couchapp push public
|
|
39
|
+
|
|
40
|
+
Of course you can continue to add more deployment targets as you see fit, and give them whatever names you like.
|