6 from arvnodeman.computenode import ARVADOS_TIMEFMT
8 from libcloud.compute.base import NodeSize, Node, NodeDriver, NodeState, NodeImage
9 from libcloud.compute.drivers.gce import GCEDiskType
10 from libcloud.common.exceptions import BaseHTTPError
16 class FakeDriver(NodeDriver):
17 def __init__(self, *args, **kwargs):
18 self.name = "FakeDriver"
20 def list_sizes(self, **kwargs):
21 return [NodeSize("Standard_D3", "Standard_D3", 3500, 200, 0, 0, self),
22 NodeSize("Standard_D4", "Standard_D4", 7000, 400, 0, 0, self)]
24 def list_nodes(self, **kwargs):
27 def create_node(self, name=None,
31 ex_storage_account=None,
33 ex_resource_group=None,
39 global all_nodes, create_calls
41 nodeid = "node%i" % create_calls
42 n = Node(nodeid, nodeid, NodeState.RUNNING, [], [], self, size=size, extra={"tags": ex_tags})
45 ping_url = re.search(r"echo '(.*)' > /var/tmp/arv-node-data/arv-ping-url", ex_customdata).groups(1)[0]
47 ping_url = ex_userdata
49 ping_url = ex_metadata["arv-ping-url"]
50 ping_url += "&instance_id=" + nodeid
51 ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
52 ctx.verify_mode = ssl.CERT_NONE
53 f = urllib.urlopen(ping_url, "", context=ctx)
57 def destroy_node(self, cloud_node):
59 all_nodes = [n for n in all_nodes if n.id != cloud_node.id]
62 def get_image(self, img):
65 def ex_create_tags(self, cloud_node, tags):
68 class QuotaDriver(FakeDriver):
69 def create_node(self, name=None,
73 ex_storage_account=None,
75 ex_resource_group=None,
79 global all_nodes, create_calls, quota
80 if len(all_nodes) >= quota:
81 raise BaseHTTPError(503, "Quota exceeded")
83 return super(QuotaDriver, self).create_node(name=name,
87 ex_storage_account=ex_storage_account,
88 ex_customdata=ex_customdata,
89 ex_resource_group=ex_resource_group,
90 ex_user_name=ex_user_name,
92 ex_network=ex_network)
94 def destroy_node(self, cloud_node):
95 global all_nodes, quota
96 all_nodes = [n for n in all_nodes if n.id != cloud_node.id]
97 if len(all_nodes) == 0:
101 class FailingDriver(FakeDriver):
102 def create_node(self, name=None,
106 ex_storage_account=None,
108 ex_resource_group=None,
112 raise Exception("nope")
114 class RetryDriver(FakeDriver):
115 def create_node(self, name=None,
119 ex_storage_account=None,
121 ex_resource_group=None,
128 raise BaseHTTPError(429, "Rate limit exceeded",
129 {'retry-after': '12'})
131 return super(RetryDriver, self).create_node(name=name,
135 ex_storage_account=ex_storage_account,
136 ex_customdata=ex_customdata,
137 ex_resource_group=ex_resource_group,
138 ex_user_name=ex_user_name,
140 ex_network=ex_network)
142 class FakeAwsDriver(FakeDriver):
144 def create_node(self, name=None,
149 ex_blockdevicemappings=None):
150 n = super(FakeAwsDriver, self).create_node(name=name,
154 ex_userdata=ex_userdata)
155 n.extra = {"launch_time": time.strftime(ARVADOS_TIMEFMT, time.gmtime())[:-1]}
158 def list_sizes(self, **kwargs):
159 return [NodeSize("m3.xlarge", "Extra Large Instance", 3500, 80, 0, 0, self),
160 NodeSize("m4.xlarge", "Extra Large Instance", 3500, 0, 0, 0, self),
161 NodeSize("m4.2xlarge", "Double Extra Large Instance", 7000, 0, 0, 0, self)]
164 class FakeGceDriver(FakeDriver):
166 def create_node(self, name=None,
173 ex_disks_gce_struct=None):
174 n = super(FakeGceDriver, self).create_node(name=name,
178 ex_metadata=ex_metadata)
181 "items": [{"key": k, "value": v} for k,v in ex_metadata.iteritems()]
187 def list_images(self, ex_project=None):
188 return [NodeImage("fake_image_id", "fake_image_id", self)]
190 def list_sizes(self, **kwargs):
191 return [NodeSize("n1-standard-1", "Standard", 3750, None, 0, 0, self),
192 NodeSize("n1-standard-2", "Double standard", 7500, None, 0, 0, self)]
194 def ex_list_disktypes(self, zone=None):
195 return [GCEDiskType("pd-standard", "pd-standard", zone, self,
196 extra={"selfLink": "pd-standard"}),
197 GCEDiskType("local-ssd", "local-ssd", zone, self,
198 extra={"selfLink": "local-ssd"})]
200 def ex_get_node(self, name, zone=None):
207 def ex_set_node_metadata(self, n, items):
208 n.extra["metadata"]["items"] = items