6 from arvnodeman.computenode import ARVADOS_TIMEFMT
8 from libcloud.compute.base import NodeSize, Node, NodeDriver, NodeState
9 from libcloud.common.exceptions import BaseHTTPError
15 class FakeDriver(NodeDriver):
16 def __init__(self, *args, **kwargs):
17 self.name = "FakeDriver"
19 def list_sizes(self, **kwargs):
20 return [NodeSize("Standard_D3", "Standard_D3", 3500, 200, 0, 0, self),
21 NodeSize("Standard_D4", "Standard_D4", 7000, 400, 0, 0, self)]
23 def list_nodes(self, **kwargs):
26 def create_node(self, name=None,
30 ex_storage_account=None,
32 ex_resource_group=None,
37 global all_nodes, create_calls
39 n = Node(name, name, NodeState.RUNNING, [], [], self, size=size, extra={"tags": ex_tags})
42 ping_url = re.search(r"echo '(.*)' > /var/tmp/arv-node-data/arv-ping-url", ex_customdata).groups(1)[0] + "&instance_id=" + name
44 ping_url = ex_userdata
45 ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
46 ctx.verify_mode = ssl.CERT_NONE
47 f = urllib.urlopen(ping_url, "", context=ctx)
51 def destroy_node(self, cloud_node):
53 all_nodes = [n for n in all_nodes if n.id != cloud_node.id]
56 def get_image(self, img):
59 def ex_create_tags(self, cloud_node, tags):
62 class QuotaDriver(FakeDriver):
63 def create_node(self, name=None,
67 ex_storage_account=None,
69 ex_resource_group=None,
73 global all_nodes, create_calls, quota
74 if len(all_nodes) >= quota:
75 raise BaseHTTPError(503, "Quota exceeded")
77 return super(QuotaDriver, self).create_node(name=name,
81 ex_storage_account=ex_storage_account,
82 ex_customdata=ex_customdata,
83 ex_resource_group=ex_resource_group,
84 ex_user_name=ex_user_name,
86 ex_network=ex_network)
88 def destroy_node(self, cloud_node):
89 global all_nodes, quota
90 all_nodes = [n for n in all_nodes if n.id != cloud_node.id]
91 if len(all_nodes) == 0:
95 class FailingDriver(FakeDriver):
96 def create_node(self, name=None,
100 ex_storage_account=None,
102 ex_resource_group=None,
106 raise Exception("nope")
108 class RetryDriver(FakeDriver):
109 def create_node(self, name=None,
113 ex_storage_account=None,
115 ex_resource_group=None,
122 raise BaseHTTPError(429, "Rate limit exceeded",
123 {'retry-after': '12'})
125 return super(RetryDriver, self).create_node(name=name,
129 ex_storage_account=ex_storage_account,
130 ex_customdata=ex_customdata,
131 ex_resource_group=ex_resource_group,
132 ex_user_name=ex_user_name,
134 ex_network=ex_network)
136 class FakeAwsDriver(FakeDriver):
138 def create_node(self, name=None,
143 ex_blockdevicemappings=None):
144 n = super(FakeAwsDriver, self).create_node(name=name,
148 ex_userdata=ex_userdata)
149 n.extra = {"launch_time": time.strftime(ARVADOS_TIMEFMT, time.gmtime())[:-1]}
152 def list_sizes(self, **kwargs):
153 return [NodeSize("m3.xlarge", "Extra Large Instance", 3500, 80, 0, 0, self),
154 NodeSize("m4.xlarge", "Extra Large Instance", 3500, 0, 0, 0, self),
155 NodeSize("m4.2xlarge", "Double Extra Large Instance", 7000, 0, 0, 0, self)]