diff options
| author | Joshua Harlow <harlowja@yahoo-inc.com> | 2013-10-09 13:03:33 -0700 |
|---|---|---|
| committer | Joshua Harlow <harlowja@yahoo-inc.com> | 2013-10-09 15:56:27 -0700 |
| commit | 4c5cb775904adecfb43757cd0455a18b07b489a1 (patch) | |
| tree | 262203d4ec6f8b850cea8a569f3302e7190fb8ca /taskflow/examples | |
| parent | ce7e2ad38e9c136d5c2b43db8744e62605dd777c (diff) | |
| download | taskflow-4c5cb775904adecfb43757cd0455a18b07b489a1.tar.gz | |
Add a secondary booting vm example
This one uses rebinds to make simultaneous vms using
a parallel engine to run the non-dependent tasks at
the same time (the 2 vms are created at the same time).
Change-Id: I795fa279d777e7a54e7ef34bf88021600c70a506
Diffstat (limited to 'taskflow/examples')
| -rw-r--r-- | taskflow/examples/fake_boot_vm2.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/taskflow/examples/fake_boot_vm2.py b/taskflow/examples/fake_boot_vm2.py new file mode 100644 index 0000000..63d3e47 --- /dev/null +++ b/taskflow/examples/fake_boot_vm2.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (C) 2012-2013 Yahoo! Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging +import os +import random +import sys + +logging.basicConfig(level=logging.ERROR) + +top_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir, + os.pardir)) +sys.path.insert(0, top_dir) + +from taskflow.patterns import graph_flow as gf +from taskflow.patterns import linear_flow as lf + +from taskflow import engines +from taskflow import task + + +class PrintText(task.Task): + def __init__(self, print_what): + super(PrintText, self).__init__(name="Print: %s" % print_what) + self._text = print_what + + def execute(self): + print("-" * (len(self._text))) + print(self._text) + print("-" * (len(self._text))) + + +class AllocateIP(task.Task): + def execute(self): + return "192.168.0.%s" % (random.randint(1, 254)) + + +class AllocateVolumes(task.Task): + def execute(self): + volumes = [] + for i in range(0, random.randint(0, 10)): + volumes.append("/dev/vda%s" % (i + 1)) + return volumes + + +class CreateVM(task.Task): + def execute(self, net_ip, volumes): + print("Making vm %s using ip %s" % (self.name, net_ip)) + if volumes: + print("With volumes:") + for v in volumes: + print(" - %s" % (v)) + + +flow = lf.Flow("root").add( + PrintText("Starting"), + gf.Flow('maker').add( + # First vm creation + AllocateVolumes("volumes-1", provides='volumes_1'), + AllocateIP("ip-1", provides='net_ip1'), + CreateVM("vm-1", rebind=['net_ip1', 'volumes_1']), + # Second vm creation + AllocateVolumes("volumes-2", provides='volumes_2'), + AllocateIP("ip-2", provides='net_ip2'), + CreateVM("vm-2", rebind=['net_ip2', 'volumes_2']) + ), + PrintText("Finished")) + + +# The above vms will be created in parallel, dependencies will be ran in order +# so that means the ip and volume creation for each vm will run before the +# final vm creation is done, but both vm creates will run at the same time. +# +# Pretty cool! +engines.run(flow, engine_conf='parallel') |
