Best Python code snippet using yandex-tank
task.js
Source:task.js
1/**2 * Support for concurrent task management and synchronization in web3 * applications.4 *5 * @author Dave Longley6 * @author David I. Lehn <dlehn@digitalbazaar.com>7 *8 * Copyright (c) 2009-2013 Digital Bazaar, Inc.9 */10var forge = require('./forge');11require('./debug');12require('./log');13require('./util');14// logging category15var cat = 'forge.task';16// verbose level17// 0: off, 1: a little, 2: a whole lot18// Verbose debug logging is surrounded by a level check to avoid the19// performance issues with even calling the logging code regardless if it20// is actually logged. For performance reasons this should not be set to 221// for production use.22// ex: if(sVL >= 2) forge.log.verbose(....)23var sVL = 0;24// track tasks for debugging25var sTasks = {};26var sNextTaskId = 0;27// debug access28forge.debug.set(cat, 'tasks', sTasks);29// a map of task type to task queue30var sTaskQueues = {};31// debug access32forge.debug.set(cat, 'queues', sTaskQueues);33// name for unnamed tasks34var sNoTaskName = '?';35// maximum number of doNext() recursions before a context swap occurs36// FIXME: might need to tweak this based on the browser37var sMaxRecursions = 30;38// time slice for doing tasks before a context swap occurs39// FIXME: might need to tweak this based on the browser40var sTimeSlice = 20;41/**42 * Task states.43 *44 * READY: ready to start processing45 * RUNNING: task or a subtask is running46 * BLOCKED: task is waiting to acquire N permits to continue47 * SLEEPING: task is sleeping for a period of time48 * DONE: task is done49 * ERROR: task has an error50 */51var READY = 'ready';52var RUNNING = 'running';53var BLOCKED = 'blocked';54var SLEEPING = 'sleeping';55var DONE = 'done';56var ERROR = 'error';57/**58 * Task actions. Used to control state transitions.59 *60 * STOP: stop processing61 * START: start processing tasks62 * BLOCK: block task from continuing until 1 or more permits are released63 * UNBLOCK: release one or more permits64 * SLEEP: sleep for a period of time65 * WAKEUP: wakeup early from SLEEPING state66 * CANCEL: cancel further tasks67 * FAIL: a failure occured68 */69var STOP = 'stop';70var START = 'start';71var BLOCK = 'block';72var UNBLOCK = 'unblock';73var SLEEP = 'sleep';74var WAKEUP = 'wakeup';75var CANCEL = 'cancel';76var FAIL = 'fail';77/**78 * State transition table.79 *80 * nextState = sStateTable[currentState][action]81 */82var sStateTable = {};83sStateTable[READY] = {};84sStateTable[READY][STOP] = READY;85sStateTable[READY][START] = RUNNING;86sStateTable[READY][CANCEL] = DONE;87sStateTable[READY][FAIL] = ERROR;88sStateTable[RUNNING] = {};89sStateTable[RUNNING][STOP] = READY;90sStateTable[RUNNING][START] = RUNNING;91sStateTable[RUNNING][BLOCK] = BLOCKED;92sStateTable[RUNNING][UNBLOCK] = RUNNING;93sStateTable[RUNNING][SLEEP] = SLEEPING;94sStateTable[RUNNING][WAKEUP] = RUNNING;95sStateTable[RUNNING][CANCEL] = DONE;96sStateTable[RUNNING][FAIL] = ERROR;97sStateTable[BLOCKED] = {};98sStateTable[BLOCKED][STOP] = BLOCKED;99sStateTable[BLOCKED][START] = BLOCKED;100sStateTable[BLOCKED][BLOCK] = BLOCKED;101sStateTable[BLOCKED][UNBLOCK] = BLOCKED;102sStateTable[BLOCKED][SLEEP] = BLOCKED;103sStateTable[BLOCKED][WAKEUP] = BLOCKED;104sStateTable[BLOCKED][CANCEL] = DONE;105sStateTable[BLOCKED][FAIL] = ERROR;106sStateTable[SLEEPING] = {};107sStateTable[SLEEPING][STOP] = SLEEPING;108sStateTable[SLEEPING][START] = SLEEPING;109sStateTable[SLEEPING][BLOCK] = SLEEPING;110sStateTable[SLEEPING][UNBLOCK] = SLEEPING;111sStateTable[SLEEPING][SLEEP] = SLEEPING;112sStateTable[SLEEPING][WAKEUP] = SLEEPING;113sStateTable[SLEEPING][CANCEL] = DONE;114sStateTable[SLEEPING][FAIL] = ERROR;115sStateTable[DONE] = {};116sStateTable[DONE][STOP] = DONE;117sStateTable[DONE][START] = DONE;118sStateTable[DONE][BLOCK] = DONE;119sStateTable[DONE][UNBLOCK] = DONE;120sStateTable[DONE][SLEEP] = DONE;121sStateTable[DONE][WAKEUP] = DONE;122sStateTable[DONE][CANCEL] = DONE;123sStateTable[DONE][FAIL] = ERROR;124sStateTable[ERROR] = {};125sStateTable[ERROR][STOP] = ERROR;126sStateTable[ERROR][START] = ERROR;127sStateTable[ERROR][BLOCK] = ERROR;128sStateTable[ERROR][UNBLOCK] = ERROR;129sStateTable[ERROR][SLEEP] = ERROR;130sStateTable[ERROR][WAKEUP] = ERROR;131sStateTable[ERROR][CANCEL] = ERROR;132sStateTable[ERROR][FAIL] = ERROR;133/**134 * Creates a new task.135 *136 * @param options options for this task137 * run: the run function for the task (required)138 * name: the run function for the task (optional)139 * parent: parent of this task (optional)140 *141 * @return the empty task.142 */143var Task = function(options) {144 // task id145 this.id = -1;146 // task name147 this.name = options.name || sNoTaskName;148 // task has no parent149 this.parent = options.parent || null;150 // save run function151 this.run = options.run;152 // create a queue of subtasks to run153 this.subtasks = [];154 // error flag155 this.error = false;156 // state of the task157 this.state = READY;158 // number of times the task has been blocked (also the number159 // of permits needed to be released to continue running)160 this.blocks = 0;161 // timeout id when sleeping162 this.timeoutId = null;163 // no swap time yet164 this.swapTime = null;165 // no user data166 this.userData = null;167 // initialize task168 // FIXME: deal with overflow169 this.id = sNextTaskId++;170 sTasks[this.id] = this;171 if(sVL >= 1) {172 forge.log.verbose(cat, '[%s][%s] init', this.id, this.name, this);173 }174};175/**176 * Logs debug information on this task and the system state.177 */178Task.prototype.debug = function(msg) {179 msg = msg || '';180 forge.log.debug(cat, msg,181 '[%s][%s] task:', this.id, this.name, this,182 'subtasks:', this.subtasks.length,183 'queue:', sTaskQueues);184};185/**186 * Adds a subtask to run after task.doNext() or task.fail() is called.187 *188 * @param name human readable name for this task (optional).189 * @param subrun a function to run that takes the current task as190 * its first parameter.191 *192 * @return the current task (useful for chaining next() calls).193 */194Task.prototype.next = function(name, subrun) {195 // juggle parameters if it looks like no name is given196 if(typeof(name) === 'function') {197 subrun = name;198 // inherit parent's name199 name = this.name;200 }201 // create subtask, set parent to this task, propagate callbacks202 var subtask = new Task({203 run: subrun,204 name: name,205 parent: this206 });207 // start subtasks running208 subtask.state = RUNNING;209 subtask.type = this.type;210 subtask.successCallback = this.successCallback || null;211 subtask.failureCallback = this.failureCallback || null;212 // queue a new subtask213 this.subtasks.push(subtask);214 return this;215};216/**217 * Adds subtasks to run in parallel after task.doNext() or task.fail()218 * is called.219 *220 * @param name human readable name for this task (optional).221 * @param subrun functions to run that take the current task as222 * their first parameter.223 *224 * @return the current task (useful for chaining next() calls).225 */226Task.prototype.parallel = function(name, subrun) {227 // juggle parameters if it looks like no name is given228 if(forge.util.isArray(name)) {229 subrun = name;230 // inherit parent's name231 name = this.name;232 }233 // Wrap parallel tasks in a regular task so they are started at the234 // proper time.235 return this.next(name, function(task) {236 // block waiting for subtasks237 var ptask = task;238 ptask.block(subrun.length);239 // we pass the iterator from the loop below as a parameter240 // to a function because it is otherwise included in the241 // closure and changes as the loop changes -- causing i242 // to always be set to its highest value243 var startParallelTask = function(pname, pi) {244 forge.task.start({245 type: pname,246 run: function(task) {247 subrun[pi](task);248 },249 success: function(task) {250 ptask.unblock();251 },252 failure: function(task) {253 ptask.unblock();254 }255 });256 };257 for(var i = 0; i < subrun.length; i++) {258 // Type must be unique so task starts in parallel:259 // name + private string + task id + sub-task index260 // start tasks in parallel and unblock when the finish261 var pname = name + '__parallel-' + task.id + '-' + i;262 var pi = i;263 startParallelTask(pname, pi);264 }265 });266};267/**268 * Stops a running task.269 */270Task.prototype.stop = function() {271 this.state = sStateTable[this.state][STOP];272};273/**274 * Starts running a task.275 */276Task.prototype.start = function() {277 this.error = false;278 this.state = sStateTable[this.state][START];279 // try to restart280 if(this.state === RUNNING) {281 this.start = new Date();282 this.run(this);283 runNext(this, 0);284 }285};286/**287 * Blocks a task until it one or more permits have been released. The288 * task will not resume until the requested number of permits have289 * been released with call(s) to unblock().290 *291 * @param n number of permits to wait for(default: 1).292 */293Task.prototype.block = function(n) {294 n = typeof(n) === 'undefined' ? 1 : n;295 this.blocks += n;296 if(this.blocks > 0) {297 this.state = sStateTable[this.state][BLOCK];298 }299};300/**301 * Releases a permit to unblock a task. If a task was blocked by302 * requesting N permits via block(), then it will only continue303 * running once enough permits have been released via unblock() calls.304 *305 * If multiple processes need to synchronize with a single task then306 * use a condition variable (see forge.task.createCondition). It is307 * an error to unblock a task more times than it has been blocked.308 *309 * @param n number of permits to release (default: 1).310 *311 * @return the current block count (task is unblocked when count is 0)312 */313Task.prototype.unblock = function(n) {314 n = typeof(n) === 'undefined' ? 1 : n;315 this.blocks -= n;316 if(this.blocks === 0 && this.state !== DONE) {317 this.state = RUNNING;318 runNext(this, 0);319 }320 return this.blocks;321};322/**323 * Sleep for a period of time before resuming tasks.324 *325 * @param n number of milliseconds to sleep (default: 0).326 */327Task.prototype.sleep = function(n) {328 n = typeof(n) === 'undefined' ? 0 : n;329 this.state = sStateTable[this.state][SLEEP];330 var self = this;331 this.timeoutId = setTimeout(function() {332 self.timeoutId = null;333 self.state = RUNNING;334 runNext(self, 0);335 }, n);336};337/**338 * Waits on a condition variable until notified. The next task will339 * not be scheduled until notification. A condition variable can be340 * created with forge.task.createCondition().341 *342 * Once cond.notify() is called, the task will continue.343 *344 * @param cond the condition variable to wait on.345 */346Task.prototype.wait = function(cond) {347 cond.wait(this);348};349/**350 * If sleeping, wakeup and continue running tasks.351 */352Task.prototype.wakeup = function() {353 if(this.state === SLEEPING) {354 cancelTimeout(this.timeoutId);355 this.timeoutId = null;356 this.state = RUNNING;357 runNext(this, 0);358 }359};360/**361 * Cancel all remaining subtasks of this task.362 */363Task.prototype.cancel = function() {364 this.state = sStateTable[this.state][CANCEL];365 // remove permits needed366 this.permitsNeeded = 0;367 // cancel timeouts368 if(this.timeoutId !== null) {369 cancelTimeout(this.timeoutId);370 this.timeoutId = null;371 }372 // remove subtasks373 this.subtasks = [];374};375/**376 * Finishes this task with failure and sets error flag. The entire377 * task will be aborted unless the next task that should execute378 * is passed as a parameter. This allows levels of subtasks to be379 * skipped. For instance, to abort only this tasks's subtasks, then380 * call fail(task.parent). To abort this task's subtasks and its381 * parent's subtasks, call fail(task.parent.parent). To abort382 * all tasks and simply call the task callback, call fail() or383 * fail(null).384 *385 * The task callback (success or failure) will always, eventually, be386 * called.387 *388 * @param next the task to continue at, or null to abort entirely.389 */390Task.prototype.fail = function(next) {391 // set error flag392 this.error = true;393 // finish task394 finish(this, true);395 if(next) {396 // propagate task info397 next.error = this.error;398 next.swapTime = this.swapTime;399 next.userData = this.userData;400 // do next task as specified401 runNext(next, 0);402 } else {403 if(this.parent !== null) {404 // finish root task (ensures it is removed from task queue)405 var parent = this.parent;406 while(parent.parent !== null) {407 // propagate task info408 parent.error = this.error;409 parent.swapTime = this.swapTime;410 parent.userData = this.userData;411 parent = parent.parent;412 }413 finish(parent, true);414 }415 // call failure callback if one exists416 if(this.failureCallback) {417 this.failureCallback(this);418 }419 }420};421/**422 * Asynchronously start a task.423 *424 * @param task the task to start.425 */426var start = function(task) {427 task.error = false;428 task.state = sStateTable[task.state][START];429 setTimeout(function() {430 if(task.state === RUNNING) {431 task.swapTime = +new Date();432 task.run(task);433 runNext(task, 0);434 }435 }, 0);436};437/**438 * Run the next subtask or finish this task.439 *440 * @param task the task to process.441 * @param recurse the recursion count.442 */443var runNext = function(task, recurse) {444 // get time since last context swap (ms), if enough time has passed set445 // swap to true to indicate that doNext was performed asynchronously446 // also, if recurse is too high do asynchronously447 var swap =448 (recurse > sMaxRecursions) ||449 (+new Date() - task.swapTime) > sTimeSlice;450 var doNext = function(recurse) {451 recurse++;452 if(task.state === RUNNING) {453 if(swap) {454 // update swap time455 task.swapTime = +new Date();456 }457 if(task.subtasks.length > 0) {458 // run next subtask459 var subtask = task.subtasks.shift();460 subtask.error = task.error;461 subtask.swapTime = task.swapTime;462 subtask.userData = task.userData;463 subtask.run(subtask);464 if(!subtask.error) {465 runNext(subtask, recurse);466 }467 } else {468 finish(task);469 if(!task.error) {470 // chain back up and run parent471 if(task.parent !== null) {472 // propagate task info473 task.parent.error = task.error;474 task.parent.swapTime = task.swapTime;475 task.parent.userData = task.userData;476 // no subtasks left, call run next subtask on parent477 runNext(task.parent, recurse);478 }479 }480 }481 }482 };483 if(swap) {484 // we're swapping, so run asynchronously485 setTimeout(doNext, 0);486 } else {487 // not swapping, so run synchronously488 doNext(recurse);489 }490};491/**492 * Finishes a task and looks for the next task in the queue to start.493 *494 * @param task the task to finish.495 * @param suppressCallbacks true to suppress callbacks.496 */497var finish = function(task, suppressCallbacks) {498 // subtask is now done499 task.state = DONE;500 delete sTasks[task.id];501 if(sVL >= 1) {502 forge.log.verbose(cat, '[%s][%s] finish',503 task.id, task.name, task);504 }505 // only do queue processing for root tasks506 if(task.parent === null) {507 // report error if queue is missing508 if(!(task.type in sTaskQueues)) {509 forge.log.error(cat,510 '[%s][%s] task queue missing [%s]',511 task.id, task.name, task.type);512 } else if(sTaskQueues[task.type].length === 0) {513 // report error if queue is empty514 forge.log.error(cat,515 '[%s][%s] task queue empty [%s]',516 task.id, task.name, task.type);517 } else if(sTaskQueues[task.type][0] !== task) {518 // report error if this task isn't the first in the queue519 forge.log.error(cat,520 '[%s][%s] task not first in queue [%s]',521 task.id, task.name, task.type);522 } else {523 // remove ourselves from the queue524 sTaskQueues[task.type].shift();525 // clean up queue if it is empty526 if(sTaskQueues[task.type].length === 0) {527 if(sVL >= 1) {528 forge.log.verbose(cat, '[%s][%s] delete queue [%s]',529 task.id, task.name, task.type);530 }531 /* Note: Only a task can delete a queue of its own type. This532 is used as a way to synchronize tasks. If a queue for a certain533 task type exists, then a task of that type is running.534 */535 delete sTaskQueues[task.type];536 } else {537 // dequeue the next task and start it538 if(sVL >= 1) {539 forge.log.verbose(cat,540 '[%s][%s] queue start next [%s] remain:%s',541 task.id, task.name, task.type,542 sTaskQueues[task.type].length);543 }544 sTaskQueues[task.type][0].start();545 }546 }547 if(!suppressCallbacks) {548 // call final callback if one exists549 if(task.error && task.failureCallback) {550 task.failureCallback(task);551 } else if(!task.error && task.successCallback) {552 task.successCallback(task);553 }554 }555 }556};557/* Tasks API */558module.exports = forge.task = forge.task || {};559/**560 * Starts a new task that will run the passed function asynchronously.561 *562 * In order to finish the task, either task.doNext() or task.fail()563 * *must* be called.564 *565 * The task must have a type (a string identifier) that can be used to566 * synchronize it with other tasks of the same type. That type can also567 * be used to cancel tasks that haven't started yet.568 *569 * To start a task, the following object must be provided as a parameter570 * (each function takes a task object as its first parameter):571 *572 * {573 * type: the type of task.574 * run: the function to run to execute the task.575 * success: a callback to call when the task succeeds (optional).576 * failure: a callback to call when the task fails (optional).577 * }578 *579 * @param options the object as described above.580 */581forge.task.start = function(options) {582 // create a new task583 var task = new Task({584 run: options.run,585 name: options.name || sNoTaskName586 });587 task.type = options.type;588 task.successCallback = options.success || null;589 task.failureCallback = options.failure || null;590 // append the task onto the appropriate queue591 if(!(task.type in sTaskQueues)) {592 if(sVL >= 1) {593 forge.log.verbose(cat, '[%s][%s] create queue [%s]',594 task.id, task.name, task.type);595 }596 // create the queue with the new task597 sTaskQueues[task.type] = [task];598 start(task);599 } else {600 // push the task onto the queue, it will be run after a task601 // with the same type completes602 sTaskQueues[options.type].push(task);603 }604};605/**606 * Cancels all tasks of the given type that haven't started yet.607 *608 * @param type the type of task to cancel.609 */610forge.task.cancel = function(type) {611 // find the task queue612 if(type in sTaskQueues) {613 // empty all but the current task from the queue614 sTaskQueues[type] = [sTaskQueues[type][0]];615 }616};617/**618 * Creates a condition variable to synchronize tasks. To make a task wait619 * on the condition variable, call task.wait(condition). To notify all620 * tasks that are waiting, call condition.notify().621 *622 * @return the condition variable.623 */624forge.task.createCondition = function() {625 var cond = {626 // all tasks that are blocked627 tasks: {}628 };629 /**630 * Causes the given task to block until notify is called. If the task631 * is already waiting on this condition then this is a no-op.632 *633 * @param task the task to cause to wait.634 */635 cond.wait = function(task) {636 // only block once637 if(!(task.id in cond.tasks)) {638 task.block();639 cond.tasks[task.id] = task;640 }641 };642 /**643 * Notifies all waiting tasks to wake up.644 */645 cond.notify = function() {646 // since unblock() will run the next task from here, make sure to647 // clear the condition's blocked task list before unblocking648 var tmp = cond.tasks;649 cond.tasks = {};650 for(var id in tmp) {651 tmp[id].unblock();652 }653 };654 return cond;...
test_play_iterator.py
Source:test_play_iterator.py
...137 )138 # lookup up an original task139 target_task = p._entries[0].tasks[0].block[0]140 task_copy = target_task.copy(exclude_parent=True)141 found_task = itr.get_original_task(hosts[0], task_copy)142 self.assertEqual(target_task, found_task)143 bad_task = Task()144 found_task = itr.get_original_task(hosts[0], bad_task)145 self.assertIsNone(found_task)146 # pre task147 (host_state, task) = itr.get_next_task_for_host(hosts[0])148 self.assertIsNotNone(task)149 self.assertEqual(task.action, 'debug')150 # implicit meta: flush_handlers151 (host_state, task) = itr.get_next_task_for_host(hosts[0])152 self.assertIsNotNone(task)153 self.assertEqual(task.action, 'meta')154 # role task155 (host_state, task) = itr.get_next_task_for_host(hosts[0])156 self.assertIsNotNone(task)157 self.assertEqual(task.action, 'debug')158 self.assertEqual(task.name, "role task")...
ecs_task.py
Source:ecs_task.py
...184 for c in response['taskArns']:185 if c.endswith(service_name):186 return c187 return None188 def run_task(self, cluster, task_definition, overrides, count, startedBy):189 if overrides is None:190 overrides = dict()191 response = self.ecs.run_task(192 cluster=cluster,193 taskDefinition=task_definition,194 overrides=overrides,195 count=count,196 startedBy=startedBy)197 # include tasks and failures198 return response['tasks']199 def start_task(self, cluster, task_definition, overrides, container_instances, startedBy):200 args = dict()201 if cluster:202 args['cluster'] = cluster203 if task_definition:204 args['taskDefinition']=task_definition205 if overrides:206 args['overrides']=overrides207 if container_instances:208 args['containerInstances']=container_instances209 if startedBy:210 args['startedBy']=startedBy211 response = self.ecs.start_task(**args)212 # include tasks and failures213 return response['tasks']214 def stop_task(self, cluster, task):215 response = self.ecs.stop_task(cluster=cluster, task=task)216 return response['task']217def main():218 argument_spec = ec2_argument_spec()219 argument_spec.update(dict(220 operation=dict(required=True, choices=['run', 'start', 'stop'] ),221 cluster=dict(required=False, type='str' ), # R S P222 task_definition=dict(required=False, type='str' ), # R* S*223 overrides=dict(required=False, type='dict'), # R S224 count=dict(required=False, type='int' ), # R225 task=dict(required=False, type='str' ), # P*226 container_instances=dict(required=False, type='list'), # S*227 started_by=dict(required=False, type='str' ) # R S228 ))229 module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)230 # Validate Requirements231 if not HAS_BOTO:232 module.fail_json(msg='boto is required.')233 if not HAS_BOTO3:234 module.fail_json(msg='boto3 is required.')235 # Validate Inputs236 if module.params['operation'] == 'run':237 if not 'task_definition' in module.params and module.params['task_definition'] is None:238 module.fail_json(msg="To run a task, a task_definition must be specified")239 task_to_list = module.params['task_definition']240 status_type = "RUNNING"241 if module.params['operation'] == 'start':242 if not 'task_definition' in module.params and module.params['task_definition'] is None:243 module.fail_json(msg="To start a task, a task_definition must be specified")244 if not 'container_instances' in module.params and module.params['container_instances'] is None:245 module.fail_json(msg="To start a task, container instances must be specified")246 task_to_list = module.params['task']247 status_type = "RUNNING"248 if module.params['operation'] == 'stop':249 if not 'task' in module.params and module.params['task'] is None:250 module.fail_json(msg="To stop a task, a task must be specified")251 if not 'task_definition' in module.params and module.params['task_definition'] is None:252 module.fail_json(msg="To stop a task, a task definition must be specified")253 task_to_list = module.params['task_definition']254 status_type = "STOPPED"255 service_mgr = EcsExecManager(module)256 existing = service_mgr.list_tasks(module.params['cluster'], task_to_list, status_type)257 results = dict(changed=False)258 if module.params['operation'] == 'run':259 if existing:260 # TBD - validate the rest of the details261 results['task']=existing262 else:263 if not module.check_mode:264 results['task'] = service_mgr.run_task(265 module.params['cluster'],266 module.params['task_definition'],267 module.params['overrides'],268 module.params['count'],269 module.params['started_by'])270 results['changed'] = True271 elif module.params['operation'] == 'start':272 if existing:273 # TBD - validate the rest of the details274 results['task']=existing275 else:276 if not module.check_mode:277 results['task'] = service_mgr.start_task(278 module.params['cluster'],279 module.params['task_definition'],280 module.params['overrides'],281 module.params['container_instances'],282 module.params['started_by']283 )284 results['changed'] = True285 elif module.params['operation'] == 'stop':286 if existing:287 results['task']=existing288 else:289 if not module.check_mode:290 # it exists, so we should delete it and mark changed.291 # return info about the cluster deleted292 results['task'] = service_mgr.stop_task(293 module.params['cluster'],294 module.params['task']295 )296 results['changed'] = True297 module.exit_json(**results)298if __name__ == '__main__':...
test_tasks.py
Source:test_tasks.py
...102 rollout.save()103 rollouts[cls][sigs] = rollout104 rollout_ids[cls][sigs] = rollout.id105 if cls is DelayTask:106 task = create_task(rollout, DelayTask, seconds=15)107 tasks[cls][sigs] = task108 else:109 t1, t2, t3 = [create_task(rollout, DelayTask, seconds=15) for _ in range(3)]110 task = create_task(rollout, cls, [t1, t2, t3])111 tasks[cls][sigs] = t3112 for cls in classes:113 for sigs in signals:114 rollout = rollouts[cls][sigs]115 rollout.rollout_async()116 # Enough time for rollouts to start117 time.sleep(0.5)118 for cls in classes:119 for sigs in signals:120 id = rollout_ids[cls][sigs]121 for sig in sigs:122 self.assertTrue(Rollout._can_signal(id, sig))123 self.assertTrue(Rollout._do_signal(id, sig))124 self.assertTrue(Rollout._is_signalling(id, sig))...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!